<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 189,comments - 115,trackbacks - 0
    Android Building System
    http://blog.csdn.net/liushaogeng/article/details/5834186


    最近研究了下Android的編譯系統,下面結合編譯我們自己的產品mobot來對整個編譯系統進行必要的介紹,方便大家今 后對默認編譯的修改。

     

    先列出幾個覺得重要的Make文件:

    build/buildspec.mk

    build/envsetup.sh

    build/core/main.mk

    build/core/envsetup.mk

    build/config.mk

     

    總的來說,Android以模塊(module/package)的形式來組織各個系統的部件,每個模塊(module/package)的目錄下都會有一個Android.mk。所謂module就是指系統的Native Code,而相對于Java寫的Android application稱為package。

     

     

     

    Makefile的主要流 程 1

    初始化參數設置 2

    讀取Product的設定 3

    讀取BoardConfig 4

    讀取所有Module 4

    產生相應的Rules,生成image 5

    具體make操作: 6

    完整編譯 6

    模塊編譯 6

    單獨編譯image文件 7

    一些疑問和解答: 7

     

     

     

    Makefile的主要流程

    以下主要流程都 在build/core/main.mk里 安排。

     初始化相關的參數設置(buildspec.mk、envsetup.mk、config.mk)

     檢測編譯環境和目標環境

     決定目標product

     讀取product的配置信息及目標平臺信息

     清除輸出目錄

     檢查版本號

     讀取Board的配置

     讀取所有Module的配置

     根據配置產生必要的規則(build/core/Makefile)

     生成image

    初始化參數設置

     main.mk 里,簡單設置 幾個主要編譯路徑的變量后,來到config.mk:

    ——————————————config.mk——————————————

    其中設置了源文件的一系列路徑,包括頭文件、庫文件、服務、API已經編譯工具的路徑。(前36行)

    從40行開始,定義一些編譯模塊的生成規則:

    Android 
Building System - bimoshi - 血域天使的個人主頁

    這里面除了第一個CLEAR_VARS外,其他都對應的一種模塊的生成規則,每一個module都會來include其中某個來生成目標模塊。

    例如:

    Camera模塊的makefile里( Android.mk )就包含了其中的一種生成規則BUILD_PACKAGE:

    Android 
Building System - bimoshi - 血域天使的個人主頁

    也就是Camera會按照package.mk里的生成規則去生成目標模塊。

    回到config.mk,接著會嘗試讀取buildspec.mk的設置:

    Android 
Building System - bimoshi - 血域天使的個人主頁

    如同注釋所說,會嘗試查找 buildspec.mk ,如果文件不 存在會自動使用環境變量的設置,如果仍然未定義,會按arm默認的設置去build。

    這里的buildspec.mk可以自己創建,也可以將原先build/下的buildspec.mk.default直接命名為buildspec.mk并移到根目錄。

     

     

    實際上,buildspec.mk配置都被屏蔽了,我們可以根據需要直接打開和修改一些變量。在這里我們可以加入自己的目標產品信息:

    ifndef TARGET_PRODUCT

    TARGET_PRODUCT:=mobot

    endif

    以及輸出目錄設置:

    OUT_DIR:=$(TOPDIR)mobot

    讀取Product的設定

    回到config.mk,接著進行全局變量設置,進入envsetup.mk:

    ——————————————envsetup.mk——————————————

    里面的大部分函數都在build/envsetup.sh中定義。

    首先,設置版本信息,(11行)在build/core/version_defaults.mk中具體定義平臺版本、SDK版本、Product版本,我們可以將BUILD_NUMBER作為我們產品mobot的version信息,當然,也可以自定義一個版本變量。

    Android Building System - bimoshi - 血域天使的個人主頁

    回到envsetup.mk,接著設置默認目標產品(generic),這里由于我們在buildspec.mk里設置過TARGET_PRODUCT ,事實上這個 變量值為mobot。

    然后讀取product的設置(41行), 具體實現在build/core/ product_config.mk 中,進而進入product.mk,從build/target/product/ AndroidProducts.mk 中讀出PRODUCT_MAKEFILES,這些makefile各自獨立定義product,而我們的產品mobot也應添加一個makefile文件mobot.mk。在mobot.mk中我們可以加入所需編譯的PRODUCT_PACKAGES。

    下面為HOST配置信息及輸出目錄,最后打印相關信息:

    Android 
Building System - bimoshi - 血域天使的個人主頁

    讀取BoardConfig

    接著回到config.mk,(114行)這 里會搜索所有的BoardConfig.mk,主要有以下兩個地方:

    $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk 

    vendor/*/$(TARGET_DEVICE)/BoardConfig.mk 

    這里的TARGET_DEVICE就是mobot,就是說為了定義我們自己的產品mobot,我們要在build/target/board下添加一個自己的 目錄mobot用來加載自己 的board配置。

    在BoardConfig.mk中會決定是否編譯bootloader、kernel等信息。

    讀取所有Module

    結束全局變量配置后,回到main.mk,馬上對編譯工具及版本進行檢查,錯誤便中斷編譯。

    142行,包含文件 definitions.mk ,這里面定義了許多變量和函數供main.mk使用。main.mk第446行,這里會去讀取所有的Android.mk文件:

    include $(ONE_SHOT_MAKEFILE)

    這個 ONE_SHOT_MAKEFILE 是在前面提到 的mm(envsetup.mk)函數中賦 值的:

    ONE_SHOT_MAKEFILE=$M make -C $T files $@

    而M=$(findmakefile),最終實現在:

    Android 
Building System - bimoshi - 血域天使的個人主頁

    回到main.mk,最終將遍歷查找到的所有子目錄下的Android.mk的路徑保存到subdir_makefiles變量里(main.mk里的470行):

    Android 
Building System - bimoshi - 血域天使的個人主頁

    我們在package/apps下每個模塊根目錄都能看到Android.mk,里面會去定義當前本地模塊的Tag: LOCAL_MODULE_TAGS ,Android會通過這個Tag來決定哪些本地模塊會編譯進系統,通過PRODUCT和LOCAL_MODULE_TAGS來決定哪些應用包會編譯進系統。( 前面說 過,你也能通過buildspec.mk來 制定你要編譯進系統的模塊 )

    這個過 程在mian.mk的445行開始,最后需要編譯的模塊路徑打包到ALL_DEFAULT_INSTALLED_MODULES (602行):

    Android 
Building System - bimoshi - 血域天使的個人主頁

     

    產生相應的Rules,生成image

    所有需要配置的準備工作都已完成,下面該決定如何生成image輸出文件了,這一過程實際上在build/core/Makefile中處理的。

    這里定義各種img的生成方式,包括ramdisk.img、userdata.img、system.img、update.zip、recover.img等。具體對應的rules可以參考下圖:

    http://p.blog.csdn.net/images/p_blog_csdn_net/yili_xie/EntryImages/20091214/make%20goals.png

    當Make include所有的文件,完成對所有make文件的解析以后就會尋找生成 對應目標 的規則,依次生成它的依賴,直到 所有滿足的模塊被編譯好,然后使用相應的工具打包成相應的img。

     

    具體make操作:

    完整編譯

    我們在根目錄下輸入make命令即可開始完全編譯。這個命令實際編譯生成的默認目標是droid:

    Android 
Building System - bimoshi - 血域天使的個人主頁

    也就是說,大家敲入make實際上執行的make droid。而接下來大家看看main.mk文件里最后面的部分,會有很多偽目標,如sdk、clean、clobber等,這些在默認的make droid的命令下是不會執行的。我們可以在make后加上這些標簽來單獨實現一些操作。如:輸入make sdk 將會生成該版本對應的SDK,輸入make clean會清除上次編譯的輸出。

    模塊編譯

    有時候我們只修改了某一個模塊,希望能單獨編譯這個模塊而不是重新完整編譯一次,這時候我們要用到 build/envsetup.sh中提供的幾個bash的幫助函數。

    在 源代碼根目錄下執行:

    .  build/envsetup.sh(.后面有空格)

    這 樣大家相當于多了幾個可用的命令。

    這 時可以用help命令查看幫助信息:

    Android 
Building System - bimoshi - 血域天使的個人主頁

    其中對模塊編譯有幫助的是tapas、m、mm、mmm這幾個命令。

    1、 tapas——以交互方式設置build環境變量。

       輸入:tapas

        第一步,選擇目標設備:

    Android 
Building System - bimoshi - 血域天使的個人主頁

         例如 我們選擇1

        第二步,選擇代碼格式:

    Android Building System - bimoshi - 血域天使的個人主頁

    我們選擇1

    第三步,選擇產品平臺:

    Android 
Building System - bimoshi - 血域天使的個人主頁

         注意:這里,Google源代碼里默認是generic,而我們針對自己的產品應修改成mobot

               具體在build/envsetup.sh里的函數chooseproduct()中對相應代碼進行修 改。

     

    2、 m、mm、mmm使用獨立模塊的make命令。

    幾個命 令的功能使用help命令查看。

    舉個例 子,我們修改了Camera模塊的代碼,現 在需要重新單獨編譯這一塊,這時可以使用mmm命令,后面跟指定模塊的路徑(注意是模塊的根目錄)。

    具體如 下:

    mmm packages/apps/Camera/

    為了可 以直接測試改動,編譯好后需要重新生成system.img

    可以執 行:make snod

    單獨編譯image文件

    一般我 們完整編譯后,會生成三個重要的image文 件:ramdisk.img、system.img和userdata.img。當然我們可以分開單獨去編譯 這三個目標:

    make ramdisk —— ramdisk.img

    make userdataimage —— userdata.img

    make systemimage  —— system.img

    一些疑問和解答:

    1)  什么是recovery.img?

    顧名思義,recovery.img是為了恢復系統的,相對于普通的boot.img,recovery.img多了一些圖片文件(恢復時界面的背景)、/sbin/recovery/目錄(跟 恢復有關的二進制文件),一 些初始化文件也不相同(init.rc、init.goldfish.rc、default.prop)

    這就是為什么啟 動恢復模式時會進入類似文本界面而不是圖形界面。

    將recovery.img文件復制到SD卡中,進入shell下輸入:

    mount -a

    flash_image recovery /sdcard/recovery.img

    若提示“no space on device”,可用fastboot模式刷

    fastboot erase recovery

    fastboot flash recovery recovery.img

    在關機狀態下按home+power鍵進入recovery模式,根據選項選擇需要的操作。

     

    2)  make sdk和make droid編譯有什么不同?

    make sdk:

    其實,執行make sdk,編譯后會在目錄out/host/linux-x86里生成sdk目錄,這個sdk和官方下載的sdk包是一樣的,可以直接使用。

    make droid:

    實際上droid就是默認的生成目標,和直接敲make是一樣的,都會完整編譯出目標image文件,但不會編譯出sdk。

     

    3)  我們將默認產 品改為mobot,那我怎么編譯原先的generic?

    其實,無論編譯哪個目標產品版本,只要產品相關設置存在,都可以直接在編譯時加上目標產品名來編譯。會在out/target/product/下生成對應的 產品輸出目錄,如:要編譯generic版本:

    make TARGET_PRODUCT := generic


    原帖:http://bimoshi.blog.163.com/blog/static/14613297201022233711527/


    posted on 2011-10-19 16:53 MEYE 閱讀(675) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 最新久久免费视频| 一二三区免费视频| 国产亚洲Av综合人人澡精品| 国产亚洲男人的天堂在线观看| 九九九精品视频免费| 黄网站免费在线观看| 97国产免费全部免费观看| 午夜视频免费成人| 久久精品国产精品亚洲| 亚洲综合精品一二三区在线| 亚洲色偷偷色噜噜狠狠99网| 日本免费精品一区二区三区| 无人在线观看免费高清| 天天操夜夜操免费视频| 最新精品亚洲成a人在线观看| 中文字幕亚洲免费无线观看日本 | 亚洲人成色7777在线观看不卡| 亚洲av午夜成人片精品网站| 亚洲香蕉在线观看| 一级黄色免费大片| 亚州免费一级毛片| 亚洲 小说区 图片区 都市| 久久香蕉国产线看观看亚洲片| 亚洲最大的成人网站| 3344在线看片免费| 午夜老司机免费视频| 亚洲av无码国产精品夜色午夜| 亚洲av日韩av永久在线观看| 97无码人妻福利免费公开在线视频| 天天看片天天爽_免费播放| 亚洲va无码va在线va天堂| 老司机亚洲精品影院在线观看| 国产精品区免费视频| 国产女高清在线看免费观看| 亚洲国产精品自在在线观看| 精品国产亚洲第一区二区三区| 99精品一区二区免费视频| 亚洲A丁香五香天堂网| 亚洲人成影院77777| 你是我的城池营垒免费看| 日韩a在线观看免费观看|