其次妳要能找到當前版本所對應的boot.img或sec_boot.img(帶簽名),通常能拿到的也就是刷機包裏面解出來的sec_boot.img,通過cat mtd出來的不知道行不行=。=
工具:
split_bootimg.pl
mkbootfs和mkbootimg
1)sec_boot.img是經過簽名的,需要把文件前0x1000個字節刪除,也就是ANDROID! 8個字符前面所有字節刪除,保存為boot.img
2) 運行perl split_bootimg.pl boot.img解出kernel和ramdisk文件,同時記下運行結果中的“Command line: vmalloc=384M mem=2044m@0x200000。。。。”壹長串字符備用
3)運行指令把ramdisk的文件解出來
mkdir ramdisk
cd ramdisk
gzip -dc ../boot.img-ramdisk.gz | cpio -i
cd ..
4)修改其中的文件,例如我覺得default.prop裏面的persist.sys.usb.config=manufacture,adb不太爽,想改成=adb,修改保存。如果妳想adb有root權限的話,就去改ro.secure和ro.debuggable
5)重新打包
mkbootfs ./ramdisk | gzip > ramdisk-new.gz
當然如果妳自己編譯的mkbootfs也沒有加到path裏,就把編譯完的程序考到當前目錄,運行./mkbootfs...
生成boot-new.img
mkbootimg --cmdline '單引號裏面這壹段拷貝剛才記下的Command line冒號後面的壹長串' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
6) 現在如果把生成的boot-new.img直接刷進去,手機就起不來了,問題在於kernel,ramdisk,second stage,tags的地址,
自己編譯的mkbootimg查看壹下.c文件就知道base=0x10000000,生成的boot-new.img是按照這個規則來的:
kernel地址=base + 0x00008000,ramdisk地址=base + 0x01000000,
second stage地址=base + 0x00f00000,tags地址=base + 0x00000100。
這跟原始sec_boot.img裏面的地址是不壹樣的,本想找到正確的base值,但原始img的幾個地址並非此規律,拿不到源碼只能幹瞪眼嘍,
最簡單的辦法就是用16進制編輯器將boot-new.img對應的4個地址修改為原始值,如圖:
7)保存後就可以fastboot刷入這個boot了,然後就是驗證壹下能否啟動啦^_^,啟動不了也不至於變磚,因為咱recovery和fastboot沒刷,可以利用這兩種方法恢復