重點(diǎn)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的原理和實(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”所得到的版本號(hào)
例如 rk312x-5.1 ?設(shè)備型號(hào)為rk312x 系統(tǒng)版本為5.1的系統(tǒng)源碼中kernel的編譯腳本為:
#!/bin/sh
cd arch/arm/configs/
ls rk312* -1
cd ../../../
if [ ! -n "$1" ] ;then
? ? ? ? ? ? ?echo"缺失板型號(hào)信息!"
? ? ? ? ? ? ?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/ ? -->去到當(dāng)前目錄下的arch文件夾下的arm文件下的configs文件夾中
ls rk312* -1 ? ? ?-->列出所有以rk312開頭的文件 -1 為每個(gè)文件名占一行
cd ../../../ ? ?-->返回到初始目錄即kernel目錄
if [ ! -n "$1" ] ;then ? --> $1是指傳遞給腳本的第一個(gè)參數(shù),判斷使用這個(gè)腳本時(shí)是否有參數(shù)傳遞進(jìn)來 [ ]里的是判斷空,如果空,條件成立
? ? ? ? ? ?echo"缺失板型號(hào)信息!" ? ? -->條件成立運(yùn)行這個(gè)
? ? ? ? ? ? ?exit
else
BOARD_NAME=$1 ? ?-->條件不成立運(yùn)行這里
fi ? ? -->表示語句塊結(jié)束
echo "board name : $BOARD_NAME" ? -->顯示board name
make ${BOARD_NAME}_defconfig -j4 ? ?--> 啟動(dòng)4線程編譯
make ${BOARD_NAME}.img -j4? --> 啟動(dòng)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)該會(huì)生成resource.img、kernel.img、vmlinux、System.map、vmlinux.o、Module.symvers這6個(gè)文件。還有多個(gè)文件夾里的東西被重寫。
以上為編譯kernel的步驟
編譯完kernel后返回上級(jí)目錄
因?yàn)槊總€(gè)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í)行當(dāng)前目錄下的build文件夾下的envsetup.sh腳本文件來以剛剛的賦值進(jìn)行環(huán)境變量的變更以及一些命令的初始化(雖然有的build.sh腳本里自帶了調(diào)用 .build/envsetup.sh的語句但是為了以防萬一還是執(zhí)行一遍最好)
改變了環(huán)境變量后可以用java -version來查詢當(dāng)前的jdk版本是否符合需要編譯的系統(tǒng)所需的jdk版本
然后執(zhí)行l(wèi)unch命令來選擇具體的需要生成的設(shè)備型號(hào)的信息
回到源碼的根目錄,執(zhí)行命令make -j4對源碼進(jìn)行編譯。
另外,也可以對系統(tǒng)中具體某個(gè)app進(jìn)行編譯
先在源碼的根目錄下通過cd命令進(jìn)入到packages/apps/ ? ?下,選擇想編譯的app項(xiàng)目,然后輸入mm,就可以編譯了。同理,編譯app前跟編譯整個(gè)系統(tǒng)前一樣,要確保jdk版本的一致性。
系統(tǒng)編譯完成之后 需要執(zhí)行 ./mkimage.sh 生成刷機(jī)文件。
參考資料
1、http://blog.csdn.net/mike8825/article/details/49385797
2、http://blog.csdn.net/kangear/article/details/11840837
進(jìn)入到/rockdev/下的對應(yīng)的設(shè)備文件夾。
輸入 adb reboot bootloader進(jìn)入刷機(jī)模式
使用 ./upgrade_tool 命令進(jìn)入刷機(jī)操作
1、選擇設(shè)備的DevNo,重新搜索按R,退出按Q
2、再選擇對應(yīng)的命令進(jìn)行刷機(jī)操作
左側(cè)是功能描述,右側(cè)是命令語法。升級(jí)相關(guān)操作都在upgrade command列表下,忘記命令語法可以輸入H進(jìn)行查看,清屏輸入CS,退出按Q
a. CD命令:選擇設(shè)備,當(dāng)執(zhí)行的命令有包含設(shè)備重啟操作時(shí),需重新選擇設(shè)備,當(dāng)改變操作設(shè)備時(shí)需重新選擇
b. SD命令:msc切換到rockusb升級(jí)模式。當(dāng)切換執(zhí)行成功后,需要重新選擇設(shè)備
c. UL命令:升級(jí)loader功能,當(dāng)執(zhí)行成功后需要重新選擇設(shè)備
d. DI命令:下載單獨(dú)image鏡像到指定扇區(qū),例如升級(jí)kernel.img或者system.img都可以直接使用此功能。例如下載kernel.img:DI -kernel.img parameter //如果之前通過di下載過parameter,則再下載kernel.img時(shí)就可以不用指定最后的parameter參數(shù)
e. DB命令:下載boot,在maskrom狀態(tài)下,可以通過此功能,讓maskrom設(shè)備進(jìn)行Rockusb協(xié)議通訊。
f. EF命令:擦除整個(gè)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命令可以支持一次下載多個(gè)分區(qū),使用方法如下:
? ? ? ? 例如:下載kernel和system
? ? ? ? ?di - k,-s kernel.img,system.img
? ? ? ? ?如果在config.ini文件里面預(yù)先設(shè)置了默認(rèn)路徑則命令可以簡化為:di -k,-s
3、刷機(jī)完成后輸入命令 rd 重啟設(shè)備
4、輸入q退出刷機(jī)操作
模塊編譯
通過 find xxx -name Android.mk可以查詢xxx文件夾下所有的Android.mk文件
模塊編譯命令分為三種:
一、make 命令 適用于第一次編譯
1、應(yīng)用層程序(模塊)編譯,通常都是編譯一下apkt文件
? ? ? 查看需要編譯的程序的Android.mk文件,查詢其LOCAL_PACKAGE_NAME變量的值,然后調(diào)用 make LOCAL_PACKAGE_NAME變量的值,就能對程序(模塊)進(jìn)行編譯
2、編譯框架層和系統(tǒng)運(yùn)行庫源碼
? ? ? 對于框架層和系統(tǒng)運(yùn)行庫,需要查看的是Android.mk文件的LOCAL_MODULE變量的值,然后調(diào)用make LOCAL_MODULE變量的值,就能對此框架層或系統(tǒng)運(yùn)行庫進(jìn)行編譯。
二、mmm命令 適用于第二次以及之后編譯使用
? ? ? ?用于在源碼根目錄下編譯指定模塊,參數(shù)為模塊的相對路徑。比如要編譯應(yīng)用Phone的源碼。需要在根目錄下執(zhí)行命令“mmm packages/apps/phone”
三、mm命令 使用于第二次以及之后編譯使用
? ? ? ? 用于在需要編譯的模塊的根目錄下進(jìn)行編譯。例如要編譯應(yīng)用Phone的源碼。需要先cd到Phone源碼的根目錄下然后執(zhí)行“mm”命令即可
注:mmm和mm命令必須在執(zhí)行“.build/envsetup.sh”之后才能使用,并且只編譯發(fā)生變化的文件。如果要編譯模塊的所有文件,需要-B選項(xiàng),例如mm? -B。
Android源碼編譯之后,對于一個(gè)系統(tǒng)再重新編譯所需要做的清理工作:
1、在源碼的根目錄下,make clean
2、進(jìn)入kernel目錄下,執(zhí)行make mrproper
3、再重新從內(nèi)核開始進(jìn)行編譯。
OTA升級(jí):
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