目前一直在學習源碼方面的知識,前段時間剛剛搞定了recovery的移植。這方面的資料真實少之又少啊,谷歌了幾天,文章也就那幾篇而已,更別提國內的資料了。你讓我們熱愛學習的小白情何以堪。于是乎就開始動手了,編譯的過程中,自己做了一些隨筆的記錄。把自己遇到的一些問題和解決辦法都記錄了下了,放在自己的筆記里了。今天整理出來,和大家共享一下。
本教程是針對有一定基礎的人。如果你不會Ubuntu,不會環境的搭建。那你還是先學習一下吧。裝Ubuntu各種各樣的教程,網上一找一大堆。
教程所用的系統為Ubuntu12.04,示例機型為中興N880E。源碼目錄為~/android/system/。
碼字不容易,你懂的。。。。。。。
教程開始:
源碼的同步大家可以看官方文檔,教程直接從源碼同步完后開始。
1、同步源碼到最新,我同步的源碼目錄為~/android/system/,要改為自己的源碼目錄,下面每一步也一樣
· cd ~/android/system/
· repo sync -j16
2、更新完成后,執行下面命令,完成環境的安裝
· ./build/envsetup.sh
輸出結果:
3、下一步,make我們后面要用到的工具
· make -j4 otatools
輸出結果:
執行完成后的輸出:
會生成out目錄,在/out/host/linux-x86/bin中有后面要用到的工具。
4、將/out/host/linux-x86/bin加入環境變量,變量具體位置要改成你的:
gedit ~/.bashrc
在文本最后添加:
export PATH=$PATH: ~/android/system/out/host/linux-x86/bin
保存退出,執行下面命令,讓剛加的環境變量生效:
source ~/.bashrc
4、從官方包中,別人的ROM包也可以,拿出boot.img。我放到了~/android/目錄
5、開始建立我們N880E的device目錄:
./build/tools/device/mkvendor.sh zte n880e ~/android/boot.img
命令參考:
./build/tools/device/mkvendor.sh device_manufacturer_name device_name /your/path/to/the/boot.img
命令輸出為:
此時在/device/zte/中就會有你的機型n880e了,里面有你的配置文件:AndroidBoard.mk,AndroidProducts.mk, BoardConfig.mk, device_.mk, kernel, system.prop,recovery.fstab, and vendorsetup.sh.
6、修改配置文件:
在這里很重要的一個文件就是recovery.fstab,是你手機里各個設備分區對應的掛載點,可以理解為手機的分區表。如果這個文件有錯誤,那么進入recovery后,會提醒分區掛載失敗。
這個文件我們可以從官方的recovery.img提取出來。也可以直接解包別人編譯好的recovery,得到recovery.fstab
當然,我們也可以自己動手寫。目前,自己也沒發現什么簡潔一點的辦法。我是查看刷機包中的updater-script文件中各個分區的掛載點和
cat /proc/mount
輸出結果:
cat /proc/partitions
輸出結果:
一個個排除定位出來的。
大家有好的辦法,可以共同探討。
這里有一個分區表比較全的recovery.fstab,大家可以按照自己手機的分區表修改。
7、開始編譯,執行命令:
./build/envsetup.sh && lunch full_n880e-eng
(把n880e替換為自己的機型)
輸出結果:
下一步命令,編譯開始:
make -j4 recoveryimage
最后成功時輸出結果:
輸出的目錄為:out/target/product/n8880e/recovery.img文件,就是我們要的。
NOTE:
1、 編譯時間:實體機,一兩分鐘的樣子(i3-380、2GBDDR3)
2、 異常處理:(都是自己編譯過程中遇到的筆錄,非官方)
錯誤1:
執行
./build/envsetup.sh
命令后,提示某些設備文件不存在。
這是自己當初在CM7源碼下編譯出現的,因為自己沒有把所有的設備的源碼同步下來,一些設備自己在~/android/system/.repo/manifest.xml中用注釋掉了,所以同步完源碼后要修改vendor/cyanogen/products/AndroidProducts.mk 文件,把沒有同步的設備刪除掉。重新執行命令就行了。
錯誤2:
在編譯的最后,提示出錯 “Boot.img is too large”,自己當時的解決辦法是修改BoardConfig.mk:
# fix this up by examining /proc/mtd on a running device
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x01000000
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x01000000
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 0x19000000
BOARD_USERDATAIMAGE_PARTITION_SIZE := 0xA0000000
BOARD_FLASH_BLOCK_SIZE := 131072
將后面的十六進制改為自己手機分區的大小,要把兆轉換為KB,再轉換為十六進制,然后替換0x后面的數字(0x表示十六進制)。
另一種解決辦法,就在下面幾篇參考文檔中剛看的,未實踐:
打開源碼目錄中的Build/Core/definitions.mk,將1688 – 1694行替換為:
# if [ "$total" -gt "$maxsize" ]; then \
# echo “error: $printname too large ($total > [$(2) - $reserve])”; \
# false; \
#el
if [ "$total" -gt $((maxsize - 32768)) ]; then \
echo “WARNING: $printname approaching size limit ($total now; limit $maxsize)”; \
fi \
然后保存。重新編譯即可。
錯誤3:
執行7中的第一個命令時,提示lunch未安裝:
解決辦法:
執行
source build/envsetup.sh
再執行上面命令就OK 了。
更進一步,自己也在學習中,還未實踐的:
recovery_ui.c 這個文件里面是手機各按鍵對應的按鍵值,這樣寫入之后才能正確選擇按鍵。對按鍵的修改自己找了一些資料還在進一步學習中。
參考資料:
Porting CWM to other devices:
http://www.acsyndicate.net/how-to-porting-cwm-to-other-devices-windows/
Creating a custom ClockWorkMod (CWM)Recovery image:
http://www.twobitcoder.com/?p=158
Porting Clockwork Recovery to ourGarminfone:
http://mygarminfone.blogspot.com/2011/05/porting-clockwork-recovery-to-our.html
Porting Clockwork Recovery to New Devices:
http://www.koushikdutta.com/2010/10/porting-clockwork-recovery-to-new.html