昨天寫了Android的開發(fā)如何初始化環(huán)境配置,今天繼續(xù)說說Android開發(fā)調(diào)試的幾大工具,主要是adb fastboot 和emulator。一般使用eclipse進行開發(fā)的Android開發(fā)者也許完全不需要用到這幾個命令,但是,若要了解到系統(tǒng)內(nèi)部,工具無疑就是解剖Android的手術(shù)刀。
Android的NAND結(jié)構(gòu)與Root的過程
Android的刷機、Root、開發(fā)調(diào)試過程中不可避免的涉及到Android的NAND(翻譯做閃存?)。耳熟能詳?shù)闹饕獛状蠓謪^(qū)有boot、system、userdata、和recovery。
system、userdata分區(qū)在Android文件系統(tǒng)中被掛載為/system和/data目錄,這兩個目錄在使用調(diào)試工具adb的時候可以看得到,/data允許進行讀寫,主要存放用戶自安裝的程序以及使用設(shè)備產(chǎn)生的用戶個人數(shù)據(jù),system目錄存放系統(tǒng)的文件以及預裝的重要的系統(tǒng)應用,掛載到文件系統(tǒng)中不允許讀寫(除非設(shè)備被Root)。boot分區(qū)則存放操作系統(tǒng)的內(nèi)核和initrd。recovery分區(qū)包含了一套后備的系統(tǒng),主要在設(shè)備升級、備份、維護的時候使用,簡單的說,要刷ROM需要進入recovery模式。
在設(shè)備的正常工作狀態(tài)(即是設(shè)備沒有被Root的時候)下,只有userdata和cache分區(qū)是可讀寫的,其他分區(qū)則一般處在只讀狀態(tài)。這種設(shè)計的本意是保護系統(tǒng)以及系統(tǒng)的重要程序不被惡意纂改,保證系統(tǒng)的安全性,但是,當recovery分區(qū)上的recovery.img被覆蓋成另一個版本(例如ClockWorkMod recovery image),recovery分區(qū)上的NAND保護機制被破壞了,NAND的分區(qū)就完全失去了保護,可以自由的更新system.img和boot.img,此時,可以說設(shè)備被Root了,或者說Nand處在"解鎖(unlocked)"狀態(tài)。因此,Android智能手機用戶自己動手Root手機設(shè)備以及使用網(wǎng)上下載的手機文件來更新Nand(刷機),這是危險的舉動。
fastboot的用法
1、手機首先要進入fastboot狀態(tài)/recovery模式下,有些設(shè)備必須確保設(shè)備處在S-OFF (security off)狀態(tài)。 下面以華為的C8500設(shè)備來說明。
a:首先關(guān)機
b:按住“音量減鍵”不放開,按住紅色“掛斷鍵”不放開(請一直不要放開按住的“音量減鍵”),按住“電源鍵”不放開(請一直不要放開按住的“音量減鍵”與紅色“掛斷鍵”)
c:持續(xù)按住大約五秒鐘(三鍵同時按?。?手機顯示停頓在華為Logo畫面(手機主界面并沒有繼續(xù)啟動,即一直停頓在華為Logo開機畫面),即表示手機進入fastboot模式
2、下面這幾個命令刷寫NAND的主要分區(qū),并重啟。
fastboot flash userdata data.img
fastboot flash system system.img
fastboot flash boot boot.img
fastboot reboot
3、刷寫recovery分區(qū)并重啟
fastboot flash recovery /path/to/.img
fastboot reboot 4、擦除分區(qū)
fastboot erase boot
fastboot erase recovery
ADB的用法
刷機完成后,在日常開發(fā)調(diào)試過程中,最重要的工具是adb(Android Debug Bridge),這個工具位于android-sdk-linux/platform-tools目錄下。豌豆夾之類的軟件是基于adb的底層機制做成的應用(由于這種應用和adb一樣需要設(shè)備工作在開發(fā)調(diào)試模式下,相信Android官方其實不想鼓勵這種應用)。
ADB的用法說明:
1、使用USB連接線連接ubuntu和智能手機設(shè)備,并在設(shè)備上打開調(diào)試模式。設(shè)置->應用程序->開發(fā)->USB調(diào)試選項打勾。
2、adb devices能夠看到設(shè)備的狀態(tài),adb shell能夠連接上去設(shè)備看到一個linux的系統(tǒng),使用ls還能看到文件目錄
~/android/sdk/android-sdk-linux/platform-tools$ ./adb devices List of devices attached 0A3AABB70502A00Adevice
~/android/sdk/android-sdk-linux/platform-tools$ ./adb shell
# ls acct init sd-ext cache init.c8500.rc sdcard config init.goldfish.rc sys d init.rc system data mnt ueventd.goldfish.rc default.prop proc ueventd.huawei.rc dev root ueventd.rc
etc sbin vendor
3、上傳下載文件
adb pull adb push
4、查看日志
~/android/sdk/android-sdk-linux/platform-tools$ ./adb shell
#logcat ActivityManager:I *:S
04-12 16:01:03.255 1262 1272 I ActivityManager: Start proc com.tencent.mm for broadcast com.tencent.mm/.booter.NotifyReceiver: pid=25676 uid=10188 gids={1006, 3003, 1015} 04-12 16:01:03.482 1262 1290 I ActivityManager: Displayed activity com.android.settings/.ApplicationSettings: 323 ms (total 323 ms)
......
4、運行系統(tǒng)上的命令,進入adb shell,可以查看到/system/bin有可運行的系統(tǒng)命令使用,此處以sqlite3為例,獲取應用的用戶數(shù)據(jù)(被Root的機器,好危險呀)。
$ adb -s emulator-5554 shell # sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db SQLite version 3.3.12 Enter ".help" for instructions .... enter commands, then quit... sqlite> .exit
emulator的用法
emulator一般的Android開發(fā)人員也許不會了解到,原因是萬能的eclipse IDE配置好了之后,開發(fā)人員就直接寫應用,然后在IDE上運行調(diào)試去了。這無疑很大程度的降低了開發(fā)人員的技術(shù)門檻。emulator位于android-sdk-linux/tools目錄下,相關(guān)的官方文檔:
命令行下創(chuàng)建虛擬硬件設(shè)備:
~/android/sdk/android-sdk-linux/tools$ ./android create avd -n my_android2.3 -t 3
Auto-selecting single ABI armeabi Android 2.3.3 is a basic Android platform. Do you wish to create a custom hardware profile [no] Created AVD 'my_android2.3' based on Android 2.3.3, ARM (armeabi) processor, with the following hardware config: hw.lcd.density=240 vm.heapSize=24 hw.ramSize=256
命令行下運行模擬器,可以看到一個基于qemu虛擬機上運行的android模擬設(shè)備的運行界面:
~/android/sdk/android-sdk-linux/tools$ ./emulator -avd my_android2.3
用模擬器加載非系統(tǒng)缺省的調(diào)試NAND文件,創(chuàng)建好虛擬硬件設(shè)備后,使用emulator的參數(shù)指定第三方NAND分區(qū)文件。例如,下面的命令指定了自編譯出來的各種文件:
./emulator -avd my_emulator_avd -system ~/cyanogenmod/out/target/product/c8500/system.img -data ~/cyanogenmod/out/target/product/c8500/userdata.img -kernel ~/cyanogenmod/out/target/product/c8500/kernel -ramdisk ~/cyanogenmod/out/target/product/c8500/ramdisk.img -debug all
|