1. 程式人生 > >【爛筆頭】常用adb命令記錄

【爛筆頭】常用adb命令記錄

前言       

       Android的adb提供了很多命令,功能很強大,可以為開發和除錯帶來很大的便利。當然本文並不是介紹各種命令的文章,而是用於記錄在平時工作中需要經常使用的命令,方便平時工作時使用,所以以後會持續新增一些常用而且很有用的命令。也希望這些命令能給讀者帶來一定的幫助。

       當前已經記錄的命令主要涉及到如下功能:

       一、常用的與Permission相關的adb命令

       二、通過Wifi連線連線手機

       三、通過adb命令操作四大元件

       四、實現一個操作多條adb命令的指令碼

       五、用adb dump一些資訊

       六、adb與程序

 

一、常用的與Permission相關的adb命令

       Android工具adb提供了一些命令,可以方便檢視、授權、取消應用的許可權,可以為除錯程式帶來不少的方便,下面簡單介紹幾個常見的命令。

  1、檢視指定app中許可權申請情況

       命令:adb shell dumpsys package [包名]

       用途:該命令用於獲取該app的package資訊,Permission資訊只是其中的一部分。

       命令使用示例:

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 <許可權名>

       用途:該命令可以檢視指定許可權是誰宣告的,有哪些應用申請了該許可權。

      命令使用示例:

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 的相機許可權):

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在執行該功能,所以無法dump出window資訊。

       分析:對於沒有介面的功能,可以通過logcat,根據關鍵欄位推斷所在程序號,然後通過程序號,結合ps命令可以查到對應的程序名,進而推斷所在模組。例如:在華為機器上判斷人臉解鎖在哪個模組,先獲取一份Log記錄,如下所示:

         

       通過tag名稱,可以判斷 FaceRecognizeService一行為該功能所輸出的log,這樣就找到了PID為1859。再結合ps命令,在命令列獲取程序名

            

這樣就推斷出該功能所在的程序名為com.huawei.systemserver,為框架模組。從前面log中的“package = com.android.systemui”,也可以推斷是SystemUI啟動了該功能。

&n