文章介紹的內(nèi)容在這個(gè)wiki上都有。說(shuō)實(shí)話一開(kāi)始我不大想寫(xiě)的,想直接介紹沒(méi)有很多現(xiàn)成資料的ROM的制作,但后來(lái)考慮到最好還是層層推進(jìn),所以最終還是把這些內(nèi)容寫(xiě)出來(lái),作為中文參考吧。下一篇文章再介紹ROM的制作。如果你已經(jīng)知道相關(guān)方法了,就沒(méi)必要看了,沒(méi)有什么新技術(shù)。
如果經(jīng)??次襜log的朋友,應(yīng)該記得前年我曾經(jīng)寫(xiě)過(guò)一些關(guān)于Android的文章,其中一篇是對(duì)Android啟動(dòng)過(guò)程的進(jìn)一步研究?,F(xiàn)在要做的事情呢,就是對(duì)兩年前這篇文章的一個(gè)實(shí)踐了:)當(dāng)然,當(dāng)年的文章只能作為參考,因?yàn)槟鞘轻槍?duì)模擬器的,Ramdisk.img就在Tools工具下。而現(xiàn)在,我們是針對(duì)真機(jī)提取Ramdisk,修改相關(guān)文件,再將其放回去,這樣以后Android設(shè)備啟動(dòng)時(shí),加載的都是已經(jīng)修改過(guò)的Ramdisk鏡像了。我們不會(huì)去直接用Tools目錄下的Ramdisk,因?yàn)楹芸赡苣愕腂oot鏡像是已經(jīng)修改過(guò)的,你只不過(guò)想在其基礎(chǔ)上進(jìn)行進(jìn)一步修改而已。
1提取
好,進(jìn)入正題,本文主要以修改boot.img中的ramdisk為例,但是其他的修改原理都是相通的。
首先,我們要把boot鏡像從設(shè)備中提取出來(lái),方法就是在上一篇文章中談到的,先去adb shell中
cat /dev/mtd/mtd2 > /sdcard/root.img
然后
adb pull /sdcard/root.img ./
這樣就把root.img拷貝到本地目錄下了。好,接下來(lái)的步驟,可要看仔細(xì)了,錯(cuò)了一點(diǎn),就完全不對(duì)路了。
我們已經(jīng)介紹過(guò),boot.img的組成結(jié)構(gòu)是
+—————–+
| boot header | 1 page
+—————–+
| kernel | n pages
+—————–+
| ramdisk | m pages
+—————–+
| second stage | o pages
+—————–+
那我們要做的就是把這幾個(gè)部分分別分離出來(lái)。具體的分離原理并不是很難,就是特別麻煩。所以建議大家都用現(xiàn)成的腳本來(lái)做。點(diǎn)擊unpack下載分離的腳本,點(diǎn)擊repack下載重新打包的腳本。
好,我們現(xiàn)在先進(jìn)行鏡像分離。用命令
./split_bootimg.pl boot.img
成功執(zhí)行后,可以得到兩個(gè)文件,一個(gè)是boot.img-kernel,另一個(gè)是boot.img-ramdisk.gz。我們這里以修改ramdisk為例,所以將其解包
% mkdir ramdisk
% cd ramdisk
% gzip -dc ../boot.img-ramdisk.gz | cpio -i
% cd ..
解包之前新建一個(gè)文件夾放解包出來(lái)的文件,然后進(jìn)入這個(gè)文件夾執(zhí)行g(shù)zip和cpio的命令。至于原理,同上,請(qǐng)參考兩年前的這篇文章。
2 生成新img
好,接下來(lái)你就可以做你想做的任何修改了,包括init.rc之類(lèi)的進(jìn)程方面的修改,或者丟一個(gè)什么東西進(jìn)去,或者其他。只需要確保你做的修改沒(méi)有問(wèn)題就行。修改完成后,自然就是要將其重新還原成img包了,這時(shí)repack腳本就派上用場(chǎng)。用命令
repack-bootimg.pl boot-new.img
就可以生成新的boot-new.img了。
3 刷入新img
生成了新的img后,我們?nèi)绾卧谙到y(tǒng)上應(yīng)用我們的新boot.img呢?首先,把img文件放到sdcard上去
adb push ./boot_new.img /sdcard
然后執(zhí)行這兩個(gè)操作
# cat /dev/zero > /dev/mtd/mtd2
# flash_image boot /sdcard/mynewimage.img
執(zhí)行第一個(gè)操作時(shí),可能會(huì)提示你
write: No space left on device
這個(gè)信息沒(méi)關(guān)系,不用管它。兩個(gè)命令都執(zhí)行后,最后adb shell reboot即可。如果重啟順利,那么恭喜你,你的新鏡像刷成功了,此時(shí)的ramdisk自然也是新的ramdisk了。
4 刷boot鏡像有問(wèn)題?
其實(shí)到這里,才是俺想發(fā)揮的地方。上面介紹的所有步驟,有兩個(gè)特點(diǎn)
4.1 國(guó)外友人上都介紹過(guò)
4.2 G1上成功率最高
所以如果你是用Magic或者Hero,有一定幾率會(huì)出線重啟之后,畫(huà)面就停留在 HTC 或者Android那里,不會(huì)進(jìn)入系統(tǒng)。此時(shí)你必須拿出電池重新開(kāi)機(jī),按照我這篇文章所講的方法刷一次recovery image,才能正常進(jìn)入系統(tǒng)。如果你真的遇到這種情況,就說(shuō)明上面介紹的這個(gè)方法不適合你,那么,還有沒(méi)有別的方法讓系統(tǒng)boot我們自己的boot image呢?
當(dāng)然有。在這篇文章中,我們介紹了有很多第三方ROM供我們刷機(jī),從而達(dá)到更多功能或者獲得root權(quán)限的目的。其中,我們介紹了里面有一個(gè)update.zip的東西,如果親自刷過(guò)機(jī)的朋友就知道這是什么文件。我同時(shí)也介紹了,update.zip里面就是要添加到你的system中的各種工具,其中就包括了boot.img。也就是說(shuō),我們可以自己做一個(gè)屬于自己的ROM,其中包括我們自己的boot.img。
所以在下篇文章中,我會(huì)介紹自己制作ROM的基本方法。同樣,我不確定什么時(shí)間,最近學(xué)業(yè)忙得要死。我盡量抽空寫(xiě)。




