前言
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會顯示對這些權限的用途說明。
參考:【Viewing an app's permissions:https://developer.android.google.cn/guide/topics/permissions/overview#viewing】
下面截圖分别展示了指令不加-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位址]
執行個體:
檢視連接配接的裝置,就能看到通過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啟動了該功能。
出處:javascript:void(0)
1 adb shell dumpsys package cn.aaa.bbb
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 ......
1 adb shell pm revoke cn.aaa.bbb android.permission.CAMERA
1 Intent intent = new Intent(“com.songwei.broadcast.demo”);
2 intent.putExtra(“pkgname”,“com.example.demos”);
adb root
adb remount
adb push ./SystemUI.apk system/priv-app/SystemUI
adb shell sleep 1
adb reboot
pause