adb命令是android开发中必不可少的部分,有了它们,我们干活会更高效,更得心应手。
目前网络上adb命令大多是简单的罗列和整合,一大堆的东西塞到一起,没有条理不够清晰。
这次就让我们来点不一样的。
对于新手来说会使用一些常见的adb命令,比如
adb connect xxxx(IP地址) 连接设备
adb devices查看连接的设备
adb install xxx.apk安装应用
adb push xxx(本地文件路径) xxx(目标设备文件路径) 推送文件
adb pull xxx(目标设备文件路径) xxx(本地文件路径) 拉取文件
。。。
这些都是一些日常操作,可能对于新手足够了,但对于工作了5年以上的老鸟来说,你对adb命令的了解需要更近一步。
实际上,我们可以发现,稍微复杂点的命令在adb后都会带有shell这个单词,shell就是Linux下的命令行,常见的比如ls,cd,chmod等等都是完全和Linux一样的。在shell 后面时常会跟着android特有的一些命令,基本上可以分为这4大块,当然还有很多其它的。
1.Activity管理器 (am)
执行各种系统操作,如启动 Activity、强行停止进程、广播 intent等等
2.软件包管理器(pm)
对设备上安装的应用执行操作和查询
3.窗口管理器(wm)
修改设备屏幕属性等
4.设备政策管理器(dpm)
使用该工具可控制活动管理应用,或更改设备上的政策状态数据
下面我将针对部分使用场景列出一部分,后续如果有时间还会持续补充
一.UI相关
Android开发,UI做为"门面"必不可少,可以说是我们打交道最多的东西了。
各种酷炫的页面对程序的流畅性和稳定性都提出了要求,我们来看看有哪些相关的命令
1.更改分辨率和dpi
adb shell wm size 1920x1080 //分辨率
adb shell wm density 320 //(dpi)
adb shell wm size reset恢复
adb shell wm density reset恢复
这个我感觉很实用,有时候你手头只有有限的设备,或者不想再多开个模拟器,那么用这个命令去模拟就再方便不过了。
2.查看Activity的任务栈
adb shell dumpsys activity activities //查看所有的activity
adb shell dumpsys activity | findstr “yourActivity” //查看你的activity
在开发中,经常会碰到多个activity跳转的场景,用以上命令查看当前Activity的情况,及时发现重复创建等异常情况。
3.查看各阶段发生的动画以及帧相关的性能信息
adb shell dumpsys gfxinfo 包名
关于查看/分析UI性能的办法有很多,使用Systrace分析UI性能,打开开发者模式里的过度重绘、GPU呈现模式分析都是可行的,也可以通过这个命令去更精确的定位分析。
4.启动时间
adb shell am start -W 包名/Activity全类名
会返回三个值ThisTime,TotalTime,WaitTime,具体差别可以自行百度,注意这里的activity必须是LAUNCHER型的,通常我们也可以在各自的页面进行埋点来查看启动速度。
5.UI的绘制/显示和内存息息相关,这一部分我们整合到下面的章节内存中
二.内存相关
1.查看系统/进程内存占用,并排序
adb shell su (需要赋予超级权限,否则可能报错)
procrank -p (按pss排序,也可以按其它列进行排序,换成对应的首字母就行)
从图中可以看出各个应用(进程)占用内存的情况, 至于这四列,Vss,Rss,Pss,Uss含义及差别,我们可以参考这篇文章 https://www.jianshu.com/p/3bab26d25d2e。通常关注下Pss或者Uss就可以了。
2.查看系统整体内存情况:
adb shell cat /proc/meminfo
这个命令从系统层出发,展示了系统的内存状况,有很多项,一般我们关注MemFree 和 MemAvailable即可,如果这两个其中有一个逐渐减小,就要警惕内存问题了,当available只有100M左右,那么极易发生OOM(视系统版本而定)
3.查看某个应用的内存
adb shell dumpsys meminfo 包名
dumpsys 查看应用内存
这个命令详细展示了应用的各个方面,包括内存使用大小,创建了多少个对象(有多少个view,多少个webview,这里要特别注意下,如果view的数量过多,且没有过段时间没有回落,要注意是否重复创建或者销毁不彻底,避免内存泄漏),以及数据库的大小及名称。可以说非常全了。
4.monkey测试
adb shell monkey -p 包名 -v 10000 (有很多参数,这里省略)
用于稳定性测试,相信大家都很熟悉了,就不做过多介绍了。有两点需要注意下,
(1)设备状态栏是否隐藏?如果没隐藏的话可能会点到home键或者back键
(2)脚本里是否包含一些退出,返回的命令?
这两点都可能会造成程序退出,测试中断的情况。
三. 数据库相关
数据库操作也是android开发中必不可少的一部分。但它不像是mySQL,oracle一样,有丰富的图形化操作页面,至少原生的as没有这些,除非下载三方软件/插件。其实直接用adb也能实现数据库的常见操作。
有两点要注意
1.db可能没有读写权限 要chmod 777 给与权限
2.sql语句后要有分号断句
adb shell
su(赋予超级权限)
cd /data/data/包名/databases (进入数据库目录)
ls (查看此目录里有哪些数据库)
chmod 777 test.db (给数据库赋予读写权限)
sqlite3 test.db (使用sqlite3打开(链接)数据库),如果成功,会有如下输出:
SQLite version 3.9.2 2015-11-02 18:31:45
Enter “.help” for usage hints.
sqlite> .tables(输入.tables查看表名)
sqlite>select * from testTable;(执行SQL语句)
更多相关知识可以查阅官方手册:
https://www.sqlite.org/cli.html
四.日志相关
设备里会记录各种各样的日志,除了我们应用层的,还有native层、内核层的,这些日志可以帮助我们更好的分析定位问题。
1.导出anr日志
adb pull data/anr/traces.txt anr.txt
2.导出logcat日志
adb logcat –d main time > c:\appLog.txt
此命令会导出带时间的Java层debug信息(具体可百度adb logcat)
3.查看linux 系统内核(启动)日志
adb shell dmesg >dmesg.txt
有时候会去查询一些系统级别的日志,比如一些设备异常重启,那么可能就要去内核日志里
看看是什么导致的,关键字可以搜索reboot,shutdown,halt之类的,说不定会有一些发现。
看到这里大家是不是对adb有了新的认识呢?恭喜你已经告别入门,走向更高的台阶了!
更多关于adb的知识,大家可参考谷歌官方的开发手册(需要科学上网)
https://developer.android.com/studio/command-line/adb