97干视频,99国产精品懂色,亚洲精品99久久久久中文字幕,伊人五月丁香综合AⅤ,国产精品成人免费999

  您的位置:華清遠見教育科技集團 >> 新聞動態(tài) >> Android資料 >> Android編譯過程詳解(三)  
 
Android編譯過程詳解(三)
分享到:

前面兩節(jié)講解了自定義Android編譯項和創(chuàng)建Product產(chǎn)品配置文件,除了編譯和定義產(chǎn)品相關(guān)環(huán)境變量外,還需要定義Board相關(guān)環(huán)境變量。

1、 build/core/config.mk

[plain] view plaincopy

<pre name="code" class="plain">109 # --------------------------------------------------------
    110 # Define most of the global variables. These are the ones that
    111 # are specific to the user's build configuration.
    112 include $(BUILD_SYSTEM)/envsetup.mk
    113
    114 # Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
    115 # or under vendor/*/$(TARGET_DEVICE). Search in both places, but
    116 # make sure only one exists.
    117 # Real boards should always be associated with an OEM vendor.
    118 board_config_mk := \
    119 $(strip $(wildcard \
    120 $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
    121 vendor/*/$(TARGET_DEVICE)/BoardConfig.mk \
    122 ))
    123 ifeq ($(board_config_mk),)
    124 $(error No config file found for TARGET_DEVICE $(TARGET_DEVICE))
    125 endif
    126 ifneq ($(words $(board_config_mk)),1)
    127 $(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk))
    128 endif
    129 include $(board_config_mk)
    130 TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
    131 board_config_mk :=

上述代碼在上一節(jié)已經(jīng)見到過,只是分析了112行的envsetup.mk,根據(jù)上一節(jié)內(nèi)容可知,envsetup.mk設(shè)置了很多OUT變量,終在build/core/product_config.mk文件里,設(shè)置了TARGET_DEVICE = fs100。

我們從114行繼續(xù)分析。

從114~117行解釋大意可知:

Board相關(guān)配置文件會存在于$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/或vendor/*/$(TARGET_DEVICE)/目錄中,一個Vendor廠商只能有一個對應(yīng)的Board配置文件。

118行定義board_config_mk變量:

$(wildcard xxx)函數(shù)就是找到與xxx的匹配項放到空格列表里,前面定義TARGET_DEVICE變量 = fs100,所以$(SRC_TARGET_DIR)/board/fs100/BoardConfig.mk不存在,必須要存在vendor/*/fs100/BoardConfig.mk文件來定義開發(fā)板配置信息。

129行,通過include將vendor/*/fs100/BoardConfig.mk包含進來,

130行,TARGET_DEVICE_DIR為board_config_mk的路徑,即:vendor/*/fs100

總結(jié):

一個vendor廠商必須要有一個對應(yīng)的Board配置文件,即:vendor/*/fs100/BoardConfig.mk

定義了TARGET_DEVICE_DIR變量,為board_config_mk的路徑,即:vendor/*/fs100

指定board 相關(guān)特性,一定要包含:TARGET_CPU_ABI := armeabi/...

其他屬性參見其他board樣例.(build/target/board/XXX

2、build/core/main.mk

[plain] view plaincopy

141 # Bring in standard build system definitions.
    142 include $(BUILD_SYSTEM)/definitions.mk
    ...
    347 ifeq ($(SDK_ONLY),true)
    348
    349 # ----- SDK for Windows ------
    350 # These configure the build targets that are available for the SDK under Cygwin.
    351 # The first section defines all the C/C++ tools that can be compiled under Cygwin,
    352 # the second section defines all the Java ones (assuming javac is available.)
    353
    354 subdirs := \
    355 prebuilt \
    356 build/libs/host \
    357 build/tools/zipalign \
    ...
    382 # The following can only be built if "javac" is available.
    383 # This check is used when building parts of the SDK under Cygwin.
    384 ifneq (,$(shell which javac 2>/dev/null))
    385 $(warning sdk-only: javac available.)
    386 subdirs += \
    387 build/tools/signapk \
    388 dalvik/dx \
    389 dalvik/libcore \
    ...
    414 else # !SDK_ONLY
    415 ifeq ($(BUILD_TINY_ANDROID), true)
    416
    417 # TINY_ANDROID is a super-minimal build configuration, handy for board
    418 # bringup and very low level debugging
    419
    420 subdirs := \
    421 bionic \
    422 system/core \
    423 build/libs \
    424 build/target \
     ...
    433 else # !BUILD_TINY_ANDROID
    434
    435 #
    436 # Typical build; include any Android.mk files we can find.
    437 #
    438 subdirs := $(TOP)
    439
    440 FULL_BUILD := true
    441
    442 endif # !BUILD_TINY_ANDROID
    443
    444 endif # !SDK_ONLY
    ...
    464 #
    465 # Include all of the makefiles in the system
    466 #
    467
    468 # Can't use first-makefiles-under here because
    469 # --mindepth=2 makes the prunes not work.
    470 subdir_makefiles := \
    471 $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)
    472
    473 include $(subdir_makefiles)

上一節(jié)只是講了main.mk第49行中包含了config.mk,我們繼續(xù)分析。

142行包含了:build/core/definitions.mk,該文件定義了很多全局變量與函數(shù)。

如下列常見函數(shù):

my-dir:返回當前路徑

all-java-files-under:獲得指定目錄及子目錄一所有java文件

all-subdir-c-files:獲得當前目錄下及子目錄下所有c文件

354~444行,定義了subdirs變量,依據(jù)不同的用戶編譯條件,而包含Android源碼中不同的目錄。

470行,定義了subdir_makefile變量,其值為subdirs定義的目錄中的Android.mk文件。

473行,將所有編譯目錄中的Android.mk文件包含進來。

3、 build/target/board/Android.mk

[plain] view plaincopy

26 ifeq (,$(wildcard $(TARGET_DEVICE_DIR)/AndroidBoard.mk))
    27 ifeq (,$(wildcard $(TARGET_DEVICE_DIR)/Android.mk))
    28 $(error Missing "$(TARGET_DEVICE_DIR)/AndroidBoard.mk")
    29 else
    30 # TODO: Remove this check after people have had a chance to switch,
    31 # after April 2009.
    32 $(error Please rename "$(TARGET_DEVICE_DIR)/Android.mk" to "$(TARGET_DEVICE_DIR)/AndroidBoard.mk")
    33 endif
    34 endif
    35 include $(TARGET_DEVICE_DIR)/AndroidBoard.mk

由于將所有目錄中Android.mk文件include進來,build/target/board/Android.mk自然被包含進來,根據(jù)前面分析,TARGET_DEVICE_DIR = vendor/*/fs100,其中26~35行用來判斷對應(yīng)的產(chǎn)品目錄下是否存在AndrodiBoard.mk,如果不存在,提示出錯退出,如果存在,將其包含到編譯腳本中。

由此可見:我們必須要在產(chǎn)品目錄下創(chuàng)建AndrodiBoard.mk文件,來描述開發(fā)板相關(guān)配置項,我們可以借鑒:build/target/board/generic/AndroidBoard.mk內(nèi)容,同時根據(jù)前面所分析,還要創(chuàng)建BoardConfig.mk文件。

[plain] view plaincopy

#cp build/target/board/generic/AndroidBoard.mk build/target/board/generic/BoardConfig.mk vendor/farsight/fs100/

至此,自定義Android編譯選項基本步驟已經(jīng)分部分析完,細節(jié)還需要針對不同開發(fā)板具體分析。

總結(jié):

build/core/main.mk包含了config.mk,它主要定義了編譯全部代碼的依賴關(guān)系

build/core/config.mk 定義了大量的編譯腳本命令,編譯時用到的環(huán)境變量,引入了envsetup.mk 文件,加載board相關(guān)配置文件。
    build/core/envsetup.mk 定義了編譯時用到的大量OUT輸出目錄,加載product_config.mk文件
    build/core/product_config.mk 定義了Vendor目錄下Product相關(guān)配置文件解析腳本,讀取AndrodProducts.mk生成TARGET_DEVICE變量
    build/target/product product config
    build/target/board board config
    build/core/combo build flags config

這里解釋下這里的board和product。borad主要是設(shè)計到硬件芯片的配置,比如是否提供硬件的某些功能,比如說GPU等等,或者芯片支持浮 點運算等等。product是指針對當前的芯片配置定義你將要生產(chǎn)產(chǎn)品的個性配置,主要是指APK方面的配置,哪些APK會包含在哪個product中, 哪些APK在當前product中是不提供的。

config.mk是一個總括性的東西,它里面定義了各種module編譯所需要使用的HOST工具以及如何來編譯各種模塊,比如說 BUILT_PREBUILT就定義了如何來編譯預編譯模塊。envsetup.mk主要會讀取由envsetup.sh寫入環(huán)境變量中的一些變量來配置編譯過程中的輸出目錄,combo里面主要定義了各種Host和Target結(jié)合的編譯器和編譯選項。

1)在vendor目錄下創(chuàng)建自己公司目錄,然后在公司目錄下創(chuàng)建一個新的vendorsetup.sh,在里面添加上自己的產(chǎn)品編譯項

[plain] view plaincopy

#mkdir vendor/farsight/
    #touch vendor/farsight/vendorsetup.sh
    #echo "add_lunch_combo fs100-eng" > vendor/farsight/vendorsetup.sh

2)仿著Android示例代碼,在公司目錄下創(chuàng)建products目錄

[plain] view plaincopy

#mkdir -p vendor/farsight/products

3)仿著Android示例代碼,在products目錄下創(chuàng)建兩個mk文件

[plain] view plaincopy

#touch vendor/farsight/products/AndroidProduct.mk vendor/farsight/products/fs100.mk

在AndroidProduct.mk里添加如下內(nèi)容:

[sql] view plaincopy

PRODUCT_MAKEFILES := $(LOCAL_DIR)/fs100.mk

在產(chǎn)品配置文件里添加基本信息

[plain] view plaincopy

PRODUCT_PACKAGES := \
    IM \
    VoiceDialer
    $(call inherit-product, build/target/product/generic.mk)
    # Overrides
    PRODUCT_MANUFACTURER := farsight
    PRODUCT_NAME := fs100
    PRODUCT_DEVICE := fs100

4)借鑒build/target/board/generic/AndroidBoard.mk和BoardConfig.mk,創(chuàng)建對應(yīng)文件。

[plain] view plaincopy

#cp build/target/board/generic/AndroidBoard.mk build/target/board/generic/BoardConfig.mk vendor/farsight/fs100/

 
 更多相關(guān)文章

·Android HAL 開發(fā)
·Android編譯過程詳解(二)
·Android平板電腦的設(shè)計
·在Android中使用VideoView播放視頻
·Android編譯過程詳解(一)