前言 html
Android的adb提供了不少命令,功能很強大,能夠爲開發和調試帶來很大的便利。固然本文並非介紹各類命令的文章,而是用於記錄在平時工做中須要常用的命令,方便平時工做時使用,因此之後會持續新增一些經常使用並且頗有用的命令。也但願這些命令能給讀者帶來必定的幫助。android
當前已經記錄的命令主要涉及到以下功能:shell
1、經常使用的與Permission相關的adb命令app
2、經過Wifi鏈接鏈接手機框架
3、adb操做四大組件tcp
4、實現一個操做多條adb命令的腳本ide
5、用adb dump一些信息工具
6、adb與進程post
1、經常使用的與Permission相關的adb命令測試
Android工具adb提供了一些命令,能夠方便查看、受權、取消應用的權限,能夠爲調試程序帶來很多的方便,下面簡單介紹幾個常見的命令。
一、查看指定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。
二、查看權限的聲明者和使用者
命令: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 ......
三、移除指定權限
命令: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無效,如如下異常信息所示:
四、授予指定權限
命令:adb shell pm grant [packageName] [permissionName]
用途:爲packageName應用授予permissionName權限(能夠同時授予多項權限)。該命令和上一條移除命令相對應。
參照上一條命令的實例,實驗結果以下:
五、查看系統定義的全部權限
命令:adb shell pm list permissions -s[option] 不加-s會顯系統中定義的全部權限名列表,加了-s會顯示對這些權限的用途說明。
下面截圖分別展現了命令不加-s和加了-s後的顯示結果(重定向到文本中查看),其中不加-s的截圖中,一共顯示了571條權限,這裏截取了一部分,其中能夠看到很多自定義的權限。
六、按組查看權限
命令:adb shell pm list permissions -d -g
用途:查看權限的分組狀況。這部分是上面一條命令的補充,參數能夠根據本身的須要選擇。
參考:【https://developer.android.google.cn/training/permissions/usage-notes#testing】
下列截圖爲結果的一部分。
七、授予全部權限
命令:adb shell install -g MyApp.apk
用途:當安裝MyApp.apk到模擬器或測試機上時,若是加上-g,能夠自動授予全部權限。這一點筆者沒有實驗過,讀者能夠自行測試。
參考:該處和第4點同樣參考官網說明。
2、經過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地址]
3、adb操做四大組件
一、adb 啓動activitry
命令:adb shell am start -n pkgname/activityPath(能夠是全路徑,也能夠是相對路徑)
若是成功,會看到界面被打開;若是失敗,會在命令行處顯示錯誤信息。
啓動activity和service還有一種action方式打開,暫時沒有實驗成功,暫不記錄。
二、adb 啓動service
命令:adb shell am startservice -n pkgname/servicepath(能夠是全路徑,也能夠是相對路徑)
三、adb 中止service
命令:adb shell am stopservice -n pkgname/servicepath
四、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」);
廣播接收到的信息爲:
4、實現一個操做多條adb命令的腳本
有些固定操做須要執行多條adb命令,若是每次都手動輸入,會比較麻煩。若是寫一個腳原本自動執行,會方便不少。以下實現一個自動push SystemUI.apk的腳本:
adb root adb remount adb push ./SystemUI.apk system/priv-app/SystemUI adb shell sleep 1 adb reboot pause
5、用adb dump一些信息
一、查看內存信息
命令:adb shell dumpsys meminfo [進程名]
二、查看當前顯示的界面信息
命令:adb shell dumpsys window | findstr mCurrentFocus
6、adb與進程
一、查看進程
adb shell
ps -ef|grep [keyword] 關鍵字不用加引號,以下圖所示:
二、殺死進程
adb shell
kill -s -9 [pid] 示例以下所示:
三、一個查看ps來找到某個service的案例
需求:須要找到華爲手機人臉解鎖功能所在的進程。
難點:使用人臉解鎖時,沒有對應的界面,判斷是一個service在執行該功能,因此沒法dump出window信息。
分析:對於沒有界面的功能,能夠經過logcat,根據關鍵字段推斷所在進程號,而後經過進程號,結合ps命令能夠查到對應的進程名,進而推斷所在模塊。例如:在華爲機器上判斷人臉解鎖在哪一個模塊,先獲取一份Log記錄,以下所示:
經過tag名稱,能夠判斷 FaceRecognizeService一行爲該功能所輸出的log,這樣就找到了PID爲1859。再結合ps命令,在命令行獲取進程名
這樣就推斷出該功能所在的進程名爲com.huawei.systemserver,爲框架模塊。從前面log中的「package = com.android.systemui」,也能夠推斷是SystemUI啓動了該功能。