2010年3月4日 星期四

HTC Tattoo 建立自製的 Boot Image

Android 的 Boot Image 是用來載入 kernel 並且建立 root file system 的 image。它是一個非常重要的檔案,因為,所以的載入程序都在 Boot Image 之中。

Android 的 Image 共有三個:boot image, system image, data image。當然,有些人可能會說,還有 recovery image,它是在出問題的時候,用來覆原的 image,大致上,recovery image 會是 boot image + 一部份 system image。

Android Boot Image 是一個 android 自定的格式,它可以分成 2K 的 header + kernel + ramdisk + second stage。

原則上來說,這些資訊都可以從 android 的網站中查到。這篇文章的重點將放在,如何建立給 tattoo 用的 build image。

自從 tattoo 可以取得 root 權限後,這幾天福克斯花了些時間想找出在 tattoo 上把應用程式放到 sd 卡的方法。要達到這項目標就一定要做出自己的 boot image。

Boot Image 的製作可以依照這個 wiki 進行,它看起來非常簡單,尤其是作者已經寫了 split_bootimg,unpack 及 repack 的 perl 檔。大家可以依照這個 wiki 進行 boot image 的設計。

老實說,最困難的地方不是修改或是 unpack,而是 repack。跟據 mainfram3 於 XDA 上的文章,由於 tattoo 的 boot image 的 base offset 與其它的 boot image 不同,所以,wiki 的 unpack script 是沒辦法建立出 tattoo 可以讀出的檔案。

福克斯的作法就是用 split_bootimg 的方式,再使用 mkbootfs + mkbootimg 的方式來將它包裝起來。它的使用方式如下:

mkbootfs {ramdisk_folder} | gzip > {ramdisk_output}.gz

再使用

mkbootimg --base 0x2E00000 --cmdline "cmdline: no_console_suspend=1 console=null" --kernel {kernel_file} --ramdisk {ramdisk_output}.gz -o your_boot_image.img

其中最重要的部份就是 --0x2E00000,福克斯目前也不知道為什麼是這樣設計,但是,透過 HEX editor 的方式,可以從 tattoo 的 boot image 中看出來。

最後,大家可能會遇到另一個問題: where is mkbootfs and mkbootimg??? 當初福克斯在做的時候,也遇到這個問題。其實,這兩個檔案需要下載完整的 android source code,然後再將它 compile 起來,會在 output/host/ 中發現。這兩個檔案,其實可以用 google 來找到,只是,到目前為止,福克斯只找到 mac os 跟 linux 兩種版本(linux 的是福克斯自己編釋出來的)。致於,windows 版,可能要大家自行編釋了。

沒有留言:

張貼留言