Chinaunix首页 | 论坛 | 博客
  • 博客访问: 250155
  • 博文数量: 26
  • 博客积分: 1425
  • 博客等级: 上尉
  • 技术积分: 270
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-14 23:54
文章存档

2010年(26)

我的朋友

分类: 嵌入式

2010-09-27 20:41:01


定制新设备
 
一、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
    ...
    
  
  
  
  
阅读(3938) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

lyx20002010-12-29 11:00:54

前辈你好, 请问一下,我想在android下编译一个hello的简单内核驱动,我想脱离andriod的内核编译,就是用下面的makefile: objfile= hello.o kofile = hello.ko obj-m := $(objfile) KERNELDIR := /home/lyx2000/androidkernel default: make -C $(KERNELDIR) M=$(shell pwd) modules install: insmod $(kofile) uninstall: rmmod $(kofile) clean: make -C $(KERNELDIR) M=$(shell pwd) clean 但编译出错,请问在android下能这样实现吗,当前我的android的内核编译是没问题的,帮忙检查一下,谢谢!