前言
Android的adb提供了很多命令,功能很強大,可以為開發和調試帶來很大的便利。當然本文並不是介紹各種命令的文章,而是用於記錄在平時工作中需要經常使用的命令,方便平時工作時使用,所以以后會持續新增一些常用而且很有用的命令。也希望這些命令能給讀者帶來一定的幫助。
當前已經記錄的命令主要涉及到如下功能:
一、常用的與Permission相關的adb命令
二、通過Wifi連接連接手機
三、adb操作四大組件
四、實現一個操作多條adb命令的腳本
五、用adb dump一些信息
六、adb與進程
一、常用的與Permission相關的adb命令
Android工具adb提供了一些命令,可以方便查看、授權、取消應用的權限,可以為調試程序帶來不少的方便,下面簡單介紹幾個常見的命令。
1、查看指定app中權限申請情況
命令:adb shell dumpsys package [包名]
用途:該命令用於獲取該app的package信息,Permission信息只是其中的一部分。
命令使用示例:
1 adb shell dumpsys package cn.aaa.bbb
如下下截圖為該命令中關於權限的部分信息:
該圖顯示了4部分權限:
(1)declared permissions。該應用自己聲明(即自定義)的權限,這里顯示了權限名,權限等級,以及在什么時候獲取該權限(INSTALLED 表示安裝的時候就會授予該權限)。
(2)requested permissions。這里列出的是AndroidManifest.xml文件中所有request的權限,可以看出這里面包含了動態申請的權限和安裝時申請的權限。
(3)install permissions:安裝的時候就賦予的權限。可以和requested permissions對比一下,這里面少了一"android.permission.CAMERA"權限,該權限為動態申請權限。該列表中還展示了權限對應的授予情況,如granted所示,true表示已經被授予了權限。
(4)runtime permissions。這里顯示的是運行時才需要申請的權限,即dangerous permission。
2、查看權限的聲明者和使用者
命令:adb shell dumpsys package permission <權限名>
用途:該命令可以查看指定權限是誰聲明的,有哪些應用申請了該權限。
命令使用示例:
1 adb shell dumpsys package permission cn.aaa.bbb.TEST_PERMISSION
如下節選了該權限的定義信息和其中一個使用該權限的應用的關鍵信息:
1 Permissions: 2 Permission [cn.aaa.bbb.TEST_PERMISSION] (d4d8316): 3 sourcePackage=cn.aaa.bbb 4 uid=10078 gids=null type=0 prot=signature|privileged 5 perm=Permission{f5b497 cn.aaa.bbb.TEST_PERMISSION} 6 packageSetting=PackageSetting{96e1684 cn.aaa.bbb/10078} 7 8 Packages: 9 Package [cn.xxx.xxx] (5d0f51b): 10 ...... 11 declared permissions: 12 requested permissions: 13 install permissions: 14 cn.aaa.bbb.TEST_PERMISSION: granted=true 15 16 ......
3、移除指定權限
命令:adb shell pm revoke [packageName] [permissionName]
用途:移除packageName應用的permissionName權限(可以同時移除多項權限)。
命令使用示例(如下為刪除包名為cn.aaa.bbb 的相機權限):
1 adb shell pm revoke cn.aaa.bbb android.permission.CAMERA
執行完該命令后,用前文提到的命令“adb shell dumpsys package cn.aaa.bbb”查看該權限的信息如下:
通過實驗發現,該命令對runtime permissions有效,卻對install permissions無效,如以下異常信息所示:
4、授予指定權限
命令:adb shell pm grant [packageName] [permissionName]
用途:為packageName應用授予permissionName權限(可以同時授予多項權限)。該命令和上一條移除命令相對應。
參照上一條命令的實例,實驗結果如下:
5、查看系統定義的所有權限
命令:adb shell pm list permissions -s[option] 不加-s會顯系統中定義的所有權限名列表,加了-s會顯示對這些權限的用途說明。
下面截圖分別展示了命令不加-s和加了-s后的顯示結果(重定向到文本中查看),其中不加-s的截圖中,一共顯示了571條權限,這里截取了一部分,其中可以看到不少自定義的權限。
6、按組查看權限
命令:adb shell pm list permissions -d -g
用途:查看權限的分組情況。這部分是上面一條命令的補充,參數可以根據自己的需要選擇。
參考:【https://developer.android.google.cn/training/permissions/usage-notes#testing】
下列截圖為結果的一部分。
7、授予所有權限
命令:adb shell install -g MyApp.apk
用途:當安裝MyApp.apk到模擬器或測試機上時,如果加上-g,可以自動授予所有權限。這一點筆者沒有實驗過,讀者可以自行測試。
參考:該處和第4點一樣參考官網說明。
二、通過Wifi連接連接手機
有時候由於數據線異常等原因,導致電腦上連接不上手機,有時候會讓人很抓狂。還有一種情況,當通過USB連接手機時,會干擾手機界面,影響分析問題,比如手機上會顯示充電界面等。此時可以通過Wifi來連接手機,徹底擺脫數據線的困擾,從而放飛自我。這里簡單介紹一下具體操作步驟,前提條件是Wifi需要和電腦在同一個局域網。
(1)連接wifi,查看手機的ip地址
大多數人都知道電腦有IP地址,卻很少有人留意手機的IP地址。這提供兩種查看手機IP的方式,當然前提條件是先連接上Wifi。
1)在WIFI詳情中查看
依次進入 設置 》 WLAN,可以看到如下界面,依次進入到所選wifi的詳情,便可查看到IP地址。
2)在手機信息中查看
依次按照路徑 設置 》 關於手機 》 狀態信息 》 IP地址,便可在如下界面找到IP地址。
(2)給手機設置端口號
這一步需要先通過USB連接電腦(所以還是不能完全脫離數據線),通過命令 adb tcp ip 5555 來設置。默認填5555就可以了,我試過其他的,沒成功。
(3)連接手機
命令:adb connect [ip地址]
實例:
如果連接不成功,就在ip地址后面加上:5555端口號,再連一次。連接成功后,查看連接的設備,就能看到通過WIFI連接的手機了。
在AndroidStudio上就可以選擇該手機了,各種操作和用USB連接時都是一樣的。
(4)斷開連接
使用完后最好斷開連接,斷開命令為:adb disconnect [ip地址]
三、adb操作四大組件
1、adb 啟動activitry
命令:adb shell am start -n pkgname/activityPath(可以是全路徑,也可以是相對路徑)
如果成功,會看到界面被打開;如果失敗,會在命令行處顯示錯誤信息。
啟動activity和service還有一種action方式打開,暫時沒有實驗成功,暫不記錄。
2、adb 啟動service
命令:adb shell am startservice -n pkgname/servicepath(可以是全路徑,也可以是相對路徑)
3、adb 停止service
命令:adb shell am stopservice -n pkgname/servicepath
4、adb發送廣播
命令:adb shell am broadcast -a actionName --es EXTRA_KEY EXTRA_KEY_VALUE
說明: -a 表示action,-es表示附件的鍵值對參數,且參數值為string(-ei對應int,-ez對應boolean)
使用案例:
這句命令的作用就相當於執行了如下代碼:
1 Intent intent = new Intent(“com.songwei.broadcast.demo”); 2 intent.putExtra(“pkgname”,“com.example.demos”);
廣播接收到的信息為:
四、實現一個操作多條adb命令的腳本
有些固定操作需要執行多條adb命令,如果每次都手動輸入,會比較麻煩。如果寫一個腳本來自動執行,會方便很多。如下實現一個自動push SystemUI.apk的腳本:
adb root adb remount adb push ./SystemUI.apk system/priv-app/SystemUI adb shell sleep 1 adb reboot pause
五、用adb dump一些信息
1、查看內存信息
命令:adb shell dumpsys meminfo [進程名]
2、查看當前顯示的界面信息
命令:adb shell dumpsys window | findstr mCurrentFocus
六、adb與進程
1、查看進程
adb shell
ps -ef|grep [keyword] 關鍵字不用加引號,如下圖所示:
2、殺死進程
adb shell
kill -s -9 [pid] 示例如下所示:
3、一個查看ps來找到某個service的案例
需求:需要找到華為手機人臉解鎖功能所在的進程。
難點:使用人臉解鎖時,沒有對應的界面,判斷是一個service在執行該功能,所以無法dump出window信息。
分析:對於沒有界面的功能,可以通過logcat,根據關鍵字段推斷所在進程號,然后通過進程號,結合ps命令可以查到對應的進程名,進而推斷所在模塊。例如:在華為機器上判斷人臉解鎖在哪個模塊,先獲取一份Log記錄,如下所示:
通過tag名稱,可以判斷 FaceRecognizeService一行為該功能所輸出的log,這樣就找到了PID為1859。再結合ps命令,在命令行獲取進程名
這樣就推斷出該功能所在的進程名為com.huawei.systemserver,為框架模塊。從前面log中的“package = com.android.systemui”,也可以推斷是SystemUI啟動了該功能。