在平時(shí)開發(fā)中,通過(guò)命令行有時(shí)候能夠快速的幫我們實(shí)現(xiàn)一些功能几晤,這里對(duì)常用的命令做一些總結(jié)约炎。
1、AM命令用法
1.1蟹瘾、簡(jiǎn)單介紹
am指令是 activity manager的縮寫圾浅,可以啟動(dòng)Service、Broadcast热芹,殺進(jìn)程贱傀,監(jiān)控等功能,這些功能都非常便捷調(diào)試程序伊脓。
可以通過(guò)adb shell 進(jìn)入Android 的Linux命令界面府寒,輸入am -help查看詳細(xì)命令,先介紹幾個(gè)簡(jiǎn)單用法报腔,
//使用Action方式打開系統(tǒng)設(shè)置-輸入法設(shè)置
am start -a android.settings.INPUT_METHOD_SETTINGS
//使用Action方式打開網(wǎng)站https://amberweather.com
am start -a android.intent.action.VIEW -d https://amberweather.com
//打開撥號(hào)界面株搔,并傳遞一個(gè)DATA_URI數(shù)據(jù)給撥號(hào)界面
am start -a android.intent.action.CALL -d tel:10086
1.2、AM命令
命令格式如下
am [command] [options]
命令列表:
命令 | 功能 | 實(shí)現(xiàn)方法 |
---|---|---|
am start [options] | 啟動(dòng)Activity | startActivityAsUser |
am startservice | 啟動(dòng)Service | startService |
am stopservice | 停止Service | stopService |
am broadcast | 發(fā)送廣播 | broadcastIntent |
am restart | 重啟 | restart |
am dumpheap <pid> <file> | 進(jìn)程pid的堆信息輸出到file | dumpheap |
am send-trim-memory <pid> <level> | 收緊進(jìn)程的內(nèi)存 | setProcessMemoryTrimLevel |
am kill <PACKAGE> | 殺指定后臺(tái)進(jìn)程 | killBackgroundProcesses |
am kill-all | 殺所有后臺(tái)進(jìn)程 | killAllBackgroundProcesses |
am force-stop <PACKAGE> | 強(qiáng)殺進(jìn)程 | forceStopPackage |
am hang | 系統(tǒng)卡住 | hang |
am monitor | 監(jiān)控 | MyActivityController.run |
原理分析:am命令實(shí)的實(shí)現(xiàn)方式在Am.java纯蛾,最終幾乎都是調(diào)用ActivityManagerService相應(yīng)的方法來(lái)完成的纤房,am monitor除外。比如前面概述中介紹的命令am start -a android.intent.action.VIEW -d https://amberweather.com翻诉, 啟動(dòng)Acitivty最終調(diào)用的是ActivityManagerService類的startActivityAsUser()方法來(lái)完成的炮姨。再比如am kill-all命令,最終的實(shí)現(xiàn)工作是由ActivityManagerService的killBackgroundProcesses()方法完成的碰煌。
下面說(shuō)一下[options]和 <INTENT>參數(shù)的意義以及如何正確取值舒岸。
1.3、 Options
1.3.1 啟動(dòng)Activity
主要是啟動(dòng)Activity命令am start [options] <INTENT>使用options參數(shù)芦圾,接下來(lái)列舉Activity命令的[options]參數(shù):
-D:開啟debug模式
-W:等待啟動(dòng)完成
--start-profiler<FILE>:將profiler中的結(jié)果輸出到指定文件中
-P:和--start-profiler一樣蛾派,區(qū)別在于,在app進(jìn)入idle狀態(tài)時(shí)profiler結(jié)束
-R <Count>: 重復(fù)啟動(dòng)Activity,但每次重復(fù)啟動(dòng)都會(huì)關(guān)閉掉最上面的Activity
-S:關(guān)閉Activity所屬的App進(jìn)程后再啟動(dòng)Activity
--opengl-trace:開啟OpenGL tracing
--user <USER_ID> :使用指定的用戶來(lái)啟動(dòng)activity洪乍,如果不輸入眯杏,則使用當(dāng)前用戶執(zhí)行
啟動(dòng)Activity的實(shí)現(xiàn)原理: 存在-W參數(shù)則調(diào)用startActivityAndWait()方法來(lái)運(yùn)行,否則startActivityAsUser()壳澳。
1.3.2 收緊內(nèi)存
命令
am send-trim-memory <pid> <level>
例如: 向pid=12345的進(jìn)程岂贩,發(fā)出level=RUNNING_LOW的收緊內(nèi)存命令
am send-trim-memory 12345 RUNNING_LOW。
level取值范圍為: HIDDEN钾埂、RUNNING_MODERATE河闰、BACKGROUND、RUNNING_LOW褥紫、MODERATE、RUNNING_CRITICAL瞪慧、COMPLETE
1.3.3 其他
am的子命令髓考,startservice, stopservice, broadcast, kill, profile start, profile stop, dumpheap的可選參數(shù)都允許設(shè)置--user <USER_ID>。目前市面上的絕大多數(shù)手機(jī)還是單用戶模式弃酌,因此可以忽略該參數(shù)氨菇,默認(rèn)為當(dāng)前用戶。
例如:?jiǎn)?dòng)id=10001的用戶的指定service妓湘。
am startservice --user 10010 [Intent]
1.4 Intent
Intent的參數(shù)和flags較多查蓉,為了方便,這里分為3種類型參數(shù)榜贴,常用參數(shù)豌研,Extra參數(shù),F(xiàn)lags參數(shù)
1.4.1 常用參數(shù)
-a <ACTION>: 指定Intent action唬党, 實(shí)現(xiàn)原理Intent.setAction()鹃共;
-n <COMPONENT>: 指定組件名,格式為{包名}/.{主Activity名}驶拱,實(shí)現(xiàn)原理Intent.setComponent()霜浴;
-d <DATA_URI>: 指定Intent data URI
-t <MIME_TYPE>: 指定Intent MIME Type
-c <CATEGORY> [-c <CATEGORY>] ...]:指定Intent category,實(shí)現(xiàn)原理Intent.addCategory()
-p <PACKAGE>: 指定包名蓝纲,實(shí)現(xiàn)原理Intent.setPackage();
-f <FLAGS>: 添加flags阴孟,實(shí)現(xiàn)原理Intent.setFlags(int ),緊接著的參數(shù)必須是int型税迷;
實(shí)例
am start -a android.intent.action.VIEW
am start -n mobi.infolife.ezweather.locker.locker_2/.LockerActivity
am start -d content://contacts/people/1
am start -t image/png
am start -c android.intent.category.APP_CONTACTS
1.4.2 Extra參數(shù)
(1). 基本類型
參數(shù) | -e/-es | -esn | -ez | -ei | -el | -ef | -eu |
---|---|---|---|---|---|---|---|
類型 | String | (String) | boolean | int | long | float | uri |
參數(shù)es是Extra String首字母簡(jiǎn)稱永丝,實(shí)例:
am start -n com.cnr.tlive/.MainActivity -es test
(2). 數(shù)組類型
參數(shù) | -esa | -eia | -ela | -efa |
---|---|---|---|---|
數(shù)組類型 | <span class="Apple-tab-span" style="white-space:pre"></span>String[] | int[] | long[] | float[] |
參數(shù)eia,是Extra int array首字母簡(jiǎn)稱翁狐,多個(gè)value值之間以逗號(hào)隔開类溢,實(shí)例:
am start -n com.cnr.tlive/com.cnr.tlive.activity.MainActivity -ela day 1,2,3,4,5
(3). ArrayList類型
參數(shù) | -esal | -eial | -elal | -efal |
---|---|---|---|---|
List類型 | String | int | long | float |
參數(shù)efal,是Extra float Array List首字母簡(jiǎn)稱,多個(gè)value值之間以逗號(hào)隔開闯冷,實(shí)例:
am start -n com.cnr.tlive.activity.MainActivity-efal nums 1.2,2.2
2砂心、PM命令用法
2.1、簡(jiǎn)單介紹
pm工具為包管理(package manager)的簡(jiǎn)稱蛇耀,可以使用pm工具來(lái)執(zhí)行應(yīng)用的安裝和查詢應(yīng)用寶的信息辩诞、系統(tǒng)權(quán)限、控制應(yīng)用纺涤,pm工具是Android開發(fā)與測(cè)試過(guò)程中必不可少的工具译暂,shell命令格式如下:
pm <command>
命令 | 功能 | 實(shí)現(xiàn)方法 |
---|---|---|
list packages | 列舉app包信息 | PMS.getInstalledPackages |
install [options] <PATH> | 安裝應(yīng)用 | PMS.installPackageAsUser |
uninstall [options]<package> | 卸載應(yīng)用 | IPackageInstaller.uninstall |
enable <包名或組件名> | enable | PMS.setEnabledSetting |
disable <包名或組件名> | disable | PMS.setEnabledSetting |
hide <package> | 隱藏應(yīng)用 | PMS.setApplicationHiddenSettingAsUser |
unhide <package> | 顯示應(yīng)用 | PMS.setApplicationHiddenSettingAsUser |
get-install-location | 獲取安裝位置 | PMS.getInstallLocation |
set-install-location | 設(shè)置安裝位置 | PMS.setInstallLocation |
path <package> | 查看App路徑 | PMS.getPackageInfo |
clear <package> | 清空App數(shù)據(jù) | AMS.clearApplicationUserData |
get-max-users | 最大用戶數(shù) | UserManager.getMaxSupportedUsers |
force-dex-opt <package> | dex優(yōu)化 | PMS.forceDexOpt |
dump <package> | dump信息 | AM.dumpPackageStateStatic |
trim-caches <目標(biāo)size> | 緊縮cache目標(biāo)大小 | PMS.freeStorageAndNotify |
原理分析:pm命令實(shí)的實(shí)現(xiàn)方式在Pm.java,最后大多數(shù)都是調(diào)用PackageManagerService相應(yīng)的方法來(lái)完成的撩炊。disbale之后外永,在桌面和應(yīng)用程序列表里邊都看到不該app。
2.2拧咳、詳細(xì)參數(shù)
2.2.1 list packages
查看所有的package伯顶,
list packages [options] <FILTER>
[options]參數(shù):
-f: 顯示包名所關(guān)聯(lián)的文件;
-d: 只顯示disabled包名骆膝;
-e: 只顯示enabled包名祭衩;
-s: 只顯示系統(tǒng)包名;
-3: 只顯示第3方應(yīng)用的包名阅签;
-i: 包名所相應(yīng)的installer;
-u: 包含uninstalled包名.
disabled + enabled = 總應(yīng)用個(gè)數(shù)掐暮; 系統(tǒng) + 第三方 = 總應(yīng)用個(gè)數(shù)。
查看第3方應(yīng)用:
pm list packages -3
查看已經(jīng)被禁用的包名
pm list packages -d
<FILTER>參數(shù)
當(dāng)FILTER為不為空時(shí)政钟,則只會(huì)輸出包名帶有FILTER字段的應(yīng)用路克;當(dāng)FILTER為空時(shí),則默認(rèn)顯示所有滿足條件的應(yīng)用锥涕。
例如衷戈,查看包名帶有weather字段的包名
pm list packages weather
2.2.3 pm Install
pm install [options] <PATH>
[options]參數(shù):
-r: 覆蓋安裝已存在Apk,并保持原有數(shù)據(jù)层坠;
-d: 運(yùn)行安裝低版本Apk;
-t: 運(yùn)行安裝測(cè)試Apk
-i : 指定Apk的安裝器殖妇;
-s: 安裝apk到共享快存儲(chǔ),比如sdcard;
-f: 安裝apk到內(nèi)部系統(tǒng)內(nèi)存破花;
-l: 安裝過(guò)程谦趣,持有轉(zhuǎn)發(fā)鎖
-g: 準(zhǔn)許Apk manifest中的所有權(quán)限;
<PATH>參數(shù): 指的是需要安裝的apk所在的路徑
2.2.4其他參數(shù)
pm list users //查看當(dāng)前手機(jī)用戶
pm list libraries //查看當(dāng)前設(shè)備所支持的庫(kù)
pm list features //查看系統(tǒng)所有的features
pm list instrumentation //所有測(cè)試包的信息
pm list permission-groups //查看所有的權(quán)限組
pm list permissions [options] <group> 查看權(quán)限
-g: 以組形式組織座每;
-f: 打印所有信息前鹅;
-s: 簡(jiǎn)要信息;
-d: 只列舉危險(xiǎn)權(quán)限峭梳;
-u: 只列舉用戶可見(jiàn)的權(quán)限舰绘。
3蹂喻、dumpsys
3.1 dumpsys原理簡(jiǎn)介
dumpsys是Android自帶的強(qiáng)大debug工具,從名字就可以看出,主要是用于dump 當(dāng)前android system的一些信息,是一項(xiàng)分析手機(jī)問(wèn)題捂寿,運(yùn)行狀態(tài)口四,使用情況等十分有效的手段。
實(shí)現(xiàn)原理
dumpsys的源碼結(jié)構(gòu)其實(shí)很簡(jiǎn)單秦陋,只有一個(gè)dumpsys.cpp
/frameworks/native/cmds/dumpsys/dumpsys.cpp
int main(int argc, char* const argv[])
{
...
//獲取defaultServiceManager
sp<IServiceManager> sm = defaultServiceManager();
...
Vector<String16> services;
...
services = sm->listServices();
...
const size_t N = services.size();
for (size_t i=0; i<N; i++) {
sp<IBinder> service = sm->checkService(services[i]);
...
int err = service->dump(STDOUT_FILENO, args);
...
}
return 0;
}
先通過(guò)defaultServiceManager()函數(shù)獲得ServiceManager對(duì)象蔓彩,然后根據(jù)dumpsys傳進(jìn)來(lái)的參數(shù)通過(guò)函數(shù)checkService來(lái)找到具體的service, 并執(zhí)行該service的dump方法,達(dá)到dump service的目的驳概。
3.2 dumpsy命令
3.2.1 服務(wù)列表
不同的Android系統(tǒng)版本支持的命令有所不同赤嚼,可通過(guò)下面命令查看當(dāng)前手機(jī)所支持的dump服務(wù),先進(jìn)入adb shell顺又,再執(zhí)行如下命令:dumpsys -l更卒。 這些服務(wù)名可能并看不出其調(diào)用的哪個(gè)服務(wù),可以通過(guò)下面指令:service list稚照。
服務(wù)列表有很多逞壁,這里簡(jiǎn)單介紹幾種
服務(wù)名 | 類名 | 功能 | |
---|---|---|---|
activity | ActivityManagerService | AMS相關(guān)信息 | |
package | PackageManagerService | PMS相關(guān)信息 | |
window | WindowManagerService | WMS相關(guān)信息 | |
input | InputManagerService | IMS相關(guān)信息 | |
power | PowerManagerService | PMS相關(guān)信息 | |
battery | BatteryService | 電池信息 | |
dropbox | DropboxManagerService | <div>調(diào)試相關(guān)</div> | |
cpuinfo | CpuBinder | CPU | |
meminfo | MemBinder | 內(nèi)存 | |
dbinfo | DbBinder | 數(shù)據(jù)庫(kù) |
3.2.2 查詢服務(wù)
通過(guò)下面命令可打印具體某一項(xiàng)服務(wù):dumpsys <service>,其中service便是前面表格中的服務(wù)名
dumpsys cpuinfo //打印一段時(shí)間進(jìn)程的CPU使用百分比排行榜
dumpsys meminfo -h //查看dump內(nèi)存的幫助信息
dumpsys package <packagename> //查看指定包的信息
接下來(lái)主要說(shuō)下dumpsys activity 用法
3.3 Activity
命令
dumpsys activity [options] [cmd]
options可選值
-a:dump所有;
-c:dump客戶端屡江;
-p [package]:dump指定的包名痊乾;
-h:輸出幫助信息;
dumpsys activity等價(jià)于依次輸出下面7條指令:
dumpsys activity intents
dumpsys activity broadcasts
dumpsys activity providers
dumpsys activity services
dumpsys activity recents
dumpsys activity activities
dumpsys activity processes
cmd可選值
cmd | 說(shuō)明 | 縮寫 |
---|---|---|
activities | activity狀態(tài) | a |
broadcasts | 廣播<span class="Apple-tab-span" style="white-space:pre"></span> | b |
intents | pending intent狀態(tài) | i |
processes | 進(jìn)程 | p |
oom | 內(nèi)存溢出 | o |
services | Service狀態(tài) | s |
providers | ContentProvider狀態(tài)<span class="Apple-tab-span" style="white-space:pre"></span> | prov |
provider | ContentProvider狀態(tài)(Client端) | |
package | package相關(guān)信息 | |
all | 所有的activities信息 | |
recents | recent activity狀態(tài) | |
top | top activity信息 |
注:
cmd:上表加粗項(xiàng)是指直接跟包名逾雄,另外services和providers還可以跟組件名;
縮寫:基本都是cmd首字母或者前幾個(gè)字母,用cmd和縮寫是等效: dumpsys activity broadcasts 和 dumpsys activity b 等效
3.4 dumpsys meminfo
命令
dumpsys meminfo
返回結(jié)果
Total PSS by process://以process來(lái)劃分
122677 kB: com.android.browser (pid 5807 / activities)
96473 kB: system (pid 661)
93999 kB: com.android.systemui (pid 745)
90564 kB: mobi.infolife.ezweather.locker.locker_2 (pid 1115 / activities)
56021 kB: mobi.infolife.ezweather.widget.soccer_season (pid 1745)
50044 kB: mobi.infolife.ezweather.widget.gcolour (pid 5147)
40171 kB: com.android.launcher3 (pid 887 / activities)
...
Total PSS by OOM adjustment: //以oom來(lái)劃分.
112247 kB: Native
34819 kB: local_opengl (pid 231)
24076 kB: zygote (pid 342)
17226 kB: mediaserver (pid 340)
9041 kB: genybaseband (pid 138)
3881 kB: logd (pid 115)
2071 kB: wpa_supplicant (pid 872)
1976 kB: genyd (pid 132)
1678 kB: drmserver (pid 238)
1648 kB: surfaceflinger (pid 339)
1444 kB: vold (pid 122)
1330 kB: sdcard (pid 736)
1118 kB: netd (pid 338)
864 kB: adbd (pid 136)
768 kB: debuggerd (pid 236)
763 kB: keystore (pid 241)
724 kB: /init (pid 1)
Total PSS by category:// 以category劃分
216031 kB: Native
169950 kB: Dalvik
121137 kB: .dex mmap
73616 kB: Ashmem
68426 kB: Unknown
64952 kB: .apk mmap
63304 kB: .so mmap
53932 kB: .oat mmap
27704 kB: .art mmap
15919 kB: Other mmap
14777 kB: Dalvik Other
9222 kB: .ttf mmap
8548 kB: Stack
148 kB: Other dev
0 kB: Cursor
0 kB: Gfx dev
0 kB: .jar mmap
0 kB: EGL mtrack
0 kB: GL mtrack
0 kB: Other mtrack
Total RAM: 4049068 kB (status normal)//整體情況
Free RAM: 3105215 kB (65839 cached pss + 503700 cached kernel + 2535676 free)
Used RAM: 1020031 kB (841827 used pss + 178204 kernel)
Lost RAM: -76178 kB
Tuning: 96 (large 256), oom 184320 kB, restore limit 61440 kB (high-end-gfx)
上面的輸出結(jié)果可以分為以下四個(gè)部分
PSS- Proportional Size 實(shí)際使用的物理內(nèi)存(比例分配共享庫(kù)占用的內(nèi)存)
按比例包含共享庫(kù)所占用的內(nèi)存斤彼,比如有9k的共享庫(kù)被3個(gè)進(jìn)程使用,那個(gè)當(dāng)前進(jìn)程所占用的大小被計(jì)算為9/3k蘸泻,也就是3k
-序列 | 劃分類型 | 排序 | 解釋 |
---|---|---|---|
1 | process | PSS | 以進(jìn)程的PSS從大到小依次排序顯示琉苇,每行顯示一個(gè)進(jìn)程; |
2 | OOM adj | PSS | Native/System/Persistent/Foreground/Visible/Perceptible/A Services/Home/B Services/Cached悦施,分別顯示每類的進(jìn)程情況 |
3 | category | PSS | 以Dalvik/Native/.art mmap/.dex map等劃分的各類進(jìn)程的總PSS情況 |
4 | total | - | 總內(nèi)存并扇、剩余內(nèi)存、可用內(nèi)存抡诞、其他內(nèi)存 |
也可以只輸出某個(gè)pid或package的進(jìn)程信息:
dumpsys meminfo <pid> // 輸出指定pid的某一進(jìn)程
dumpsys meminfo --package <packagename> // 輸出指定包名的進(jìn)程穷蛹,可能包含多個(gè)進(jìn)程
3.4 使用場(chǎng)景
下面以AmberLocker作為實(shí)例進(jìn)行分析
場(chǎng)景1:查詢某個(gè)App所有的Service狀態(tài)
dumpsys activity s mobi.infolife.ezweather.locker.locker_2
解讀: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數(shù)據(jù)路徑)
運(yùn)行在進(jìn)程pid=1115,進(jìn)程名為進(jìn)程名為mobi.infolife.ezweather.locker.locker_2顷窒,蛙吏,uid=10060,還有創(chuàng)建時(shí)間等信息
場(chǎng)景2:查詢某個(gè)App所有的廣播狀態(tài)
dumpsys activity b mobi.infolife.ezweather.locker.locker_2
場(chǎng)景3:查詢某個(gè)App所有的Activity狀態(tài)
dumpsys activity a mobi.infolife.ezweather.locker.locker_2
場(chǎng)景4:查詢某個(gè)App的進(jìn)程狀態(tài)
dumpsys activity p mobi.infolife.ezweather.locker.locker_2
格式:ProcessRecord{Hashcode pid:進(jìn)程名/uid},進(jìn)程pid=941,進(jìn)程名為mobi.infolife.ezweather.locker.locker_2:live鸦做,uid=10060.
該進(jìn)程中還有Services励烦,Connections, Providers, Receivers,
場(chǎng)景5:查詢棧頂Activity
dumpsys activity | grep mFocusedActivity
dumpsys 的命令還有很多馁龟,這里就不一一列舉了崩侠。