Android編譯系統

來源:互聯網
上載者:User

一、Android編譯步驟:

  

二、初始化編譯環境--source build/envsetup.sh

  在build/envsetup.sh中主要完成了三件事。

  

  添加編譯目標的代碼如下:

 f  `/bin/ vendor*/vendorsetup. devicevendorsetup. > /dev/     
三、選擇編譯目標--lunch

  通過lunch選擇編譯目標,函數定義如下:

 [  ] ; =$     -n =
  //如果沒有編譯目標預設為full-eng,否則如果answer是數字就將其轉換為對應的字串表示 [ -z =full- ( -n $answer | -q -e [ $answer -=${LUNCH_MENU_CHOICES[$(($answer- ( -n $answer | -q -e =
  //如果表示編譯目標的字串是空的表示非法選擇,錯誤返回 [ -z = //檢測選擇的product是否合法(只要在相應目錄建立vendorsetup.sh並add_lunch_combo就可在lunch menu中顯示相應項,但如果不配置product相關資訊就會Invalid)=$( -n $selection | -e [ $? -ne =   //從selection解析出product,variant local variant=$( -n $selection | -e [ $? -ne = [ -z -o -z   //匯出TARGET_PRODECT,TARGET_BUILD_VARIANT與TARGET_BUILD_TYPE,比如若選擇的是full-eng,那麼TARGET_PRODUCT=full,TARGET_BUILD_VARIANT=eng export TARGET_PRODUCT===
四、編譯--make -j8

  要make肯定有Makefile,Android根目錄的Makefile只是簡單地include進來了一個檔案:

 include build/core/ ### DO NOT EDIT THIS FILE ###  

  而build/core/main.mk就比較複雜了,以下是main.mk的結構圖:

  在main.mk中首先定義了預設編譯目標並做版本檢查,然後include config.mk。

  在config.mk中定義了在Android.mk中編譯目標時會用到的常量

CLEAR_VARS:= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/= $(BUILD_SYSTEM)/host_native_test.mk

  然後include進來了/build/core/envsetup.sh,在envsetup.sh中定義了HOST_OS,OUT_DIR等環境變數,並通過include product_config.mk檢索所有Product,並做有效性檢查,然後根據lunch時選擇的Product設定TARGET_DEVICE。

  然後在envsetup.sh中根據TARGET_DEVICE尋找BoardConfig.mk檔案進行Board相關配置,尋找KERNEL_HEADER,配置編譯工具鏈。

  在definitions.mk中定義了all_makefiles_under等用來檢索檔案的函數。

  根據TARGET_BUILD_VARIANT設定ro.secure等系統屬性,設定tags_to_install等變數。

  接下來通過

subdir_makefiles :=/tools/findleaves.py --prune=out --prune=.repo --prune=

  找到所有子目錄下的Android.mk檔案並include進來,這樣在Android.mk定義的LOCAL_PACKAGE_NAME與include $(BUILD_PACKAGE)就可以將相應的Android.mk中定義的目標包含進編譯模組中,在config.mk中有如下定義:

BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk

  而package.mk又包含base_rules.mk將LOCAL_MODULE添加到ALL_MODULES中。

  post_clean.mk是跟Resource Overlay相關,使們們不需要修改framework中原來的資源檔就可以定義framework-res.apk中的資源。

  接下來include build/core/Makefile檔案,定義bootimage,systemimage等依賴目標,然後通過make編譯droid(預設)目標就可以編譯系統了。

  Android採用檢索所有子目錄中的Android.mk將所有要編譯的模組收集起來的方式編譯系統,而不是進入到每個子目錄執行make,這樣就方便了我們添加自己的模組。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.