javascript:void(0)
通過上一節“android編譯系統(三)-make”的分析,初步理清楚了編譯初期加載産品相關資訊的流程,整個過程主要涉及三個檔案:1.AndroidProducts.mk,2.具體産品的配置檔案,3.BoardConfig.mk,加上lunch需要的vendorsetup.sh檔案,總共隻需要四個檔案就可以了,是以我們不妨成熱打鐵,趕緊嘗試下如何新增一個産品。是以,android編譯系統鏡像檔案的建立過程方到下一節。
一.檔案建立
在device下建立如下目錄:
cat
--fish
就是說我們的公司是cat,我們的産品fish。然後在fish下建立四個檔案:
1.1vendorsetup.sh
這個檔案内容如下:
[plain]
view plain
copy
print?
- add_lunch_combo fish-eng
當我們執行source build/envsetup.sh的時候,就會找到我們的這個檔案,lunch的時候就會在菜單中顯示我們的産品。具體這個檔案的加載過程可以參考《android編譯系統分析一<source build/envsetup.sh與lunch>》。
1.2AndroidProducts.mk
[plain]
view plain
copy
print?
- PRODUCT_MAKEFILES := \
- $(LOCAL_DIR)/fish.mk
也是隻有一行,就是指明産品的配置檔案是哪個。這個腳本會在執行make後,product_config.mk下通過查找指令找到,找到後就會加載進來。
1.3fish.mk
[plain]
view plain
copy
print?
- $(call inherit-product, device/generic/armv7-a-neon/mini_common.mk)
- PRODUCT_NAME := fish
- PRODUCT_DEVICE := fish
- PRODUCT_BRAND := Android
這個腳本在加載完AndroidProducts.mk後就會被加載,用來配置産品名稱等資訊。因為它繼承了mini_common.mk,是以我們隻需要配置幾個有差異的變量即可。
1.4BoardConfig.mk
[plain]
view plain
copy
print?
- TARGET_NO_BOOTLOADER := true
- TARGET_NO_KERNEL := true
- TARGET_ARCH := x86
- TARGET_CPU_ABI := x86
- SMALLER_FONT_FOOTPRINT := true
- MINIMAL_FONT_FOOTPRINT := true
- # Some framework code requires this to enable BT
- BOARD_HAVE_BLUETOOTH := true
- BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/generic/common/bluetooth
- # Build OpenGLES emulation libraries
- BUILD_EMULATOR_OPENGL := true
- BUILD_EMULATOR_OPENGL_DRIVER := true
- USE_OPENGL_RENDERER := true
- BOARD_USE_LEGACY_UI := true
- # share the same one across all mini-emulators
- BOARD_EGL_CFG := device/generic/goldfish/opengl/system/egl/egl.cfg
- # PDK does not use ext4 image, but it is added here to prevent build break.
- TARGET_USERIMAGES_USE_EXT4 := true
- BOARD_SYSTEMIMAGE_PARTITION_SIZE := 576716800
- BOARD_USERDATAIMAGE_PARTITION_SIZE := 419430400
- BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016
- BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
- BOARD_FLASH_BLOCK_SIZE := 512
- TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true
這個腳本參考了device/generic/x86/BoardConfig.mk,基本不用修改。這樣,新增一個産品所需的四個檔案都配置好了。以上三個檔案具體加載流程可參考《android編譯系統分析(三)-make》。
二.嘗試編譯
首先source build/envsetup.sh,然後執行lunch :
菜單輸出如下:
[plain]
view plain
copy
print?
- Lunch menu... pick a combo:
- 1. aosp_arm-eng
- 2. aosp_arm64-eng
- 3. aosp_mips-eng
- 4. aosp_mips64-eng
- 5. aosp_x86-eng
- 6. aosp_x86_64-eng
- 7. fish-eng
- 8. mini_emulator_arm64-userdebug
- 9. m_e_arm-userdebug
- 10. mini_emulator_mips-userdebug
- 11. mini_emulator_x86_64-userdebug
- 12. mini_emulator_x86-userdebug
可以看到我們的産品已經出現,這裡選擇7:
[plain]
view plain
copy
print?
- Which would you like? [aosp_arm-eng] 7
- ============================================
- PLATFORM_VERSION_CODENAME=REL
- PLATFORM_VERSION=6.0
- TARGET_PRODUCT=fish
- TARGET_BUILD_VARIANT=eng
- TARGET_BUILD_TYPE=release
- TARGET_BUILD_APPS=
- TARGET_ARCH=x86
- TARGET_ARCH_VARIANT=x86
- TARGET_CPU_VARIANT=
- TARGET_2ND_ARCH=
- TARGET_2ND_ARCH_VARIANT=
- TARGET_2ND_CPU_VARIANT=
- HOST_ARCH=x86_64
- HOST_OS=linux
- HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
- HOST_BUILD_TYPE=release
- BUILD_ID=MRA58K
- OUT_DIR=out
- ============================================
可以看到列印出了配置資訊,TARGET_PRODUCT=fish,TARGET_BUILD_TYPE=eng等。
最後嘗試編譯,首先make clean,然後再make
編譯結束後在out下生成對應産品的檔案:
這隻是一個簡單的嘗試,更加複雜的産品定制期待與大家共同探讨。