转载 :Android——编译安装Module的控制因素

来源:互联网 发布:淘宝tab是什么意思 编辑:程序博客网 时间:2024/05/16 15:33

转:http://blog.csdn.net/jscese/article/details/39209341

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

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

一.LOCAL_MODULE_TAGS:

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

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. LOCAL_MODULE_TAGS := $(sort $(LOCAL_MODULE_TAGS))  
  2. ifeq (,$(LOCAL_MODULE_TAGS))  
  3.   LOCAL_MODULE_TAGS :optional  
  4. endif  

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


LOCAL_MODULE_TAGS 在 android 4.2 能取的值有:

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. # Only the tags mentioned in this test are expected to be set by module  
  2. # makefiles. Anything else is either a typo or a source of unexpected  
  3. # behaviors.  
  4. ifneq ($(filter-out debug eng tests optional samples shell_ash shell_mksh,$(LOCAL_MODULE_TAGS)),)  
  5. $(warning unusual tags $(LOCAL_MODULE_TAGS) on $(LOCAL_MODULE) at $(LOCAL_PATH))  
  6. endif  

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


其中TARGET_BUILD_VARIANT 还是对应:


eng  : 

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

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. ifeq ($(TARGET_BUILD_VARIANT),eng)  
  2. 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:

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. ifeq ($(user_variant),userdebug)  
  2.   # Pick up some extra useful tools  
  3.   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 中,而且都是 类似这样的:

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. # jscese add libusb and compat lib ,usb-modeswitch execute binary for 3G   
  2. PRODUCT_PACKAGES += \  
  3.     rild \  
  4.     libusb \  
  5.     libusb-compat \  
  6.     usb_modeswitch   
  7. #end  

都是 += 累加操作!

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

简单记录下PRODUCT_PACKAGES 的作用过程

首先在main.mk中的

product_MODULES 以及 product_FILES

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. # The base list of modules to build for this product is specified  
  2. # by the appropriate product definition file, which was included  
  3. # by product_config.make.  
  4. product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)  
  5. # Filter out the overridden packages before doing expansion  
  6. product_MODULES := $(filter-out $(foreach p, $(product_MODULES), \  
  7.     $(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))  
  8. $(call expand-required-modules,product_MODULES,$(product_MODULES))  
  9. product_FILES := $(call module-installed-files, $(product_MODULES))  


modules_to_install

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. modules_to_install := $(sort \  
  2.     $(ALL_DEFAULT_INSTALLED_MODULES) \  
  3.     $(product_FILES) \  
  4.     $(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \  
  5.     $(call get-tagged-modules, shell_$(TARGET_SHELL)) \  
  6.     $(CUSTOM_MODULES) \  
  7.   )  

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

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


ALL_DEFAULT_INSTALLED_MODULES

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. # build/core/Makefile contains extra stuff that we don't want to pollute this  
  2. # top-level makefile with.  It expects that ALL_DEFAULT_INSTALLED_MODULES  
  3. # contains everything that's built during the current make, but it also further  
  4. # extends ALL_DEFAULT_INSTALLED_MODULES.  
  5. ALL_DEFAULT_INSTALLED_MODULES := $(modules_to_install)  
  6. include $(BUILD_SYSTEM)/Makefile  
  7. modules_to_install := $(sort $(ALL_DEFAULT_INSTALLED_MODULES))  
  8. ALL_DEFAULT_INSTALLED_MODULES :=  

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


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

droid:

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. # Building a full system-- the default is to build droidcore  
  2. droid: droidcore dist_files  
  3. ...  
  4. .PHONY: droid  


droidcore :

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. # Build files and then package it into the rom formats  
  2. .PHONY: droidcore  
  3. droidcore: files \  
  4.     systemimage \  
  5.     $(INSTALLED_BOOTIMAGE_TARGET) \  
  6.     $(INSTALLED_RECOVERYIMAGE_TARGET) \  
  7.     $(INSTALLED_USERDATAIMAGE_TARGET) \  
  8.     $(INSTALLED_CACHEIMAGE_TARGET) \  
  9.     $(INSTALLED_FILES_FILE)  


files :

[html] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. # All the droid stuff, in directories  
  2. .PHONY: files  
  3. files: prebuilt \  
  4.         $(modules_to_install) \  
  5.         $(modules_to_check) \  
  6.         $(INSTALLED_ANDROID_INFO_TXT_TARGET)  

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

0 0
原创粉丝点击