2012年10月25日 星期四

把玩"魔術師" -- 幫 boot.img 換 kernel

把玩"魔術師" -- 幫 boot.img 換 kernel

This document is provided as is. You are welcomed to use it for non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

請勿轉貼


從 Android 的架構圖中,以及自己的經驗,kernel 是一部 Android 手機,尤其是 如觸控螢幕、相機、GPS 等硬體設備,是否能正確運作的重要元素。有時候,我們 取得了一個 ROM,或許你只想把它的 kernel 換掉以便測試在同樣的環境下,使用 不同的 kernel 是否可以得到更好的硬體支援,那麼幫 boot.img 更換 kernel 的步驟就很重要了。 假設我們已經有了 Magic 32A 的 kernel 以及 wlan.ko,且假設我們已經取得了 給 Magic 32B 的 boot.img,因此我們需要手動產生給 32A 的 boot.img, 這是因為 32A 的 address 和 32B 的不同所導致。假設你已經依據文件將 kernel 編譯好了,也有了 boot.img;一般來說,其步驟包含:
  1. 下載 PortTools.rar。這個檔案包含了一個 Linux 的執行檔以及幾個 Perl 的執行檔,請將其 解壓所後放置於 ~/tools(或者你喜歡的任意目錄)。
  2. 將 boot.img 從 ~/froyo/out/target/product/sapphire 複製進來。
  3. 將 zImage 從 ~/froyo/kernel/arch/arm/boot 或者 CM6 EBI1/32A kernel 的壓縮檔內複製進來。
  4. 將解壓縮的檔案改變成可執行:
      chmod 755 mkbootimg-H  repack-H.pl  unpack-H.pl
      
  5. 將 kernel 以及 ramdisk 從 boot.img 萃取出來,指令如下:
      unpack-H.pl boot.img
      mkdir ramdisk
      cd ramdisk
      gunzip -c ../boot.img-ramdisk.gz | cpio -i
      cd ..
      
  6. 將適合的 kernel (給 32A 用的)複製進來,並取名為 zImage; 然後執行以下指令來產生適當的 boot.img:
      mkbootimg --kernel zImage --ramdisk boot.img-ramdisk.gz --cmdline 'no_console_suspend=1 console=null' --base 0x19200000 -o boot.img
      
  7. 除了 kernel 之外,一般的說法是 kernel 啟動的過程有可能去啟動無線網路, 如果無線網路裝置無法啟動,將會造成無法開機的現象;因此建議將 boot.img 和 wlan.ko 包在一起。包在一起的常用方式有兩種,兩者所需的工具也略有不同,我們 分別描述如下:

      [使用 Brian 的 Port-blank]: 下載 port-blank.zip 並解壓縮到 ~/port 目錄內,然後執行下列指令將 boot.img 和 wlan.ko 複製到 適當的目錄:
        cp boot.img ~/port/
        cp wlan.ko ~/port/system/lib/modules/
        
      最後將之前 PortTools.rar 中的 SignApp.rar 解壓縮;解壓縮之後,會有 signapk.jar、 testkey.x509.pem、以及 testkey.pk8。請執行以下指令將 port 目錄內的 所有檔案壓縮在一起,並利用 signapk.jar 等檔案進行簽章,指令如下:
        zip -r port.zip *
        java -jar ~/tools/signapk.jar ~/tools/testkey.x509.pem ~/tools/testkey.pk8 port.zip update_signed.zip
        
      執行之後所產生的 update_signed.zip 就可以用來刷手機了。
      [使用 AnyKernel]: 下載 Koush's AnyKernel,下載方式請執行下列 指令:
        cd ~
        git clone git://github.com/koush/AnyKernel.git -b 32A
        
      這些指令會在你的家目錄新增 AnyKernel 的目錄。AnyKernel 目錄下會包含 kernel、META-INF、以及 system 三個目錄。請將 zImage 和 wlan.ko 分別複製到 kernel 和 system/lib/modules 的目錄內,最後需要做的就是把所有 AnyKernel 內的資料 zip 起來並加上簽章,指令如下:
        cd ~/AnyKernel
        zip -r port.zip *
        java -jar ~/tools/signapk.jar ~/tools/testkey.x509.pem ~/tools/testkey.pk8 port.zip update_signed.zip
        
      執行之後所產生的 update_signed.zip 就可以用來刷手機了。

參考資料:How to build a kernel port for CM6 以及 [TUTORIAL] Building a EBI1/32A Port File


Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu




沒有留言:

張貼留言