framework編譯相關(guān)

重點(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ī)操作





刷機(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

http://www.lxweimin.com/p/367f0886e62b

http://www.lxweimin.com/p/3922ec229077

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • feisky云計(jì)算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,893評(píng)論 0 5
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,719評(píng)論 0 3
  • 從字足跡能看出寫字人的性格。 我們常在信件和文件上簽名,殊不知,筆跡是能展示寫字人的個(gè)性。不過,筆跡總歸是后天形成...
    Nancypower閱讀 372評(píng)論 2 0
  • 知乎看到一句話,感覺說的挺對。就收藏一下: 大意是,當(dāng)一個(gè)遇到挫折時(shí),別人的心靈雞湯,正能量,是沒什么用的。因?yàn)槟?..
    買饅頭停用卸載閱讀 299評(píng)論 0 0
  • http是一種無狀態(tài)協(xié)議; 我們先探討用戶登陸的整個(gè)過程: 1、網(wǎng)頁顯示登陸頁面,用戶輸入用戶名和密碼等信息,這時(shí)...
    bellchen閱讀 346評(píng)論 2 5