<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Android編譯系統

      一、Android編譯步驟:

        

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

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

        

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

      for f in `/bin/ls vendor/*/vendorsetup.sh vendor/*/*/vendorsetup.sh device/*/*/vendorsetup.sh 2> /dev/null`
      do
          echo "including $f"
          . $f
      done
      unset f

      三、選擇編譯目標--lunch

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

      function lunch(){
          local answer  
        //如果調用lunch時帶參數就表示手動指定編譯目標,否則打印選擇編譯目標的菜單 if [ "$1" ] ; then answer=$1 else print_lunch_menu echo -n "Which would you like? [full-eng] " read answer fi local selection=
        //如果沒有編譯目標默認為full-eng,否則如果answer是數字就將其轉換為對應的字符串表示 if [ -z "$answer" ] then selection=full-eng elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$") then if [ $answer -le ${#LUNCH_MENU_CHOICES[@]} ] then selection=${LUNCH_MENU_CHOICES[$(($answer-1))]} fi elif (echo -n $answer | grep -q -e "^[^\-][^\-]*-[^\-][^\-]*$") then selection=$answer fi
        //如果表示編譯目標的字符串是空的表示非法選擇,錯誤返回 if [ -z "$selection" ] then echo echo "Invalid lunch combo: $answer" return 1 fi export TARGET_BUILD_APPS=
      //檢測選擇的product是否合法(只要在相應目錄新建vendorsetup.sh并add_lunch_combo就可在lunch menu中顯示相應項,但如果不配置product相關信息就會Invalid)

        local product=$(echo -n $selection | sed -e "s/-.*$//") check_product $product if [ $? -ne 0 ] then echo echo "** Don't have a product spec for: '$product'" echo "** Do you have the right repo manifest?" product= fi
        //從selection解析出product,variant local variant
      =$(echo -n $selection | sed -e "s/^[^\-]*-//") check_variant $variant if [ $? -ne 0 ] then echo echo "** Invalid variant: '$variant'" echo "** Must be one of ${VARIANT_CHOICES[@]}" variant= fi if [ -z "$product" -o -z "$variant" ] then echo return 1 fi
        //導出TARGET_PRODECT,TARGET_BUILD_VARIANT與TARGET_BUILD_TYPE,比如若選擇的是full-eng,那么TARGET_PRODUCT=full,TARGET_BUILD_VARIANT=eng export TARGET_PRODUCT
      =$product export TARGET_BUILD_VARIANT=$variant export TARGET_BUILD_TYPE=release echo set_stuff_for_environment printconfig }

      四、編譯--make -j8

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

      1 ### DO NOT EDIT THIS FILE ###  
      2 include build/core/main.mk  
      3 ### DO NOT EDIT THIS FILE ###  

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

        在main.mk中首先定義了默認編譯目標并做版本檢查,然后include config.mk。

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

      CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
      BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
      BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
      BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
      BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
      BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
      BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
      BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
      BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
      BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
      BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk
      BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
      BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
      BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
      BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
      BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
      BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
      BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
      BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
      BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk
      BUILD_HOST_NATIVE_TEST := $(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 := \
          $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)
       
      include $(subdir_makefiles)

        找到所有子目錄下的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,這樣就方便了我們添加自己的模塊。

       

      posted @ 2013-05-19 12:55  AngelDevil  閱讀(15221)  評論(3)    收藏  舉報
      主站蜘蛛池模板: 久久国产成人午夜av影院| 丁香五月亚洲综合在线国内自拍 | 亚洲不卡一区三区三区四| 国产盗摄xxxx视频xxxx| 男同精品视频免费观看网站| 永久免费无码av在线网站| 亚洲国产欧美一区二区好看电影| 亚洲欧美自偷自拍视频图片| 亚洲精品一区久久久久一品av| 亚洲色最新高清AV网站| 男人的天堂va在线无码| 日韩精品中文字幕亚洲| 国产一区二区不卡在线| 大安市| 国产一区二区三区av在线无码观看| 亚洲乱码中文字幕小综合| 色成人精品免费视频| 国产欧美日韩亚洲一区二区三区| 免费黄色大全一区二区三区| 人妻中文字幕亚洲精品| 美女黄18以下禁止观看| 色综合色狠狠天天综合网| 中文字幕日韩国产精品| 免费视频成人片在线观看 | www久久只有这里有精品| 看全黄大色黄大片视频| 韩国19禁无遮挡啪啪无码网站 | 亚洲顶级裸体av片| 国产在线无码视频一区二区三区| 老熟女高潮一区二区三区| 在线精品国产中文字幕| 亚洲无人区视频在线观看| 中文字幕在线不卡一区二区| av一区二区中文字幕| 国产精品制服丝袜白丝| 99精品伊人久久久大香线蕉| 国产成人无码一二三区视频| 那坡县| 亚洲综合天堂一区二区三区| 人妻精品人妻无码一区二区三区| 国产999精品2卡3卡4卡|