定制新设备

 一、Android如何编译特定product
  
  首先来看看Android Makefile是如何解析环境变量TARGET_PRODUCT的。
  Android Makefile 的引用关系是这样的:   Makefile  -> build/core/main.mk ->build/core/config.mk ->build/core/envsetup.mk   ->build/core/product_config.mk  在build/core/product_config.mk 中编译系统首先调用build/core/product.mk中定义的函数  get-all-product-makefiles,来遍历整个device 的子目录, 找到device下所有的   AndroidProducts.mk, 不同子目录下的AndroidProducts.mk 中定义了不同的PRODUCT_NAME,   PRODUCT_DEVICE 等信息,(我们也可以通过打开build/core/product_config.mk中的#$(dump- products)语句使控制台编译的时候输出所有product 的信息),接着  build/core/product_config.mk会调用resolve-short-product-name将TARGET_PRODUCT匹配的  AndroidProducts.mk 中定义的 PRODUCT_DEVICE 赋值给TARGET_DEVICE。有了这个  TARGET_DEVICE, 再回到build/core/config.mk,  会include $(TARGET_DEVCIE)/BoardConfig.mk      board_config_mk := \
       $(strip $(wildcard \
       $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
       vendor/*/$(TARGET_DEVICE)/BoardConfig.mk \
      ))
     include $(board_config_mk)   而这个配置文件BoardConfig.mk 决定了目标系统编译属性,比如使用ALSA还是不是GENERIC_AUDIO   等等, 另外在这里TARGET_DEVICE 宏也决定了TARGET_DEVICE_DIR,因为TARGET_DEVICE_DIR 取的  是上面提到的BoardConfig.mk 的路径。
     TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))  当然Android的Ob目标输出也是由TARGET_DEVICE决定,见build/core/envsetup.mk      TARGET_OUT_ROOT_release := $(OUT_DIR)/target
     TARGET_OUT_ROOT_debug := $(DEBUG_OUT_DIR)/target
     TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))     TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product
     PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)   再回到build/core/main.mk, 编译系统接着做的一个件事情是,遍历所有字目录,找到所有 Android.mk文件,并将这些Android.mk文件include 进来      #
     # Typical build; include any Android.mk files we can find.
     #     subdir_makefiles := \
      $(shell build/tools/findleaves.py --prune=out --prune=.repo--prune=.git $(subdirs) Android.mk)     include$(subdir_makefiles)   再来看其中的./build/target/board/Android.mk,对了它引用了     include $(TARGET_DEVICE_DIR)/AndroidBoard.mk  由上面TARGET_DEVICE_DIR的定义,这下又进入了device下TARGET_DEVICE指向的目录了,这个mk文件 中定义了特定Product需要编译和安装的app 和 script.
二、创建新设备的配置架构
    
  device-|
         |--|
                          |--|
                                         |-AndroidBoard.mk
                                         |-BoardConfig.mk                      
                          |-products-|
                                     |-AndroidProducts.mk
                                     |-.mk
                                     |-.mk
  三、具体配置分析
  
  1、AndroidProducts.mk
    在AndroidProducts.mk中只会包括PRODUCT_MAKEFILES变量,一般格式如下:
    PRODUCT_MAKEFILES := \
      $(LOCAL_DIR)/.mk
      
  2、.mk
    在.mk中一般包括如下配置:
    $(call inherit-product, &(SRC_TARGET_DIR)/product/languages_full.mk)
      
    PRODUCT_BRAND := freescale
    PRODUCT_MANUFACTUER := freescale
    PRODUCT_NAME :=
    PRODUCT_DEVICE :=
    PRODUCT_COPY_FILE += \
          device/mine/mine_mx53/init.rc:root/init.freescale.rc
    如果选择通用package的话,添加generic.mk:
    $(call inherit-product, &(SRC_TARGET_DIR)/product/generic.mk)
    如果要重新选择安装的package,需要重定义
      PRODUCT_PACKAGES := \
          Music \
          Email \
          ...
    
  3、AndroidBoard.mk
    一般会在此添加Keypad的定义:
    LOCAL_PATH := $(call my-dir)
    file := $(TARGET_OUT_KEYLAYOUT)/mxckpd.kl
    ALL_PREBUILT += $(file)
    $(file): $(LOCAL_PATH)/mxckpd.kl | $(ACP)
         $(transform-prebuilt-to-target)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := mxckpd.kcm
    include $(BUILD_KEY_CHAR_MAP)
    
  4、BoardConfig.mk
    一般在此定义board的特性,例如:
    TARGET_CPU_ABI := armeabi
    TARGET_NO_BOOTLOADER := true
    TARGET_NO_KERNEL := true
    TARGET_PROVIDES_INIT_RC := true
    BOARD_HAVE_WIFI := true
    BOARD_HAVE_MODEM := true
    BOARD_USES_ALSA_AUDIO := true
10-25 17:22
查看更多