在前文Android——编译系统初始化设置中有解析编译的TARGET_BUILD_VARIANT的配置与基本区别,

其中的一些编译控制是对的但是Module的Android.mk中的LOCAL_MODULE_TAGS 控制并不全适用目前的android4.2,这里记录一下我对Module的控制过程。


撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/39209341

一.LOCAL_MODULE_TAGS:

首先还是这个放在Android.mk中的变量,默认在/build/core/base_rules.mk 中:

LOCAL_MODULE_TAGS := $(sort $(LOCAL_MODULE_TAGS))ifeq (,$(LOCAL_MODULE_TAGS))  LOCAL_MODULE_TAGS := optionalendif

而且并不是 LOCAL_MODULE_TAGS :=optional 就会都安装进system.img !


LOCAL_MODULE_TAGS 在 android 4.2 能取的值有:

# Only the tags mentioned in this test are expected to be set by module# makefiles. Anything else is either a typo or a source of unexpected# behaviors.ifneq ($(filter-out debug eng tests optional samples shell_ash shell_mksh,$(LOCAL_MODULE_TAGS)),)$(warning unusual tags $(LOCAL_MODULE_TAGS) on $(LOCAL_MODULE) at $(LOCAL_PATH))endif

debug eng tests optional samples shell_ash shell_mksh 这几个值,没有user ,这是跟之前的一个差别!


其中TARGET_BUILD_VARIANT 还是对应:


eng

默认类型,安装 LOCAL_MODULE_TAGS 的类型为/build/core/main.mk:

ifeq ($(TARGET_BUILD_VARIANT),eng)tags_to_install := debug eng

安装 PRODUCT_PACKAGES 中定义的Module


user :

用于发行版,像之前描述的关闭log,shel,rootl,编译出odex Android——编译odex保护

LOCAL_MODULE_TAGS 的值不能为 user

安装哪些Module 只依赖与 PRODUCT_PACKAGES


userdebug :

用于调试,安装 LOCAL_MODULE_TAGS 的类型为/build/core/main.mk:

  ifeq ($(user_variant),userdebug)    # Pick up some extra useful tools    tags_to_install += debug


安装 PRODUCT_PACKAGES 中定义的Module



symbols 目录 :

这里记录一种现象,不管 Module 是apk 还是 lib ,有的时候在单独 mmm 编译 的时候,

是可以安装到 /out 中的system对应位置的,最后能够打包进系统的system.img


但是 如果整体的 make -j* 编译系统,那么 对应的 apk .lib 就会生成在 /out 下的 symbols/system 对应的位置,

最后是不会打包进系统system.img 的!


这就是因为 Module 的LOCAL_MODULE_TAGS 和当前的编译的TARGET_BUILD_VARIANT 没有满足上面说到的规则,

Module 并不认定为需要 install 的!

可以按照上面的规则,修改Module的 LOCAL_MODULE_TAGS 或者 看下面的 在 PRODUCT_PACKAGES 中添加 Module !


这里只区分对Module的安装控制,可以看到在4.2 中 对Module的控制级别最高的是 PRODUCT_PACKAGES 这个变量!



二.PRODUCT_PACKAGES :

这个变量在很多.mk中都有赋值,比如在device中的 device.mk 中,而且都是 类似这样的:

# jscese add libusb and compat lib ,usb-modeswitch execute binary for 3G PRODUCT_PACKAGES += \    rild \    libusb \    libusb-compat \    usb_modeswitch #end

都是 += 累加操作!

这就代表这些Module 无论如何都会被编译安装进系统。

简单记录下PRODUCT_PACKAGES 的作用过程

首先在main.mk中的

product_MODULES 以及 product_FILES

  # The base list of modules to build for this product is specified  # by the appropriate product definition file, which was included  # by product_config.make.  product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)  # Filter out the overridden packages before doing expansion  product_MODULES := $(filter-out $(foreach p, $(product_MODULES), \      $(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))  $(call expand-required-modules,product_MODULES,$(product_MODULES))  product_FILES := $(call module-installed-files, $(product_MODULES))


modules_to_install

modules_to_install := $(sort \    $(ALL_DEFAULT_INSTALLED_MODULES) \    $(product_FILES) \    $(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \    $(call get-tagged-modules, shell_$(TARGET_SHELL)) \    $(CUSTOM_MODULES) \  )

这个就是需要安装的一个变量了,有用到上面说得到的变量 tags_to_install 还有 product_FILES

modules_to_install 还会经过一些过滤处理,具体可看main.mk中


ALL_DEFAULT_INSTALLED_MODULES

# build/core/Makefile contains extra stuff that we don't want to pollute this# top-level makefile with.  It expects that ALL_DEFAULT_INSTALLED_MODULES# contains everything that's built during the current make, but it also further# extends ALL_DEFAULT_INSTALLED_MODULES.ALL_DEFAULT_INSTALLED_MODULES := $(modules_to_install)include $(BUILD_SYSTEM)/Makefilemodules_to_install := $(sort $(ALL_DEFAULT_INSTALLED_MODULES))ALL_DEFAULT_INSTALLED_MODULES :=

再加载进Android的 Makefile 文件,其中根据 ALL_DEFAULT_INSTALLED_MODULES 进行安装!这里暂不深入。


make 编译的时候的依赖如下:

droid:

# Building a full system-- the default is to build droidcoredroid: droidcore dist_files....PHONY: droid


droidcore :

# Build files and then package it into the rom formats.PHONY: droidcoredroidcore: files \    systemimage \    $(INSTALLED_BOOTIMAGE_TARGET) \    $(INSTALLED_RECOVERYIMAGE_TARGET) \    $(INSTALLED_USERDATAIMAGE_TARGET) \    $(INSTALLED_CACHEIMAGE_TARGET) \    $(INSTALLED_FILES_FILE)


files :

# All the droid stuff, in directories.PHONY: filesfiles: prebuilt \        $(modules_to_install) \        $(modules_to_check) \        $(INSTALLED_ANDROID_INFO_TXT_TARGET)

可以看到 依赖到了 上面分析到的 modules_to_install




更多相关文章

  1. 自动化测试 Appium之Python运行环境搭建 Part2
  2. 【ERROR】java java.lang.NoClassDefFoundError 的解决办法(全)
  3. Android工程中配置OpenCV
  4. android studio 真机调试连接时候好好的,运行安装就掉线 Session
  5. Android(安卓)Studio 1.0 安装遇到问题总结
  6. Android(安卓)Mouse实现过程笔记
  7. 与android的初次会面
  8. Android升级到2.3之后遇到的问题
  9. windows 7配置android开发环境

随机推荐

  1. ActivityManager.java
  2. android 文件的压缩和解压
  3. Android(安卓)shape自定义形状,设置渐变色
  4. Android表单获取值的三种方式
  5. Android_绘制圆形图片
  6. android 程序间跳转
  7. android 百度地图定位代码参考
  8. android C/C++ source files 全局宏定义
  9. Android(安卓)滑动渐变 扩展效果 免费专
  10. Android(安卓)API Level 与 Platform Ver