Android 进阶第一篇——善用工具

笔者本身从事的是和系统相关性比较大的系统应用的开发,在这里我总结了一下自身的经验,将工作中经常用到的一些工具做了简要罗列,我之所以将其作为进阶第一篇,是因为工欲善其事必先利其器,只有善用工具才能提升效率,节省更多时间去学习和实践。其实我工作中也不都是敲命令,出于工作繁忙的原因,我将这些命令都用Python封装成了GUI界面工具,自动化或半自动化的一键式的运行,这里我就不放出工具了,一是因为界面丑陋,二是绑定和耦合了工作模块的代码逻辑等,不适合拿出来,而且我也懒得去重新封装,大家看我写的Python tkinter系列博客,再去简单学习一下Python语法,完全可以自己定制属于自己的自动化工具,很推荐Python,简单易用,开发高效,非常不错的语言!

命令工具

如果在Windows上使用命令工具,那么在使用之前你或许需要一个超级命令行工具,因为Windows的cmd命令行简直low爆了!这里我极力推荐ConEmu 命令工具,非常好用,谁用谁知道。有些人喜欢推荐cmder工具,但它有一个我无法忍受的bug,有多蛋疼,谁用谁知道

Android 进阶第一篇——善用工具_第1张图片

  • adb 基础命令
    以下这些命令是最为基础常用的adb命令,相信很多开发者都已经熟悉,在此列出做一个总结
#查看设备,有多个设备连接时,执行该命令列出每个设备的serialNumber,后续命令加-s 可指定执行命令的设备
adb devices   

adb root      #运行后以root权限执行adb命令 (需要提前root手机)
adb remount   #重新挂载分区,执行后可对/system/ 等目录进行读写操作(需要提前root手机)

#手机上未安装该apk文件,运行此命令(不在同一目录下,需带路径)
adb install 
#如手机上已经安装该apk,加-r参数重装
adb install -r   

#卸载软件,加-k命令,卸载软件时可以保留配置和缓存文件
adb uninstall [-k] <应用包名>    

#把本地PC上的文件或者文件夹拷贝到设备
adb push <本地PC路径> <手机端路径> 

#把设备上的文件或者文件夹拷贝到本地PC
adb pull <远程路径> <本地路径>

#启动adb服务
adb start-server
#杀死adb服务,结合启动命令,可以用来重启adb服务
adb kill-server

#重启手机
adb reboot

#进入设备的Linux命令行,可用来执行Linux命令
adb shell

adb -h  #查看帮助手册
  • Android下常用的shell命令

这些命令既可通过adb shell进入Linux命令行去执行,也可使用adb shell 直接加命令执行

我们通常直接使用adb shell 组合一些Linux常用命令去执行,而不是进入Linux命令行,这样会更加方便。如常见的cd、ls、mkdir、rm、mv、cat等

adb shell top         #即Linux下的top命令,查看设备cpu和内存情况
adb shell top -m 3      #查看占用内存前3的app
adb shell ps          #查看进程列表
adb shell ps -x [PID]     #查看指定进程状态
adb shell kill [PID]    #杀死一个进程
adb shell service list   #查看后台services信息
adb shell getprop         #查看所有系统的属性信息(同adb shell cat /system/build.prop)
adb shell setprop [name] [value]   #设置系统的属性信息,需root
adb shell getprop ro.build.version.release

#查看手机芯片平台,带有mt字样的为MTK平台,sp或sc为展讯平台,Qualcomm或者msm为高通平台,
#不同平台,某些框架层代码区别很大,一般的第三方应用开发者无感
adb shell cat /proc/cpuinfo | grep Hardware

#查看当前电量
adb shell dumpsys battery | grep level

#获取wifi密码(需root)
adb shell cat /data/misc/wifi/*.conf

获取当前Activity信息是非常有用的命令,特别是用来分析未知的apk,与屏幕相关的几个命令,在调试UI界面时也十分有用

#查看当前界面的Activity
adb shell dumpsys activity activities | grep mFocusedActivity

adb shell wm size         #获取屏幕分辨率
adb shell wm density      #获取屏幕密度
adb shell wm density <数值> #修改屏幕密度

以下录屏与截屏命令,在测试apk的时候相当有用,很多人却不知道,现在学习一下,就再也不需要去安装一个第三方软件了,其中添加–bugreport命令,可以在性能不太差的机器上做启动速度测试,具体可参考Android app启动时间测试
但其实这种录屏数据仅仅作为一点参考,并不太准确,我在很多不同型号机器上实践过,都有或多或少的偏差,因为当你处于录屏时,本身就会影响性能,就会影响启动速度。

#屏幕截图,并将截图保存到sd卡
adb shell screencap -p /sdcard/screenshot.png

#录制屏幕命令,将录屏以mp4格式保存到设备的sd卡 (/sdcard)
adb shell screenrecord /sdcard/filename.mp4

#bugreport参数使录屏增加一些时间信息和帧信息,可用来测试应用启动速度
adb shell screenrecord --bugreport /sdcard/filename.mp4
#size参数用于设置视频的尺寸,可调整录屏的大小
adb shell screenrecord --size 1280x720 /sdcard/filename.mp4

以上一些命令中,很多都可以通过Linux管道”|”连接grep进行过滤,如
adb shell getprop | grep persist
它会过滤结果,返回只包含persist关键字的结果;我们还可以通过Windows命令行的管道”>”命令将结果导入本地PC的文件中进行保存和查看
adb shell getprop > D:\filename.txt
adb shell top > D:\proc.txt
还可将两个管道结合使用,我们要知道,管道正是命令行的精髓之所在!
adb shell getprop | grep persist > prop.txt

  • pm命令
#列出所有安装的应用的包名
adb shell pm list packages

#加-f参数,还可显示该apk文件的路径
adb shell pm list packages -f

#根据包名查看其apk文件的路径
adb shell pm path <包名>

#清除应用数据与缓存
adb shell pm clear <包名>

这些命令都可以使用管道操作符连接grep工具进行过滤显示,其中清除应用数据与缓存的命令很常用,现在我们知道这个命令,再也不用笨拙的到手机设置应用列表中去寻找到我们的app,然后去清除app的缓存数据,用命令只需一秒搞定。

这里针对adb shell pm list packages命令做一点扩展,列出了该命令支持的所有参数,实际上我也没有怎么使用过,因为我认为搭配上grep去过滤已经足够了

-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用

这个地方我想做一点补充说明,假设一种场景,你的手机无意中了广告木马病毒,不停弹出广告页面,那么我们就可以使用上面讲的命令,快速导出该木马反编译做分析。首先第一步的思路就是要知道这个木马的包名,不知包名一切皆休!
adb shell dumpsys activity activities | grep mFocusedActivity
执行上述命令,获取到该界面的包名类名
adb shell pm path <包名>
执行上述命令,获取到木马的apk路径
adb pull D:\text
最后导出apk(需root)

  • am命令
#列出所有的Activity任务栈信息
adb shell am stack list

#强制停止应用,可用于杀进程
adb shell am force-stop <包名>

adb shell am start        [options]     #启动指定的 Activity
adb shell am startservice [options]     #启动 指定的 Service
adb shell am broadcast    [options]     #发送指定的广播

对于启动Activity、Service以及发送广播,可以携带一些数据,这里列出其中一些参数

-a 指定 action,比如 android.intent.action.DIAL
-c 指定 category,比如 android.intent.category.APP_CONTACTS
-d : 指定 Intent data的URI
-n 指定完整 component 名,明确指定启动的Activity,格式为 <包名/完整类名>
-t : 指定Intent MIME Type
-p : 指定包名

这里给出启动一个activity的示例,其他的用法也类似

adb shell am start -a android.intent.action.DIAL -d tel:10000
adb shell am start -n com.android.camera/com.android.camera.Camera

除了上述用法,am start命令还可以用来做冷热启动速度的测试工具,平时工作中会经常有性能优化的指标,其中启动速度算一项,当然,我们一般关注的是冷启动速度,也就是进程不在后台的启动,如进程已经挂在后台,这种启动是热启动

#冷启动速度,切记带上-S参数,否则每次测试不会杀进程,得出来的就是热启动数据,切记切记
adb shell am start -W -S <包名/完整类名>

#加上R参数,后面跟次数,表示自动循环测试的次数,这个参数就很ok了,测十次不需要手动去把命令执行十次
adb shell am start -W -S —R <次数> <包名/完整类名>


  • dumpsys命令

dumpsys命令可以说是最为强大的命令,它是用来拉取信息的,上述一些命令的功能,基本上用dumpsys命令都能获取,也正是因为过于强大,导致返回的信息过多,可使用的参数也过多,反而使用的不是特别多。这里简要列举几个最为常用的,实际上前面在获取当前activity时已经使用过

#拉取设备上所有安装应用的activity信息,其中包括包括#activity的布局层级、Fragment等等
adb shell dumpsys activity
#上述命令返回的信息量太过庞大,可以加p参数限制包名
adb shell dumpsys activity -p <包名>

#返回当前activity任务栈详细状态信息
adb shell dumpsys activity a
#具体堆栈状态信息
adb shell dumpsys activity activities

#更多详细使用,查看dumpsys activity命令的帮助手册
adb shell dumpsys activity -h

查看已安装应用包相关的信息,与dumpsys activity一样,加-h获取帮助手册

#拉取设备上所有安装应用的包相关信息,其中信息量相当庞大
adb shell dumpsys package

#可指定包名,获取该包的所有详细信息,就相当于获取到AndroidManifest的内容
adb shell dumpsys package <包名>

#获取所有已安装包的基本信息,包括安装路径、so路径以及权限等等
adb shell dumpsys package p

#获取所有已安装包的content providers信息
adb shell dumpsys package prov

dumpsys 命令后面除了可跟activity和package外,实际上可以跟的参数相当多,通过跟不同参数,几乎可以查看到设备相关的所有信息,由于参数过多,这里不再列举,想要查看可以跟哪些具体参数,通过添加-l命令即可获取

adb shell dumpsys -l

日志工具

分析日志调试BUG是平时的家常便饭了,但是大多数第三方app开发者使用的日志工具是IDE里面的logcat工具,也有一部分人使用adb命令抓取日志,实际上这都是在线日志,我这里介绍的是离线日志工具,这些工具是由手机芯片厂商提供的,并集成到手机上的,使用它的好处就是可以一直开启日志,24小时连续不间断的录制日志,并保存到SD卡,通常测试人员使用该工具,它还有另一个好处,就是可以用来调试一些首次开机发生的BUG,因为是首次开机,adb命令很可能无法抓取到开机时的boot日志,对于第三方应用可能使用不到,对于一些系统应用来说是非常有用的。这些离线日志工具和平台厂商有关,不同的平台不一样,其中高通平台更是没有提供

    #展讯平台工程模式,选择DEBUG & LOG页,LogManager菜单
    adb shell am start -n com.sprd.engineermode/.EngineerModeActivity
    #或者直接拉起日志录制界面
    adb shell am start -n com.sprd.engineermode/.activity.slog.SlogActivity

    #MTK平台工程模式,选择Log and Debugging页,MTKLogger菜单开启离线日志
    adb shell am start -n com.mediatek.engineermode/.EngineerMode

    #直接拉起MTK离线日志界面,切记在设置中只开启MobileLog选项,否则会抓取Modem等日志,导致体积庞大
    adb shell am start -n com.mediatek.mtklogger/.MainActivity

    #高通平台工程模式,高通芯片厂商并未提供现成的工程模式,都是由个手机厂商自己实现的,
    #这样就导致并没有统一的接口,每个厂商的都不一样,这时候,我们之前总结的各种工具命令就派上了用场了
    adb shell pm list packages -f -s | grep eng*

    #在所有的系统应用包名中,过滤出包含eng关键字的结果,-f参数输出apk的路径。
    #因为通常工程模式的包名都会含有:EngineerMode、EngMode关键字,我们找到apk的路径,
    #就可以导出apk并反编译清单文件,获取MainAcitivity的完整类名,这样就可以使用am命令启动了,
    #当然,前提是你的手机得root。因为每个手机厂商的命名可能不一样,
    #使用该方法不一定能找到手机中的工程模式,这就要看运气了

    #这里给出一个小米手机的工程模式,拉起后点击菜单然后去开始日志录制
    adb shell am start -n com.miui.cit/.CitLauncherActivity

adb命令抓取日志,实际上adb logcat命令可以配合的参数相当多,主要用来控制日志输入的格式,然而我认为并没有什么卵用,我这里给出了比较友好完整的日志输出格式,使用该格式即可,-b参数表示输出日志缓冲区的内容,后面的参数分别表示几种不同的日志类型,通常应用比较关注的是main日志,我一般会同时输出这四种日志到本地文件中保存,我前面讲到的,使用”>” 管道命令即可,然后使用notepad++打开日志文件查看,因为notepad++是我用过的支持搜索最友好的编辑器,它可以将搜索结果全部排列查看,还可以实现多个日志文件的搜索结果对比查看,总之谁用谁知道。

adb logcat -v threadtime -b main
adb logcat -v threadtime -b events
adb logcat -v threadtime -b system
adb logcat -v threadtime -b crash

该命令日志输入格式为
:

这里写图片描述

开发者选项工具

相信手机上的开发者选项工具大家都不陌生,通常用到它是为了连接USB数据线,实际上该选项提供了相当有用的一些工具给开发者测试和调试应用。

不锁定屏幕

插上数据线调试手机时,非常有用,这样就不会锁屏

输入选项卡下

显示点按操作反馈

开启它有助于观察点击屏幕时,是否点击到了,大家录屏的时候一定要开启它,获得更好的录屏体验

指针位置

开启它之后,点击屏幕会显示一些坐标信息以及滑动轨迹,通常用来调试屏幕驱动比较有用,当手机触摸操作无反应会不灵敏时,开启它有助于检查屏幕是否有损坏或者屏幕驱动是否失灵

绘图选项卡下

显示布局边界

这个工具对于应用开发者是非常有用的,可以用来观察和调试不同屏幕上的UI适配,调整布局等等,开启它之后就能清晰的看到应用的布局显示效果

动画程序时长缩放

其实在绘图选项卡下,有好几个关于动画的选项功能,我这里仅仅提一下动画程序时长缩放,设置它能加倍慢放APP的动画效果,可以细致的观察分析动画效果,算是比较有用的,其他几个可自行体会

硬件加速渲染选项卡下

调试GPU过度绘制

该功能主要是用来优化UI绘制的,做app性能优化的时候肯定是会用到它的,当view上的布局层级嵌套越深时,开启该选项后,看到的布局颜色就会变红,这就说明该布局方案不理想,应该优化,在后面我会专门写博客总结我做app性能优化时学习的一些经验。

监控选项卡下

启用严格模式

开启后,可用于检测,应用在主线程中是否存在耗时操作,当存在耗时操作时,屏幕会闪烁,该选项也是在性能优化时作为一个重要指标的

GPU呈现模式分析

用于检测UI的流畅性的,开启后,屏幕上会出现一条横向的绿线,代表16ms每帧的绘制,当屏幕上的柱状图在横线之下时,代表最理想的状态,表示UI流畅,不卡顿,该选项也是性能优化的重要指标,这里简单一提,后续性能优化博客中会详细说明。

应用选项卡下

不保留活动
后台进程限制

以上两个选项在应用开发中也非常有用,可以模拟某些情景对应用做测试,不保留活动,表示从当前activity跳转离开后,该activity会被立即销毁,后台进程限制也是类似,可以模拟内存紧缺时,进程被杀的场景,尤其是后台做某些操作时突然被杀死这种情景,可以非常容易的模拟这些情景。

以上是我对于工作中的一些总结,列出来的绝对是最常用的东西,这些工具都是非常有效的,实际上好用有效的工具还有非常多,但那些工具都有一些特定的用途,比如Lint、MAT等等,这些工具基本都在SDK中提供了,只是去关注并熟练使用的人不是特别多,后续博客中我会继续总结一些特定工具 。很多人谈到Android进阶时,总是喜欢大谈特谈各种原理,很少谈工具,我认为技能的提升应该首先从工具开始,应该从脚踏实地开始,熟练运用工具,提高效率才能更快速的学习其他东西,这里与诸君共勉!

这里放上两种不同手机的截图,可以看到都是差不多的,对于某些比较老旧的Android版本,某些功能可能没有,这可能说明你应该放弃该版本的兼容了。
Android 进阶第一篇——善用工具_第2张图片
Android 进阶第一篇——善用工具_第3张图片

你可能感兴趣的:(#,Android,从1开始,Android技术)