Android中AM、PM、dumpsys命令使用总结
am指令是 activity manager的缩写,可以启动Service、Broadcast,杀进程,监控等功能,这些功能都非常便捷调试程序。
可以通过adb shell 进入Android 的Linux命令界面,输入am -help查看详细命令,先介绍几个简单用法,
命令格式如下
命令列表:
原理分析:am命令实的实现方式在Am.java,最终几乎都是调用ActivityManagerService相应的方法来完成的,am monitor除外。比如前面概述中介绍的命令am start -a android.intent.action.VIEW -d , 启动Acitivty最终调用的是ActivityManagerService类的startActivityAsUser()方法来完成的。再比如am kill-all命令,最终的实现工作是由ActivityManagerService的killBackgroundProcesses()方法完成的。
下面说一下[options]和 INTENT参数的意义以及如何正确取值。
主要是启动Activity命令am start [options] INTENT使用options参数,接下来列举Activity命令的[options]参数:
启动Activity的实现原理: 存在-W参数则调用startActivityAndWait()方法来运行,否则startActivityAsUser()。
命令
例如: 向pid=12345的进程,发出level=RUNNING_LOW的收紧内存命令
level取值范围为: HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE
am的子命令,startservice, stopservice, broadcast, kill, profile start, profile stop, dumpheap的可选参数都允许设置--user USER_ID。目前市面上的绝大多数手机还是单用户模式,因此可以忽略该参数,默认为当前用户。
例如:启动id=10001的用户的指定service。
Intent的参数和flags较多,为了方便,这里分为3种类型参数,常用参数,Extra参数,Flags参数
实例
(1). 基本类型
参数es是Extra String首字母简称,实例:
(2). 数组类型
参数eia,是Extra int arr***首字母简称,多个value值之间以逗号隔开,实例:
(3). Arr***List类型
参数efal,是Extra float Arr*** List首字母简称,多个value值之间以逗号隔开,实例:
pm工具为包管理(package manager)的简称,可以使用pm工具来执行应用的安装和查询应用宝的信息、系统权限、控制应用,pm工具是Android开发与测试过程中必不可少的工具,shell命令格式如下:
原理分析:pm命令实的实现方式在Pm.java,最后大多数都是调用PackageManagerService相应的方法来完成的。di***ale之后,在桌面和应用程序列表里边都看到不该app。
查看所有的package,
[options]参数:
disabled + enabled = 总应用个数; 系统 + 第三方 = 总应用个数。
查看第3方应用:
查看已经被***用的包名
FILTER参数
当FILTER为不为空时,则只会输出包名带有FILTER字段的应用;当FILTER为空时,则默认显示所有满足条件的应用。
例如,查看包名带有weather字段的包名
[options]参数:
PATH参数: 指的是需要安装的apk所在的路径
dumpsys是Android自带的强大debug工具,从名字就可以看出,主要是用于dump 当前android system的一些信息,是一项分析手机问题,运行状态,使用情况等十分有效的手段。
实现原理
dumpsys的源码结构其实很简单,只有一个dumpsys.cpp
/frameworks/native/cmds/dumpsys/dumpsys.cpp
先通过def***ltServiceManager()函数获得ServiceManager对象,然后根据dumpsys传进来的参数通过函数checkService来找到具体的service, 并执行该service的dump方法,达到dump service的目的。
不同的Android系统版本支持的命令有所不同,可通过下面命令查看当前手机所支持的dump服务,先进入adb shell,再执行如下命令:dumpsys -l。 这些服务名可能并看不出其调用的哪个服务,可以通过下面指令:service list。
服务列表有很多,这里简单介绍几种
通过下面命令可打印具体某一项服务:dumpsys service,其中service便是前面表格中的服务名
接下来主要说下dumpsys activity 用法
命令
options可选值
dumpsys activity等价于依次输出下面7条指令:
cmd可选值
命令
返回结果
上面的输出结果可以分为以下四个部分
也可以只输出某个pid或package的进程信息:
下面以AmberLocker作为实例进行分析
场景1:查询某个App所有的Service状态
解读:Service类名为com.amber.lockscreen.LockerHeartService,包名为mobi.infolife.ezweather.locker.locker_2,baseDir(apk路径)为/data/app/mobi.infolife.ezweather.locker.locker_2-2/base.apk,dataDir((apk数据路径)
运行在进程pid=1115,进程名为进程名为mobi.infolife.ezweather.locker.locker_2,,uid=10060,还有创建时间等信息
场景2:查询某个App所有的广播状态
场景3:查询某个App所有的Activity状态
场景4:查询某个App的进程状态
格式:ProcessRecord{Hashcode pid:进程名/uid},进程pid=941,进程名为mobi.infolife.ezweather.locker.locker_2:live,uid=10060.
该进程中还有Services,Connections, Providers, Receivers,
场景5:查询栈顶Activity
dumpsys 的命令还有很多,这里就不一一列举了。
dumpsys 使用与源码
1-dumpsys 使用
命令格式:
adb shell dumpsys activity [options] [WHAT]
option 参数:
WHAT 参数:
重要的服务:
其他重要服务:
指令:
举个例子:
adb shell dumpsys activity p com.example.helloworld
对应的source code
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
2-dumpsys 源码介绍
frameworks/native/cmds/dumpsys/Android.bp
main.cpp 可以看出main 就是def***ltServiceManager, 根据参数获取对应的service
frameworks/native/cmds/dumpsys/dumpsys.cpp
这个指令比较简单,就是getservice dump 信息,关键是要对service 比较熟悉
REF:
adb shell dumpsys 命令
Tags: adb_shell
adb shell 进入shell 环境执行 dumpsys 命令
dumpsys Service [cmd]
查看Activity/Task信息
查看指定包名当前窗口显示布局结构信息,如果不在当前窗口,则报错
查看处于当前栈顶的Window和Activity
不指定包,查看内存信息:
查看指定包的内存信息:
adb shell dumpsys meminfo packagename -d
在进入一个界面之前查看一遍Activity和View的数量,在退出这个界面之后再查看一遍Activity和View的数量,对比进入前和进入后Activity和View数量的变化情况,如果有差异,则说明存在内存泄露(在使用命令查看Activity和View的数量之前,记得手动触发GC)。
如何查看Activity任务栈以及dumpsys
有两种实现方式:
***种:自己手动写一个程序,通过系统提供的函数来打印任务栈顶的Activity名称来判断是否是同一个Activity:
如下:
[java] view plaincopy
ListRunningTaskInfo runningTasks = mActivityManager.getRunningTasks(5);
for (RunningTaskInfo runningTaskInfo : runningTasks) {
Log.v("taskInfo", runningTaskInfo.topActivity.toString());
}
以下是列表页的任务栈顶信息:
以下是详情页的任务栈顶信息:
很明显,两个页面不是同一个Activity.
第二种:通过adb shell dumpsys activity命令:
如下:
使用cmd启动adb shell:
E:Android_Sdkandroid-sdksplatform-toolsadb shell
shell@NX601J:/ $
使用命令dumpsys activity taskinfo.txt 命令 将打印出的结果输出到taskinfo.txt文件中,方便导出到电脑查看.
1.首先在磁盘的根目录建立一个taskinfo.txt的文件:
shell@NX601J:/storage/sdcard0 $ touch taskinfo.txt
2.然后通过命令将结果输出到这个文件中:
shell@NX601J:/storage/sdcard0 $ dumpsys activity /storage/sdcard0/taskinfo.txt
命令执行完成文件中就存入了各种任务信息(只截取了部分):
这个文件中存储了非常丰富的信息:
ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)
ACTIVITY MANAGER ConTENT PROVIDERS (dumpsys activity providers)
ACTIVITY MANAGER SERVICES (dumpsys activity services)
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)
Historical broadcasts [background]:
Running activities (most recent first):
Recent tasks:
通过字面意思就可以知道是什么吧?
找到我们想要的结果:
=================================================================
这样,通过执行俩次同样的操作就可以知道是否是同一个Activity了.
使用adb dumpsys 命令查看app占用内存
adb是一个非常强大的工具,使用adb查看应用程序内存使用情况可按如下格式在命令行里查看内存使用情况:
adb shell dumpsys meminfo package_name
其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,下图是某个程序的内存使用情况:
重点关注如下几个字段:
(1) Native/Dalvik 的 Heap 信息具体在上面的***行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
(2) Total 的 PSS 信息这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
dumpsys的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于dumpsys activity、dumpsys的信息别忘了在本站进行查找喔。