一、前期基础知识储备
(1)adb命令行的定义与作用
adb的全称为Android Debug Bridge,中文名“调试桥”,顾名思义adb命令是调试手机中应用的一种方法,而且作为Android SDK中的工具,其功能非常强大,用这个命令行工具可以直接操作管理调试中的Android模拟器或者真机调试中的设备,它的主要功能列举如下:
- 运行设备的shell(多种命令行),进行各种操作;
- 管理模拟器或移动设备的端口映射;
- 计算机和设备之间的文件传入/传出;
- 将本地apk软件安装在模拟器或移动设备中……
(2)adb命令行的运行位置
Windows下使用Android Studio开发的同学可以在两个位置运行adb命令:
1)Android Studio自带的Terminal窗口;(注意自配环境变量,否则无效)
比如,进入一个文件夹
配置adb运行环境变量的方法:《如何配置android的adb环境变量》-简单 易懂;
配置JDK运行环境变量的方法:《JDK的下载安装以及配置》-注意输入“java” “javac” “java -version” 进行验证。
2)Windows下使用cmd黑窗口;(注意自配环境变量,否则无效)
(使用cmd窗口时,配置环境变量的方法同上)
二、上代码,进行具体的adb命令操作
(1)执行adb devices 命令,我们可以看到当前电脑正在连接调试的手机;
(2)执行adb shell命令查看设备里面的文件目录和文件;
注意:adb shell,这个命令用于登录设备的shell,后面加直接运行设备命令,相当于执行远程命令,如“ls”列出目录下的文件和文件夹。
(3)执行进入目录操作,进入mnt目录下的sdcard目录;
该sdcard目录下就是我们手机上重要的sdcard目录,里面有各种重要的存储文件;
(4)执行exit命令 回车 退出文件夹目录;
(5)执行push命令,将电脑端文件复制到手机中指定文件夹中去;
注意:复制的文件源需放置在C:\Users\Administrator目录下,命令行可直接读取;
(6)执行pull命令,将手机移动端文件复制到电脑C:\Users\Administrator目录下;
(6)adb version,查看adb版本;
注:接下来的用Android Studio Terminal窗口演示adb命令行的使用。
(7)adb shell dumpsys package <package_name>,查看app相关所有信息,包括action,codepath,version,需要的权限等等信息;
(8)列出移动设备中所有的应用;
adb shell pm list package — 列出所有的应用;
adb shell pm list package –s — 列出系统应用;
adb shell pm list package -3 — 列出所有第三方应用;
adb shell pm list package –f — 列出应用包名及对应的apk名及存放位置;
adb shell pm list package –I — 列出应用包名及其安装来源;
adb shell pm list package -f -3 -i douyu 参数组合使用,如查找斗鱼的包名;
(8)adb shell wm size,获取屏幕的分辨率;
(9)adb shell am start -n com.android.camera/.Camera启动手机自带相机;
三、Android开发中常用的adb操作 - 大大提升开发便捷性
上面列出的是adb命令是适用性的基础操作,下面推荐一些Android开发中便捷的adb命令。
(1)安装apk
apk放在电脑桌面上,输入adb install C:\Users\Administrator\Desktop\clip.apk
小鹏新电脑安装:adb install C:\Users\Xpeng\Desktop\e1.apk
覆盖当前版本安装,输入adb install -r C:\Users\Administrator\Desktop\clip.apk
过滤安装某个ABI的apk:将apk放在SDK目录下的platform-tools的目录下,与adb.exe一个目录
输入:adb install --abi arm64-v8a pencil.apk,比如安装64位的apk。
(1.0.1)命令行卸载不了 / release debug混装 / 版本down这些情况直接使用强制安装apk的命令:
在app已有的情况下使用-r参数
在app版本低于现有版本使用-d参数
adb install -r -d C:\Users\Xpeng\Desktop\e1.apk
(1.1)解压小鹏 - xp文件
将jar文件一起放在桌面上,然后在AS的黑窗口中执行下面的方法即可,这样可以得到一份zip文件(xp文件同目录),解压缩后,去到
Log\log0\main.txt文件下查找即可,里面的Log信息和AS中打印的log信息一一对应。
java -jar C:/Users/Xpeng/Desktop/decryptFile.jar F:/Xpeng-Downloads/XpengFile_20210430174418.xp
(1.2)重启终端,若是没有上电/下电按钮,则执行
adb reboot命令行可以重启终端。
(1.3)命令行截图,然后保存到本地;
分为两步:
①使用screencap 命令,对安卓设备的当前屏幕进行截屏:
adb shell screencap -p /sdcard/01.png
②将截屏的图片下载到本地电脑:
adb pull /sdcard/01.png
另外,需要注意的一点,如果使用了360桌面整理这一类的整理软件,那么desktop的位置会发生变化,如博主的变为:adb install -r F:\360MoveData\Users\Administrator\Desktop\1.6.apk
补充几个当项目编译失败时,可以执行的命令行,用以确认错误的源头:
gradlew build --stacktrace
gradlew compileDebug --stacktrace
gradlew compileDebugJavaWithJavac
gradlew processDebugResources --debug
(2)获取当前Activity名和包名
adb shell dumpsys activity |find “mFocusedActivity” (注意这里用英文引号)
有一些手机,或者其他类型的终端,使用上面的命令行无法获取的时候,可以使用下面的命令行试试看:
1)查看当前Activity :adb shell “dumpsys window w | grep name=”
2)查看当前栈顶的Activity的Fragment :adb shell dumpsys activity your.package.name
或者:
adb shell dumpsys activity top
3)也可以使用Android Studio自带的Layout Inspector查看当前页面的调用栈:
(3)获取连续10次冷启动耗时 (用于测试应用冷启动时间)
adb shell am start -S -R 10 -W calculator.calculate.calcu/.calc.BasicCalculatorActivity
(4)卸载apk
直接卸载,adb uninstall com.clip.apk
保留数据,adb uninstall -k com.clip.apk
(5)启动一个Activity
直接启动,adb shell am start 包名 / 完整 Activity 路径
携带Intent参数启动,adb shell am start com.clip.apk/com.clip.apk.MainActivity -e name clip
启动隐式Intent,adb shell am start -a “android.intent.action.VIEW” -d “https://www.google.com”
(6)发送广播
直接发送,adb shell am broadcast -a “broadcastactionfilter”
携带Intent参数发送,db shell am broadcast -a “broadcastactionfilter” -e name clip
(7)启动服务
直接启动,adb shell am start 包名 / 完整 Service 路径
adb shell am startservice “com.clip.apk/com.clip.apk.ClipService”
(8)屏幕截图 - 一些较老的机型没有截屏快捷方式时特别好用
adb shell screencap /sdcard/screen.png 后面路径是存储截图路径(路径名+图片名)
(9)录制屏幕
使用 screenrecord [options] filename 命令来录制屏幕视频,如:
adb shell screenrecord /sdcard/clip.mp4 后面路径是存储录屏路径(路径名+文件名)
(10)查看应用签名信息 - 版本更新失败时,用于检查两次版本的签名信息是否相同。
apk放在桌面上,重命名.zip,解压缩得到其中META-INF文件夹中的CERT.RSA文件(放在桌面上);
adb命令行输入 keytool -printcert -file C:\Users\Administrator\Desktop\CERT.RSA
信息如下图: 可以看到应用的签名信息
(11)清除应用数据与缓存 - 一些测试手机不太熟悉操作时特别好用
adb shell pm clear 相当于手动点击清除数据和应用缓存
(12)查看正在运行的Service
adb shell dumpsys activity services []
参数不是必须的,指定 表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
(13)查看应用详细信息 - 重点使用
adb shell dumpsys package
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
(13.1)查看应用版本信息
adb shell pm dump com.xiaopeng.musicradio | findstr “version”
中间的com.xiaopeng.musicradio是包名,得到的结果如下:
versionCode=5965 minSdk=28 targetSdk=28
versionName=V1.4.0_dev
signatures=PackageSignatures{701827d version:2, signatures:[b4addb29], past signatures:[]}
(14)查看设备信息
型号 adb shell getprop ro.product.model
电池状况 adb shell dumpsys battery
屏幕分辨率 adb shell wm size
屏幕密度 adb shell wm density
android_id adb shell settings get secure android_id
Android 系统版本 adb shell getprop ro.build.version.release
IP 地址 adb shell ifconfig | grep Mask 或者 adb shell netcfg
内存信息 adb shell cat /proc/meminfo
CPU 信息 adb shell cat /proc/cpuinfo processor 的编号是 0 到 3,有几个就是几核
修改屏幕分辨率 adb shell wm size 480x1024 恢复 adb shell wm size reset 或者重启设备
(15)检测应用是否有context引起的内存泄露
在Terminal窗口输入命令 adb shell dumpsys meminfo 查看内存使用情况
重复,切换Activity,查看最终有几个Activity:
如图,最后回到一个页面,但是有2个,甚至多个Activity的,则肯定有Activity被长期持有了。
(16)Manifest merger failed with multiple errors, see logs问题处理
此时在Terminal窗口输入命令 gradlew processDebugManifest --stacktrace,其中,processDebugManifest是log里面提到的,这个命令是会了获取更多的log信息。比如:
可以看到Build失败是由于没有足够空间分配给JVM。
(17)compileDebugJavaWithJavac问题处理
Execution failed for task ‘:app:compileDebugJavaWithJavac’
导致此问题的原因有很多种,每种问题的解决方法也各不相同,最主要的地方还是要可以定位出问题的地方在哪里。这里可以借助adb命令行实现:
在Terminal窗口输入命令 gradlew compileDebugJavaWithJavac,得到的结果如图:
可以定位到,是由于对应库中的一个Activity导包失败导致的此问题。
(18)executing external native build for cmake问题处理
此为使用cmake编译C++代码时出现的问题,甚至直接利用AS构建含C++原生代码的项目时都会出现这个问题,此时可以输入gradlew build --stacktrace,用以追踪出错的地方。博主是定位到项目根目录下的gradle版本(3.1.2)不兼容,然后升级为3.2.1,即可编译通过。
(19)Android Studio - 编译debug捅过了, release却无法打包问题处理
做完一个新功能之后,有时会碰见debug编译通过,但打release包出错的问题,此时可以检查是否是混淆出错了,例如引入了一个新的依赖库,但是没有添加对应的依赖。如果确定不是混淆出错,此时可以输入:gradlew lint ,此命名行会花费大概几分钟的时间去检查代码,直至定位到出错的地方,可以在build下找到出错的文件,如:
可以直接定位到出错的代码,包括XML,定位到具体的行。
后续补充:
Android svc命令与自动化/压力测试
adb shell
svc help
svc指令可用于电源控制, 无线业务控制(modem/wifi/nfc/bt, etc), 等等.
可以不适用按键,触控设备, 而通过使用svc命令实现这些模块的功能操作,比如wifi的开关:
svc wifi enable //打开wifi
svc wifi disable //关闭wifi
svc data disable // 关闭蜂窝网络
svc data enable // 打开蜂窝网络
svc power stayon [true|false|usb|ac]
设置屏幕的常亮,true保持常亮,false不保持,usb当插入usb时常亮,ac当插入电源时常亮
因此, 对于涉及到这些模块的自动化测试和压力测试, 都可以使用svc命令, 来解放双手.
scrcpy——Android投屏神器(使用教程)
通过Scrcpy,可以USB或者WIFI进行终端连接调试
Failure [DELETE_FAILED_INTERNAL_ERROR]之后rm apk卸载
上面的命令可以进到shell内,去卸载普通uninstall命令无法卸载的apk
[adb WIFI连接终端调试] cannot connect to 192.168.137.137:5555: 由于目标计算机积极拒绝,无法连接。
Android 共享用户不兼容,安装失败 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
慢慢更新中…
推荐一波其他好文:
参考脚本之家文章《android adb实用命令小结》
参考博客园文章《Android 常用 adb 命令总结》
补充一个知识点:
https://www.jianshu.com/p/a01bc1650dd4