安卓系统开发调试工具整理.docx
《安卓系统开发调试工具整理.docx》由会员分享,可在线阅读,更多相关《安卓系统开发调试工具整理.docx(45页珍藏版)》请在冰点文库上搜索。
安卓系统开发调试工具整理
1.Adb常用命令
为了可以在终端直接使用adb命令,我们可以配置一下环境变量。
Windows:
右键我的电脑-属性,调出以下窗口
图1-1环境变量配置
图1-2环境变量配置
按照以上步骤新建一个环境变量,然后将adb所在的路径加上去。
1.1.Adb调试
先打开usb调试模式
adbdevices:
主要是用于打印当前连接的所有模拟器或者设备
adbroot:
以root权限运行
adbremount:
重新挂载分区,使system分区变成可读写,一般用于传输文件到Android设备
1.2.Package管理
adbinstall:
主要用于往Android设备push应用
adbinstall[option]
adbinstalltest.apk直接安装应用
adbinstall-rtest.apk替代存在的应用,不会删除应用数据,用于更新应用特别方便
adbuninstall:
从设备或者模拟器卸载应用
adbuninstall[options]
adbuninstallcom.example.application直接删除应用和所有数据
adbuninstall-kcom.example.application删除应用,但会保留应用数据和缓存数据
adbinstall常见错误
错误信息
错误解析
INSTALL_FAILED_ALREADY_EXISTS
程序已经存在
INSTALL_FAILED_INVALID_APK
无效的APK
INSTALL_FAILED_INVALID_URI
无效的链接
INSTALL_FAILED_INSUFFICIENT_STORAGE
没有足够的存储空间
INSTALL_FAILED_DUPLICATE_PACKAGE
已存在同名程序
INSTALL_FAILED_NO_SHARED_USER
要求的共享用户不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE
版本不能共存
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
需求的共享用户签名错误
INSTALL_FAILED_MISSING_SHARED_LIBRARY
需求的共享库已丢失
INSTALL_FAILED_REPLACE_COULDNT_DELETE
需求的共享库无效
INSTALL_FAILED_DEXOPT
dex优化验证失败
INSTALL_FAILED_OLDER_SDK
系统版本过旧
INSTALL_FAILED_CONFLICTING_PROVIDER
存在同名的内容提供者
INSTALL_FAILED_NEWER_SDK
系统版本过新
INSTALL_FAILED_TEST_ONLY
调用者不被允许测试的测试程序
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE
包含的本机代码不兼容
CPU_ABIINSTALL_FAILED_MISSING_FEATURE
使用了一个无效的特性
INSTALL_FAILED_CONTAINER_ERROR
SD卡访问失败
INSTALL_FAILED_INVALID_INSTALL_LOCATION
无效的安装路径
INSTALL_FAILED_MEDIA_UNAVAILABLE
SD卡不存在
INSTALL_FAILED_INTERNAL_ERROR
系统问题导致安装失败
DEFAULT
未知错误
表1-1错误信息
常见解决方案:
错误信息
解决方案
INSTALL_FAILED_INVALID_APK
检查安装包是否完整
INSTALL_FAILED_INSUFFICIENT_STORAGE
清理一下存储空间
INSTALL_FAILED_DUPLICATE_PACKAGE
卸载之前的apk
INSTALL_FAILED_UPDATE_INCOMPATIBLE
卸载之前的apk
INSTALL_FAILED_OLDER_SDK
系统版本过旧
INSTALL_FAILED_NEWER_SDK
系统版本过新
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
签名不一致,卸载之前版本
INSTALL_CANCELED_BY_USER
勾选\"系统设置->安全->未知来源\"
INSTALL_FAILED_TEST_ONLY
AndroidManifets中将testOnly=”true”去掉
表1-2解决方案
adbshellpmlistpackages:
打印设备下面的所有应用包名
adbshellpmpath:
打印apk的路径
adbshellpmclear:
清除应用缓存
1.3.文件管理
adbpull[local]:
从Android设备下载文件到PC,其中代表文件在设备中的地址,[local]代表存放目录
下载一个文件夹到电脑
示例:
adbpull/sdcard/temp./temp:
下载一个目录所有文件,将车机中的temp目录下载到电脑端的temp目录
下载一个文件到电脑端
示例:
adbpull/sdcard/temp/1.txt./temp/:
下载一个文件,将1.txt下载到电脑的temp目录下。
adbpush:
将电脑端的文件或者文件夹推进车机等Android设备中
将电脑端一个目录推到Android设备
示例:
adbpush./temp/sdcard/:
push电脑端的temp文件夹到车机/sdcard下面
将电脑端一个文件推到Android设备
adbpush./temp/1.txt/sdcard/temp/:
将1.txt推到车机中的/sdcard/temp目录下
以下为进入Android设备后执行(adbshell),一些linux基础命令,其他见1.7linux基本命令
ls:
列出目录内容
cd:
和一般的PC的cd差不多,主要用于切换目录
rm[options]:
删除文件或者目录
rm–r:
删除目录
mkdir:
创建文件夹,抓取套件日志的时候需要创建文件夹可以用到
touch:
创建一个新文件或者改变文件修改时间,用于在车机中创建文件,例如助理3.5在PerformLog文件夹下创建all.txt,可以直接执行touchall.txt,而不需要在电脑创建再push进去。
pwd:
定位当前的操作位置
cp[options]
复制
mv:
移动或者更名文件,
cat:
将文件内容输出到终端
在车机中实际操作如下图,注意每次操作后执行ls–l查看当前目录下的文件和文件夹:
图1-3常用文件操作命令
1.3.1.查看SharedPreferences文件
图1-4查看SharedPreferences命令
1、执行run-as+package:
查询语助的安装路径
2、执行cdshared_prefs:
进入安装后自动生成保存SharedPreferences的路径
3、执行cat命令查看其中的一个xml文件,可以看到语助应用的一些key值对应的value
1.3.2.查看db文件
1、将db文件从Android设备中拷贝出来
adbpull/data/data/package_name/database/app_name.dbpc路径(以\分隔符)
2、用SQLiteStudio工具打开db文件可以对查看数据的表和其他数据
1.4.日志
adblogcat[options][filter-specs]:
打印日志文件
一般配合重定向符>保存日志文件
1.4.1.日志优先级
adblogcat*:
Vlowestpriority,filtertoonlyshowVerboselevel打印详细日志,常用,以下优先级的日志也会打印
adblogcat*:
DfiltertoonlyshowDebuglevel
adblogcat*:
IfiltertoonlyshowInfolevel
adblogcat*:
WfiltertoonlyshowWarninglevel
adblogcat*:
EfiltertoonlyshowErrorlevel
adblogcat*:
FfiltertoonlyshowFatallevel
adblogcat*:
SSilent,highestpriority,onwhichnothingiseverprinted
1.4.2.adblogcat选项解析
"-c"选项:
清空所有的日志缓存信息;
"-s"选项:
设置输出日志的标签,只显示该标签的日志
"-g"选项:
查看日志缓冲区信息
图1-4logcat选项
"-b"选项:
加载一个日志缓冲区,默认是main。
system缓冲区-与系统相关的日志信息,radio缓冲区-广播电话相关的日志信息,events缓冲区-事件相关的日志信息,main缓冲区-默认的缓冲区
"-v"选项:
设置日志的输出格式,注意只能设置一项,有以下取值:
1.brief:
/():
示例:
D/HeadsetStateMachine(1785):
Disconnectedprocessmessage:
10,size:
0
2.process:
()
示例:
D(1785)Disconnectedprocessmessage:
10,size:
0(HeadsetStateMachine)
3.tag:
/:
示例:
D/HeadsetStateMachine:
Disconnectedprocessmessage:
10,size:
0
4.raw:
示例:
Disconnectedprocessmessage:
10,size:
0
5.time:
:
示例:
08-2822:
39:
39.97417851832DHeadsetStateMachine:
Disconnectedprocessmessage:
10,size:
0
6.threadtime:
:
示例:
08-2822:
39:
39.97417851832DHeadsetStateMachine:
Disconnectedprocessmessage:
10,size:
0
7.long:
[:
/]
常用日志获取adblogcat–vtime>./logcat.txt表示按时间的格式输出,同时没有限制日志优先级按*:
V默认格式输出
1.5.dumpsys获取相关的系统数据
adbshelldumpsys:
获取系统数据
adbshelldumpsys–l:
查看所有可以dumpsys的命令
dumpsysactivity:
查询AMS服务相关信息
示例:
dumpsysactivityscom.iflytek.cutefly.speechclient.hmi,查看进程所有service状态
图1-5dumpsys操作命令
1、代表进程号
2、代表绑定包名
3、代表绑定进程的user用户名
用ps–ef查询所有进程,grep查找关键字,可以看到其中一个匹配的进程存在™
图1-6dumpsys操作命令
示例:
dumpsysactivitybcom.iflytek.cutefly.speechclient.hmi,查询语助所有的广播状态
图1-7dumpsysactivity操作命令
dumpsyswindow:
查询WMS服务相关信息
以下是dumpsyswindow可以查询的所有信息
图1-8dumpsyswindow操作命令
可以通过dumpsyswindowl打印出最后一次ANR信息
示例:
dumpsyswindowa查询窗口状态
没有启动语助时执行的结果:
图1-9dumpsyswindow操作命令
启动语助执行的结果:
图1-10dumpsyswindow操作命令
也就是会打印出当前界面的窗口状态
dumpsyscpuinfo:
查询CPU情况,可以接>保存到文件
获取当前各个应用cpu使用情况
图1-11dumpsyscpuinfo操作命令
dumpsysmeminfo:
查询内存情况,打印各个应用的内存使用情况
图1-12dumpsysmeminfo操作命令
执行dumpsysmeminfocom.iflytek.cutefly.speechclient.hmi可以查看具体应用的内存使用情况JavaHeap和NativeHeap有分别的大小限制,一个大型应用一般将移到NativeHeap防止应用OOM。
图1-13dumpsysmeminfo操作命令
amdumpheapcom.iflytek.cutefly.speechclient.hmi/data/local/tmp/hmi.hprof执行这个命令可以在语助占用内存大时将当前语助的内存使用情况导出来,分析可参考3.3内存分析。
1.6.截图
adbshellscreencap:
截取屏幕当前图片
示例:
截图,然后pull到电脑端
adbshellscreencap/sdcard/test.png截图存放
adbpull/sdcard/test.png取到PC当前文件夹
adbshellscreenrecord:
屏幕录制,必须在Android4.4(APIlevel19)以上才可使用,可保存为.mp4文件
示例:
将视频录制到/sdcard,然后pull出来
adbshellscreenrecord--size1280x720/sdcard/temp1.mp4
adbpull/sdcard/temp1.mp4./Desktop/
1.7.系统
adbshellps:
打印进程状态
adbshelltop:
展现上层CPU进程信息
adbshellgetpropkey:
获取Android系统服务属性,对应Android的SystemProperties类
adbshellsetpropkeyvalue:
设置服务属性
sync:
将内存缓存写进磁盘,Linux系统不是实时写入,会缓存在内存,像突然掉电有可能造成一些文件来不及写进导致下一次读取的值不是预期的值。
reboot:
重启机器
aaptdumpbadgingtest.apk:
可以查看test.apk包名、版本号、Activity入口,aapt在sdk中,需要配置环境变量
以下是客户提供的一个apk,我们可以看到程序入口,然后配合am命令启动界面。
图1-14查看系统信息操作命令
可以看到包名和launchable-activity这样我们可以知道怎么打开Activity
可以通过改命令启动amstart–n.testipodserviceapp/.MainActivity
还有的情况是验证给系统签名的apk,通过查看版本号是否为我们所需的apk。
dumpsyspackage:
查看车机安装应用信息
dumpsyspackagecom.iflytek.cutefly.speechclient.hmi|grepversionName
图1-15dumpsyspackage操作命令
这个命令可以确定我们安装的apk版本号是否正确
查看cpu型号
可以通过cat/proc/cpuinfo命令可以查看cpu型号和一些参数,像processor一般是指cpu厂商,以下实例没有体现。
图1-16cpuinfo操作命令
1.8.Linux基本命令
kill:
杀死进程
grep:
查找关键字,基本所有命令都可加|grep“关键字”。
adbshell“logcat|grep–eword1–eword2”。
可以同时搜索两个关键字。
clear:
清屏
1.9.am模拟启动组件
am-h:
查看帮助
amstart-a:
表示打开一个action
amstart-ncom.android.music/com.android.music.MusicBrowserActivity 启动一个组件
amstartservice-ncom.android.music/com.android.music.MediaPlaybackService:
启动一个service
amstopservice:
停止一个服务
ambroadcast-a:
发送一个广播,助理3.5中发送广播限定了package,记得模拟发送广播加上-p
[-e|–es…]:
extra,类型为string
[–ez…] :
boolean
[–ei…] :
int
[–el…]:
long
1.10.monkey测试
是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。
Monkey测试特点
可对MonkeyTest的对象,事件数量,类型,频率等进行设置。
Monky测试使用的事件流数据流是随机的,不能进行自定义。
测试的对象仅为应用程序包,有一定的局限性。
详见链接
1.11.模拟按键事件
Android有一套统一按键keycode
inputkeyeventkeycode
图1-17keycode对应值
示例:
返回键adbshellinputkeyevent4或者adbshellinputkeyeventKEYCODE_BACK
1.12.PuTTY串口调试工具
一般车机会配置串口供调试使用,这边简单介绍以下PuTTY工具的使用
图1-18putty设置
将串口接到电脑,到设备管理器查看串口的设备号,例如图中的为COM3,接着跟系统方确认波特率Speed,接着点击打开即可打开一个终端,可以执行adb命令等。
1.13.静态代码检测工具
静态检测指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。
以下附上Coverity代码静态检测链接
:
8888/svn/ZNQC_KnowledgeSystem/Trunk/Project/03.Study/依赖文档/《语音助理声学前端指导手册》依赖文档/coverity相关
2.Cpu分析
2.1.配合使用top命令
top-H-d1-p+进程号
-H:
表示显示该进程的线程使用cpu情况,有的设备是-t
-d:
表示刷新时间间隔,以秒为单位
-p:
具体观察应用的pid进程号
注意以上可能由于Android设备不同有所区别,可以top–help查看支持的操作
可以top-H-d1-p+进程号>/sdcard/top.txt保存到文件中,然后统计一下cpu峰值,查看哪条线程占用的cpu比较高,然后进一步用profiler排查,语助内的thread记得命名,不然系统会生成Thread-id格式的线程名称,不易排查哪条线程有问题。
2.2.利用AndroidProfiler分析
以下为AndroidProflier整体示意图,先做一下简介:
图2-1ASProfiler
1.Event时间线:
显示应用中在其生命周期不同状态间转换的Activity,并表明用户与设备的交互,包括屏幕旋转Event。
如需了解有关Event时间线的更多信息,包括如何启用它,请阅读启用高级分析。
2.CPU时间线:
显示应用的实时CPU使用率(以占总可用CPU时间的百分比表示)以及应用使用的总线程数。
此时间线还显示其他进程的CPU使用率(如系统进程或其他应用),以便您可以将其与您的应用使用率进行对比。
通过沿时间线的水平轴移动鼠标,您还可以检查历史CPU使用率数据。
3.线程Activity时间线:
列出属于应用进程的每个线程并使用下面列出的颜色沿时间线标示它们的Activity。
在您记录一个函数跟踪后,您可以从此时间线中选择一个线程以在跟踪窗格中检查其数据。
绿色:
表示线程处于活动状态或准备使用CPU。
即,它正在“运行中”或处于“可运行”状态。
黄色:
表示线程处于活动状态,但它正在等待一个I/O操作(如磁盘或网络I/O),然后才能完成它的工作。
灰色:
表示线程正在休眠且没有消耗任何CPU时间。
当线程需要访问尚不可用的资源时偶尔会发生这种情况。
线程进入自主休眠或内核将此线程置于休眠状态,直到所需的资源可用。
2.2.1.Cpu占用高排查实践
1、DDMS查看cpu使用情况查看那条线程占用cpu高,可以用DDMS查看。
点击两次下图StartMethodProfiling按钮,可用录制一段时间cpu使用情况。
图2-1DDMS
图2-2DDMS线程cpu
可以明显看到globalRecordThread线程频繁分配到cpu时间片,可以从这里入手。
接着看到readGlobalRecordDataInMab这个方法占用了这条线程的95.8%的cpu,分析代码录音线程做的事情比较简单,调用系统read方法录音,然后送进套件降噪模块,即图中SpeechEnhancement.process方法,最后分离从套件得到的4路音频。
能优化的就是分离4路音频的算法。
由于一开始不能明显看到该方法占用cpu,后续抽出来改为processResult方法。
优化前:
图2-3分离四声道代码
优化后:
图2-4优化后
优化之后如下,可以看到processResult方法相对占