本文主要講如下兩個內(nèi)容。
1.? 如何讓一部Android手機帶兩臺PC進行調(diào)試。
2.? 如何完美Root Android手機。
? ? 我曾經(jīng)遇到過這樣的問題,Mac OS X上測試Android的系統(tǒng)程序,大家都知道,Android源代碼的編譯通常需要Ubuntu Linux,所以在Mac OS X上安裝了Vmware ubuntu。這樣本沒什么問題。將Android手機與MBP相連,系統(tǒng)會提示連接Mac OS X,還是Ubuntu。不過這有一個問題,就是ubuntu和mac os x同時只能連接一個。由于某些需要,要用到Mac OS X上的Eclipse編寫Android應(yīng)用,也能安裝在同一部Android手機上,這就很郁悶,單單通過USB線只能連接一臺PC(包括虛擬機)。
?? 從技術(shù)上說,adb完全有這個能力使一部Android手機連接到兩臺PC上,不過可能大多數(shù)讀者用的ROM是官方,為了安全起見,將該功能關(guān)了。如果讀者使用了最新的CM ROM(cm10.1,可能老的版本也有該功能,這個還沒測試),就會發(fā)現(xiàn)在設(shè)置的“開發(fā)者選項”中多了一個“網(wǎng)絡(luò)ADB調(diào)試”。如圖1所示。這可是夢寐以求的功能。

????????????????????????????????????????????????????????? 圖1
????? 選擇“網(wǎng)絡(luò)ADB調(diào)試”選項。然后記住下面的ip和端口號。在一臺機器上用USB線連接手機,Eclipse的devices列表就會顯示該手機已連接成功。如果仍然用當前PC通過網(wǎng)絡(luò)連接ADB,需要執(zhí)行下面的命令(PC與手機在同一網(wǎng)段)。
?? adb kill-server
?? adb connect 192.168.17.103:5555
?? 如果一切正常,就已經(jīng)連上了,打開Eclipse,會在devices列表看到如圖2的設(shè)備。

????????????????????????????????????????????????????????? 圖2
????? 其實這兩個設(shè)備是一個,只是上邊那個通過網(wǎng)絡(luò)連接的手機,下邊那個通過USB線連接的手機?,F(xiàn)在運行程序,仍然會看到要求選擇運行設(shè)備,如圖3所示。

???????????????????????????????????????????????????????????????????????????????????????????? 圖3
????? 其實現(xiàn)在選哪個都行,因為這兩個設(shè)備只是通過不同方式與PC連接。
????? 如果在不同的PC上(或PC和虛擬機),一個通過USB線,一個通過網(wǎng)絡(luò)。兩臺機器中的eclipse就可以在同一部手機上調(diào)試程序了,是不是很爽呢!
???? 如果要斷開網(wǎng)絡(luò)adb連接,執(zhí)行adb disconnect命令。
??? 要注意,這一操作比較危險,一旦選擇“網(wǎng)絡(luò)adb調(diào)試”,只要同一網(wǎng)段的其他用戶獲知IP和端口號,就可以任意操作你的手機,而且不會有任何提示。甚至是在地球的另一端(只要你們在同一個網(wǎng)段,包括VPN)。
現(xiàn)在進入第二個主題,如果完美獲取Android手機的ROM。由于前面使用的是CMROM(不知道CM ROM是什么的上網(wǎng)自己查),所以這里仍然討論CM ROM的root過程。
???? 可能剛一接觸Android手機的讀者會感覺root一部手機很復雜,其實再簡單不過了。Root的基本原理就是在Android系統(tǒng)的/system/xbin目錄放一個su命令。用過su的linux用戶都知道su是什么東西,一個提取root權(quán)限的命令。如果讀者用的是CM ROM,在/system/xbin目錄已經(jīng)有了su命令。而且在設(shè)置里可以打開root權(quán)限(cm的低版本直接就打開了root權(quán)限),所以使用CM ROM,這一步可以省了。當然,如果使用的不是CM ROM,也好吧。下一個CM ROM壓縮包,將里面的雜七雜八的東西都刪掉(包括內(nèi)核鏡像boot.img),只保留system/xbin目錄中的su文件(該文件也可以上網(wǎng)找一個現(xiàn)成的,或直接編譯android源代碼中的su也可以,默認是不帶這個命令的)和META-INF目錄,然后重新打包成update.zip。然后最好刷一個clockworkmod recovery,這個比較好,update.zip不需要簽名驗證就可以刷。之后就可以在recovery模式下刷update.zip了。這個update.zip并不是完整的ROM,只是一個升級包,目的是將su文件放到/system/xbin目錄中(該目錄沒有root權(quán)限是只讀的)。刷完后,進入手機的shell(adb shell),然后執(zhí)行su,發(fā)現(xiàn)原來的$變成了#,表明已經(jīng)是root了,當然,有些目錄還是不可寫,例如,為了使system及其子目錄可寫,需要再次執(zhí)行下面的命令。
mount –o rw,remount /system
????? 現(xiàn)在還有一個問題,就是通過adb shell進入Shell,默認仍然是$,這就有些麻煩,因為對于程序員來說,需要調(diào)試系統(tǒng)程序,要用adbremount命令使/system/app目錄變成可寫的,然后可用adb push命令直接將apk文件上傳到該目錄。但如果默認不是root,是不能執(zhí)行該命令的(權(quán)限不允許)。所以我們還需要做另外一件事,就是修改Android系統(tǒng)根目錄的default.prop的內(nèi)容,通常可以改成如下內(nèi)容。
ro.adb.secure=0
ro.secure=0
ro.allow.mock.location=1
ro.debuggable=1
persist.sys.usb.config=mass_storage,adb
persist.service.adb.enable=1
?????? 最大的問題就是default.prop是內(nèi)存文件,改了也沒用,一重啟就會恢復原樣,而且只有重啟才能生效(好像進入了二難推理)。所以修改default.prop文件的方法是直接修改boot.img文件。該文件由兩部分組成:zImage和ramdisk.img。其中zImage就是linux內(nèi)核的二進制文件。ramdisk.img是內(nèi)存磁盤鏡像。該鏡像中就包含了被稱為Android第一個運行的程序init。default.prop文件也包含在該鏡像中。下面就需要android源代碼和linux內(nèi)核源代碼了。強烈建議使用CM提供的源代碼,因為CM團隊已經(jīng)為我們進行了完美的適配,所以只需要修改與業(yè)務(wù)相關(guān)的內(nèi)容即可?,F(xiàn)在讓我們向CM團隊致敬。
Android源代碼編譯后,在out目錄的相關(guān)子目錄錄生成了一個root目錄,該目錄中的內(nèi)容就是ramdisk.img文件解壓后的內(nèi)容?,F(xiàn)在找到default.prop文件,并安著上面的內(nèi)容修改該文件。然后使用下面的命令重新生成ramdisk.img文件。
mkbootfs root | minigzip > /ramdisk.img
接下來使用下面的命令重新生成boot.img文件。
mkbootimg --kernel kernel? --ramdisk ramdisk.img -o boot.img
其中kernel是內(nèi)核二進制文件,與zImage完全一樣。只是編譯android源代碼時將其命名為
ok,現(xiàn)在可以進入bootloader模式,然后重新執(zhí)行fastboot flash bootboot.img刷內(nèi)核鏡像,然后再重啟手機,現(xiàn)在進入shell,ok,默認就是#了。退出shell,執(zhí)行adb remount。就可以用adb push上傳文件到/system的其他目錄了,如/system/app。
- 前言
- Android深度探索(卷1):安裝C/C++交叉編譯環(huán)境
- 開發(fā)可統(tǒng)計單詞個數(shù)的Android驅(qū)動程序(1)
- 《Android深度探索(卷1):HAL與驅(qū)動開發(fā)》新書發(fā)布
- 開發(fā)可統(tǒng)計單詞個數(shù)的Android驅(qū)動程序(2)
- 開發(fā)可統(tǒng)計單詞個數(shù)的Android驅(qū)動程序(3)
- Android驅(qū)動程序開發(fā)和調(diào)試環(huán)境配置
- 在Android模擬器和Ubuntu上測試Linux驅(qū)動
- 使用Android NDK和Java測試Linux驅(qū)動
- Android的init過程詳解(一)
- Android雙機(網(wǎng)絡(luò)和USB)調(diào)試及其完美ROOT
- Android的init過程(二):初始化語言(init.rc)解析
