天天看點

android編譯系統分析(四)實戰:新增一個産品

​​javascript:void(0)​​

通過上一節“android編譯系統(三)-make”的分析,初步理清楚了編譯初期加載産品相關資訊的流程,整個過程主要涉及三個檔案:1.AndroidProducts.mk,2.具體産品的配置檔案,3.BoardConfig.mk,加上lunch需要的vendorsetup.sh檔案,總共隻需要四個檔案就可以了,是以我們不妨成熱打鐵,趕緊嘗試下如何新增一個産品。是以,android編譯系統鏡像檔案的建立過程方到下一節。

一.檔案建立

在device下建立如下目錄:

cat

--fish

        就是說我們的公司是cat,我們的産品fish。然後在fish下建立四個檔案:

android編譯系統分析(四)實戰:新增一個産品

1.1vendorsetup.sh

這個檔案内容如下:

[plain] ​​

view plain​​​ ​​

copy​​​ ​​

print​​​​?​​​​​​

  1. add_lunch_combo fish-eng

當我們執行source build/envsetup.sh的時候,就會找到我們的這個檔案,lunch的時候就會在菜單中顯示我們的産品。具體這個檔案的加載過程可以參考《android編譯系統分析一<source build/envsetup.sh與lunch>》。

1.2AndroidProducts.mk

[plain] ​​

view plain​​​ ​​

copy​​​ ​​

print​​​​?​​​​​​

  1. PRODUCT_MAKEFILES := \
  2. $(LOCAL_DIR)/fish.mk

也是隻有一行,就是指明産品的配置檔案是哪個。這個腳本會在執行make後,product_config.mk下通過查找指令找到,找到後就會加載進來。

1.3fish.mk

[plain] ​​

view plain​​​ ​​

copy​​​ ​​

print​​​​?​​​​​​

  1. $(call inherit-product, device/generic/armv7-a-neon/mini_common.mk)
  2. PRODUCT_NAME := fish
  3. PRODUCT_DEVICE := fish
  4. PRODUCT_BRAND := Android

這個腳本在加載完AndroidProducts.mk後就會被加載,用來配置産品名稱等資訊。因為它繼承了mini_common.mk,是以我們隻需要配置幾個有差異的變量即可。

1.4BoardConfig.mk

[plain] ​​

view plain​​​ ​​

copy​​​ ​​

print​​​​?​​​​​​

  1. TARGET_NO_BOOTLOADER := true
  2. TARGET_NO_KERNEL := true
  3. TARGET_ARCH := x86
  4. TARGET_CPU_ABI := x86
  5. SMALLER_FONT_FOOTPRINT := true
  6. MINIMAL_FONT_FOOTPRINT := true
  7. # Some framework code requires this to enable BT
  8. BOARD_HAVE_BLUETOOTH := true
  9. BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/generic/common/bluetooth
  10. # Build OpenGLES emulation libraries
  11. BUILD_EMULATOR_OPENGL := true
  12. BUILD_EMULATOR_OPENGL_DRIVER := true
  13. USE_OPENGL_RENDERER := true
  14. BOARD_USE_LEGACY_UI := true
  15. # share the same one across all mini-emulators
  16. BOARD_EGL_CFG := device/generic/goldfish/opengl/system/egl/egl.cfg
  17. # PDK does not use ext4 image, but it is added here to prevent build break.
  18. TARGET_USERIMAGES_USE_EXT4 := true
  19. BOARD_SYSTEMIMAGE_PARTITION_SIZE := 576716800
  20. BOARD_USERDATAIMAGE_PARTITION_SIZE := 419430400
  21. BOARD_CACHEIMAGE_PARTITION_SIZE := 69206016
  22. BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
  23. BOARD_FLASH_BLOCK_SIZE := 512
  24. TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true

這個腳本參考了device/generic/x86/BoardConfig.mk,基本不用修改。這樣,新增一個産品所需的四個檔案都配置好了。以上三個檔案具體加載流程可參考《​​android編譯系統分析(三)-make​​》。

二.嘗試編譯

首先source build/envsetup.sh,然後執行lunch :

菜單輸出如下:

[plain] ​​

view plain​​​ ​​

copy​​​ ​​

print​​​​?​​​​​​

  1. Lunch menu... pick a combo:
  2. 1. aosp_arm-eng
  3. 2. aosp_arm64-eng
  4. 3. aosp_mips-eng
  5. 4. aosp_mips64-eng
  6. 5. aosp_x86-eng
  7. 6. aosp_x86_64-eng
  8. 7. fish-eng
  9. 8. mini_emulator_arm64-userdebug
  10. 9. m_e_arm-userdebug
  11. 10. mini_emulator_mips-userdebug
  12. 11. mini_emulator_x86_64-userdebug
  13. 12. mini_emulator_x86-userdebug

可以看到我們的産品已經出現,這裡選擇7:

[plain] ​​

view plain​​​ ​​

copy​​​ ​​

print​​​​?​​​​​​

  1. Which would you like? [aosp_arm-eng] 7
  2. ============================================
  3. PLATFORM_VERSION_CODENAME=REL
  4. PLATFORM_VERSION=6.0
  5. TARGET_PRODUCT=fish
  6. TARGET_BUILD_VARIANT=eng
  7. TARGET_BUILD_TYPE=release
  8. TARGET_BUILD_APPS=
  9. TARGET_ARCH=x86
  10. TARGET_ARCH_VARIANT=x86
  11. TARGET_CPU_VARIANT=
  12. TARGET_2ND_ARCH=
  13. TARGET_2ND_ARCH_VARIANT=
  14. TARGET_2ND_CPU_VARIANT=
  15. HOST_ARCH=x86_64
  16. HOST_OS=linux
  17. HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
  18. HOST_BUILD_TYPE=release
  19. BUILD_ID=MRA58K
  20. OUT_DIR=out
  21. ============================================

可以看到列印出了配置資訊,TARGET_PRODUCT=fish,TARGET_BUILD_TYPE=eng等。

最後嘗試編譯,首先make clean,然後再make

編譯結束後在out下生成對應産品的檔案:

android編譯系統分析(四)實戰:新增一個産品

這隻是一個簡單的嘗試,更加複雜的産品定制期待與大家共同探讨。