淺談android的am命令

      android系統為大傢提供瞭adb工具,在adb的基礎上執行adb shell就可以從PC上對手機側執行shell命令。和pc的linux系統一樣,在系統的默認路徑syste/bin下面是可執行程序。一般常用的有getprop,setprop等。和常用的linux命令比較,android自帶的程序還是少瞭諸如find等常見命令。不過可以下載busybox程序,推送到android的system/bin目錄下,修改這個程序的權限。即可增加一些常用的shell命令。不過使用這些命令的方式也有些不同,其執行格式如下:busybox find ………即在原有的命令前面增加busybox。
        android自帶的命令也有些linux本身沒有,而android特有的。linux下,查詢一個命令的使用一般是增加man命令,在android有些不同,工作中發現查詢絕大多數命令的使用方式是,直接輸入這個命令。比如shell環境下查看pm命令的使用方式,直接輸入pm按回車就行。另外android的命令常見使用方法如下: am [subcommand] [options],即命令後面跟著一個子命令,因為是子命令而不是參數,所以不用加-,而後面的參數就需要加-,比如am start -a ***,start在這裡就是子命令,-a在這裡就是參數。以上這些都是個人在平時工作中的總結,在總結的基礎上記憶起來就方便多瞭,如果有些地方因為知識面不夠說的不對,還請指出。
        接下來就主要講解幾個比較給力的android自帶的命令,首先是am。直接去看下am的代碼Am.java。每次在shell環境下執行am即啟動一個線程執行Am.java的主函數,這個主函數的主要實現都在run方法裡面,am命令後面帶的參數會當做運行時參數傳遞個主方法(使用java這麼久又一次見到給主函數傳遞參數,不容易),後面會根據傳入的參數不同,執行不同的條件分支。可以看到當參數的個數小於1的時候,就執行showUsage()方法,即說明am命令使用方式的方法,並且有最常用的參數intent的詳細使用說明。am命令中最常用到的是start命令,下面來看下這個命令的執行過程。
        代碼根據第一個參數判斷是否是start子命令,進入private void runStart() throws Exception方法,接著進入執行解析參數的關鍵方法 private Intent makeIntent(int defUser) throws URISyntaxException裡面。makeIntent裡面用while循環根據傳入的參數一點一點的配置即將使用的intent,大的比如intent的action,data小的比如flag,參數等。代碼很普通,沒有發現什麼牛逼的算法,但是很實用很清晰。感慨下,不是也不需要每個人都能牛逼的提出驚人的算法做出驚人的成就,把平凡的事情有條理的做好就非常瞭不起。回到runStart方法,首先是檢查am start是否接著-S(stop)參數,如果不是就跨進程調用am服務執行命令。到這裡am及其start子命令的執行過程基本介紹完瞭。
        說說常見使用am start命令的技巧,啟動某一個操作並且傳入數據方式如下:am -a "action" -d data,其中action可以到應用的配置文件裡面查詢;如果指定啟動某個應用,可以在後面增加-n,即component。-n後面接的數據格式是:包名/組件名稱。我們可以直接在am的log裡面看到啟動某個組件時候的amlog,其中cmp後面接的內容即可作為am start命令-n參數傳入的數據,如下面所示:

 

07-07 17:44:14.993: I/ActivityManager(222): START { 
act=android.intent.action.MAIN  
cat=[android.intent.category.LAUNCHER]  
flg=0x10200000  
cmp=com.android.contacts/.activities.PeopleActivity} from pid 16116 

07-07 17:44:14.993: I/ActivityManager(222): START {
act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER]
flg=0x10200000
cmp=com.android.contacts/.activities.PeopleActivity} from pid 16116

對上面的結論啟動activity,啟動service都可用。如啟動瀏覽器:am start -n com.android.browser/com.android.browser.BrowserActivity 或者是am start -a android.intent.action.VIEW -d https://www.google.cn/。

        最後附上筆者最喜歡用的幾個子命令及其參數的說明,掌握好這幾個命令,對於android的debug有很大的幫助。

                "am start: start an Activity.  Options are:\n" +
                "    -D: enable debugging\n" +
                "    -W: wait for launch to complete\n" +
                "    –start-profiler <FILE>: start profiler and send results to <FILE>\n" +
                "    -P <FILE>: like above, but profiling stops when app goes idle\n" +
                "    -R: repeat the activity launch <COUNT> times.  Prior to each repeat,\n" +
                "        the top activity will be finished.\n" +
                "    -S: force stop the target app before starting the activity\n" +
                "    –opengl-trace: enable tracing of OpenGL functions\n" +
                "    –user <USER_ID> | current: Specify which user to run as; if not\n" +
                "        specified then run as the current user.\n" +

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *