Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9149109
  • 博文数量: 1726
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 19850
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1726)

文章存档

2024年(2)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Android平台

2014-04-25 16:42:24

定制新设备

 一、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
阅读(3330) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~