Android雙機(網絡和USB)調試及其完美ROOT


本文主要講如下兩個內容。

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=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是內存文件,改了也沒用,一重啟就會恢復原樣,而且只有重啟才能生效(好像進入了二難推理)。所以修改 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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM