重點3部分 ?kernel.img ?system.img recovery.img
在rockdev文件夾下存放了各種版本的固件文件:boot.img misc.img pcba_small_misc.img pcba_whole_misc.img recovery.img system.img upgrade_tool?
kernel編譯 在kernel文件夾下已經(jīng)寫好了kernel的編譯腳本build_kernel.sh ? ? ? 要去看明白理解清楚build_kernel.sh的原理和實現(xiàn)酿联≈障ⅲ可以用vim編輯器打開 用 :p! 關(guān)閉
先用“./build_kernel.sh”命令執(zhí)行一遍查看能編譯的所有kernel版本,然后選取其中的一種版本(去掉末端的_defconfig)用“贞让。build_kernel.sh xxxx”命令來執(zhí)行kernel的編譯 如“./build_kernel.sh rk3126_m755_v30_hd”則編譯出版本為rk3126_m755_v30_hd的kernel,“rk3126_m755_v30_hd”則為"rk_3126_m755_v30_hd_defconfig"去掉“_defconfig”所得到的版本號
例如 rk312x-5.1 ?設(shè)備型號為rk312x 系統(tǒng)版本為5.1的系統(tǒng)源碼中kernel的編譯腳本為:
#!/bin/sh
cd arch/arm/configs/
ls rk312* -1
cd ../../../
if [ ! -n "$1" ] ;then
? ? ? ? ? ? ?echo"缺失板型號信息周崭!"
? ? ? ? ? ? ?exit
else
BOARD_NAME=$1
fi
echo "board name : $BOARD_NAME"
make ${BOARD_NAME}_defconfig -j4
make ${BOARD_NAME}.img -j4
../u-boot/tools/resource_tool/pack_resource.sh ../u-boot/tools/resource_tool/resources/ resource.img resource.img ../u-boot/tools/resource_tool/resource_tool
#cp *.img /mnt/share_win7/rk312x-5.1/
#echo "cp img /mnt/share_win7/rk312x-5.1/ done"
注釋一下:
#!/bin/sh? ? ? -->是對shell的聲明,說明你所用的是那種類型的shell及其路徑所在喳张。
cd arch/arm/configs/ ? -->去到當前目錄下的arch文件夾下的arm文件下的configs文件夾中
ls rk312* -1 ? ? ?-->列出所有以rk312開頭的文件 -1 為每個文件名占一行
cd ../../../ ? ?-->返回到初始目錄即kernel目錄
if [ ! -n "$1" ] ;then ? --> $1是指傳遞給腳本的第一個參數(shù)续镇,判斷使用這個腳本時是否有參數(shù)傳遞進來 [ ]里的是判斷空,如果空蹲姐,條件成立
? ? ? ? ? ?echo"缺失板型號信息磨取!" ? ? -->條件成立運行這個
? ? ? ? ? ? ?exit
else
BOARD_NAME=$1 ? ?-->條件不成立運行這里
fi ? ? -->表示語句塊結(jié)束
echo "board name : $BOARD_NAME" ? -->顯示board name
make ${BOARD_NAME}_defconfig -j4 ? ?--> 啟動4線程編譯
make ${BOARD_NAME}.img -j4? --> 啟動4線程編譯
../u-boot/tools/resource_tool/pack_resource.sh ../u-boot/tools/resource_tool/resources/ resource.img resource.img ../u-boot/tools/resource_tool/resource_tool
#cp *.img /mnt/share_win7/rk312x-5.1/
#echo "cp img /mnt/share_win7/rk312x-5.1/ done"
編譯完成后在kernel文件夾下應(yīng)該會生成resource.img人柿、kernel.img、vmlinux忙厌、System.map凫岖、vmlinux.o、Module.symvers這6個文件逢净。還有多個文件夾里的東西被重寫哥放。
以上為編譯kernel的步驟
編譯完kernel后返回上級目錄
因為每個Android系統(tǒng)可能用到的JDK版本不一致,所以需要先調(diào)用build.sh腳本把環(huán)境變量對應(yīng)的值重新賦值一遍
build.sh腳本里封裝了環(huán)境變量的值的賦值語句
使用“source build.sh”就可以快速地執(zhí)行賦值語句的操作
然后執(zhí)行“. build/envsetup.sh”語句執(zhí)行當前目錄下的build文件夾下的envsetup.sh腳本文件來以剛剛的賦值進行環(huán)境變量的變更以及一些命令的初始化(雖然有的build.sh腳本里自帶了調(diào)用 .build/envsetup.sh的語句但是為了以防萬一還是執(zhí)行一遍最好)
改變了環(huán)境變量后可以用java -version來查詢當前的jdk版本是否符合需要編譯的系統(tǒng)所需的jdk版本
然后執(zhí)行l(wèi)unch命令來選擇具體的需要生成的設(shè)備型號的信息
回到源碼的根目錄爹土,執(zhí)行命令make -j4對源碼進行編譯甥雕。
另外,也可以對系統(tǒng)中具體某個app進行編譯
先在源碼的根目錄下通過cd命令進入到packages/apps/ ? ?下胀茵,選擇想編譯的app項目,然后輸入mm,就可以編譯了社露。同理,編譯app前跟編譯整個系統(tǒng)前一樣琼娘,要確保jdk版本的一致性峭弟。
系統(tǒng)編譯完成之后 需要執(zhí)行 ./mkimage.sh 生成刷機文件。
參考資料
1脱拼、http://blog.csdn.net/mike8825/article/details/49385797
2瞒瘸、http://blog.csdn.net/kangear/article/details/11840837
進入到/rockdev/下的對應(yīng)的設(shè)備文件夾。
輸入 adb reboot bootloader進入刷機模式
使用 ./upgrade_tool 命令進入刷機操作
1熄浓、選擇設(shè)備的DevNo情臭,重新搜索按R,退出按Q
2赌蔑、再選擇對應(yīng)的命令進行刷機操作
左側(cè)是功能描述俯在,右側(cè)是命令語法。升級相關(guān)操作都在upgrade command列表下娃惯,忘記命令語法可以輸入H進行查看朝巫,清屏輸入CS,退出按Q
a. CD命令:選擇設(shè)備石景,當執(zhí)行的命令有包含設(shè)備重啟操作時,需重新選擇設(shè)備拙吉,當改變操作設(shè)備時需重新選擇
b. SD命令:msc切換到rockusb升級模式潮孽。當切換執(zhí)行成功后,需要重新選擇設(shè)備
c. UL命令:升級loader功能筷黔,當執(zhí)行成功后需要重新選擇設(shè)備
d. DI命令:下載單獨image鏡像到指定扇區(qū)往史,例如升級kernel.img或者system.img都可以直接使用此功能。例如下載kernel.img:DI -kernel.img parameter //如果之前通過di下載過parameter佛舱,則再下載kernel.img時就可以不用指定最后的parameter參數(shù)
e. DB命令:下載boot椎例,在maskrom狀態(tài)下挨决,可以通過此功能,讓maskrom設(shè)備進行Rockusb協(xié)議通訊订歪。
f. EF命令:擦除整個nand flash
g. LF命令:低格保留塊后面區(qū)域脖祈,只有在loader模式下使用
注:DI、UF刷晋、RD盖高、SD、EF眼虱、LF喻奥、DB和RD命令支持命令行方式調(diào)用,例:sudo ./upgrade_tool uf update.img
注:從1.13版本開始DI命令可以支持一次下載多個分區(qū)捏悬,使用方法如下:
? ? ? ? 例如:下載kernel和system
? ? ? ? ?di - k,-s kernel.img,system.img
? ? ? ? ?如果在config.ini文件里面預(yù)先設(shè)置了默認路徑則命令可以簡化為:di -k,-s
3撞蚕、刷機完成后輸入命令 rd 重啟設(shè)備
4、輸入q退出刷機操作
模塊編譯
通過 find xxx -name Android.mk可以查詢xxx文件夾下所有的Android.mk文件
模塊編譯命令分為三種:
一过牙、make 命令 適用于第一次編譯
1甥厦、應(yīng)用層程序(模塊)編譯,通常都是編譯一下apkt文件
? ? ? 查看需要編譯的程序的Android.mk文件抒和,查詢其LOCAL_PACKAGE_NAME變量的值矫渔,然后調(diào)用 make LOCAL_PACKAGE_NAME變量的值,就能對程序(模塊)進行編譯
2摧莽、編譯框架層和系統(tǒng)運行庫源碼
? ? ? 對于框架層和系統(tǒng)運行庫庙洼,需要查看的是Android.mk文件的LOCAL_MODULE變量的值,然后調(diào)用make LOCAL_MODULE變量的值,就能對此框架層或系統(tǒng)運行庫進行編譯镊辕。
二油够、mmm命令 適用于第二次以及之后編譯使用
? ? ? ?用于在源碼根目錄下編譯指定模塊,參數(shù)為模塊的相對路徑征懈。比如要編譯應(yīng)用Phone的源碼石咬。需要在根目錄下執(zhí)行命令“mmm packages/apps/phone”
三、mm命令 使用于第二次以及之后編譯使用
? ? ? ? 用于在需要編譯的模塊的根目錄下進行編譯卖哎。例如要編譯應(yīng)用Phone的源碼鬼悠。需要先cd到Phone源碼的根目錄下然后執(zhí)行“mm”命令即可
注:mmm和mm命令必須在執(zhí)行“.build/envsetup.sh”之后才能使用,并且只編譯發(fā)生變化的文件亏娜。如果要編譯模塊的所有文件焕窝,需要-B選項,例如mm? -B维贺。
Android源碼編譯之后它掂,對于一個系統(tǒng)再重新編譯所需要做的清理工作:
1、在源碼的根目錄下溯泣,make clean
2虐秋、進入kernel目錄下榕茧,執(zhí)行make mrproper
3、再重新從內(nèi)核開始進行編譯客给。
OTA升級:
OTA分析:
http://blog.csdn.net/myarrow/article/details/8110110
各種參考資料:
http://blog.csdn.net/baiyongtask/article/details/43154715
http://blog.chinaunix.net/uid-26926660-id-3216956.html