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.MAINcat=[android.intent.category.LAUNCHER]flg=0x10200000cmp=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 http://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" +