本文主要講如下兩個內容。
1. 如何讓一部Android手機帶兩台PC進行調試。
2. 如何完美Root Android手機。
我曾經遇到過這樣的問題,Mac OS X上測試Android的系統程式,大家都知道,Android原始碼的編譯通常需要Ubuntu Linux,所以在Mac OS X上安裝了Vmware ubuntu。這樣本沒什麼問題。將Android手機與MBP相連,系統會提示串連Mac OS X,還是Ubuntu。不過這有一個問題,就是ubuntu和mac os x同時只能串連一個。由於某些需要,要用到Mac OS X上的Eclipse編寫Android應用,也能安裝在同一部Android手機上,這就很鬱悶,單單通過USB線只能串連一台PC(包括虛擬機器)。
從技術上說,adb完全有這個能力使一部Android手機串連到兩台PC上,不過可能大多數讀者用的ROM是官方,為了安全起見,將該功能關了。如果讀 者使用了最新的CM ROM(cm10.1,可能老的版本也有該功能,這個還沒測試),就會發現在設定的“開發人員選項”中多了一個“網路ADB調試”。1所示。這可是夢寐 以求的功能。
圖1
選擇“網路ADB調試”選項。然後記住下面的ip和連接埠號碼。在一台機器上用USB線串連手機,Eclipse的devices列表就會顯示該手機已串連成功。如果仍然用當前PC通過網路連接ADB,需要執行下面的命令(PC與手機在同一網段)。
adb kill-server
adb connect 192.168.17.103:5555
如果一切正常,就已經連上了,開啟Eclipse,會在devices列表看到2的裝置。
圖2
其實這兩個裝置是一個,只是上邊那個通過網路連接的手機,下邊那個通過USB線串連的手機。現在運行程式,仍然會看到要求選擇運行裝置,3所示。
圖3
其實現在選哪個都行,因為這兩個裝置只是通過不同方式與PC串連。
如果在不同的PC上(或PC和虛擬機器),一個通過USB線,一個通過網路。兩台機器中的eclipse就可以在同一部手機上偵錯工具了,是不是很爽呢!
如果要斷開網路adb串連,執行adb disconnect命令。
要注意,這一操作比較危險,一旦選擇“網路adb調試”,只要同一網段的其他使用者獲知IP和連接埠號碼,就可以任意操作你的手機,而且不會有任何提示。甚至是在地球的另一端(只要你們在同一個網段,包括VPN)。
現在進入第二個主題,如果完美擷取Android手機的ROM。由於前面使用的是CMROM(不知道CM ROM是什麼的上網自己查),所以這裡仍然討論CM ROM的root過程。
可能剛一接觸Android手機的讀者會感覺root一部手機很複雜,其實再簡單不過了。Root的基本原理就是在Android系統的/system /xbin目錄放一個su命令。用過su的linux使用者都知道su是什麼東西,一個提取root許可權的命令。如果讀者用的是CM ROM,在/system/xbin目錄已經有了su命令。而且在設定裡可以開啟root許可權(cm的低版本直接就開啟了root許可權),所以使用CM ROM,這一步可以省了。當然,如果使用的不是CM ROM,也好吧。下一個CM ROM壓縮包,將裡面的雜七雜八的東西都刪掉(包括核心鏡像boot.img),只保留system/xbin目錄中的su檔案(該檔案也可以上網找一個 現成的,或直接編譯android原始碼中的su也可以,預設是不帶這個命令的)和META-INF目錄,然後重新打包成update.zip。然後最好 刷一個clockworkmod recovery,這個比較好,update.zip不需要簽名驗證就可以刷。之後就可以在recovery模式下刷update.zip了。這個 update.zip並不是完整的ROM,只是一個升級包,目的是將su檔案放到/system/xbin目錄中(該目錄沒有root許可權是唯讀)。刷 完後,進入手機的shell(adb shell),然後執行su,發現原來的$變成了#,表明已經是root了,當然,有些目錄還是不可寫,例如,為了使system及其子目錄可寫,需要再 次執行下面的命令。
mount –o rw,remount /system
現在還有一個問題,就是通過adb shell進入Shell,預設仍然是$,這就有些麻煩,因為對於程式員來說,需要調試系統程式,要用adbremount命令使/system/app 目錄變成可寫的,然後可用adb push命令直接將apk檔案上傳到該目錄。但如果預設不是root,是不能執行該命令的(許可權不允許)。所以我們還需要做另外一件事,就是修改 Android系統根目錄的default.prop的內容,通常可以改成如下內容。
ro.adb.secure=0ro.secure=0ro.allow.mock.location=1ro.debuggable=1persist.sys.usb.config=mass_storage,adbpersist.service.adb.enable=1
最大的問題就是default.prop是記憶體檔案,改了也沒用,一重啟就會恢複原樣,而且只有重啟才會生效(好像進入了二難推理)。所以修改 default.prop檔案的方法是直接修改boot.img檔案。該檔案由兩部分組成:zImage和ramdisk.img。其中zImage就是 linux核心的二進位檔案。ramdisk.img是記憶體磁碟鏡像。該鏡像中就包含了被稱為Android第一個啟動並執行程式init。 default.prop檔案也包含在該鏡像中。下面就需要android原始碼和linux核心原始碼了。強烈建議使用CM提供的原始碼,因為CM團隊 已經為我們進行了完美的適配,所以只需要修改與業務相關的內容即可。現在讓我們向CM團隊致敬。
Android原始碼編譯後,在out目錄的相關子目錄錄產生了一個root目錄,該目錄中的內容就是ramdisk.img檔案解壓後的內容。現在找到default.prop檔案,並安著上面的內容修改該檔案。然後使用下面的命令重建ramdisk.img檔案。
mkbootfs root | minigzip > /ramdisk.img
接下來使用下面的命令重建boot.img檔案。
mkbootimg --kernel kernel --ramdisk ramdisk.img -o boot.img
其中kernel是核心二進位檔案,與zImage完全一樣。只是編譯android原始碼時將其命名為
ok, 現在可以進入bootloader模式,然後重新執行fastboot flash bootboot.img刷核心鏡像,然後再重啟手機,現在進入shell,ok,預設就是#了。退出shell,執行adb remount。就可以用adb push上傳檔案到/system的其他目錄了,如/system/app。