赞
踩
1.前言
我们在源码中添加新的模块的时候,并不是说你简单编写好模块的Android.mk之后就完事儿了,你在全编译的时候,输入make命令之后,等编译之后你会发现你新加的模块并没有加入到源码的自动编译之中,这是为什么呢?后面详细说明。
2.原因
这是因为你没有告诉系统你的模块需要参加编译,就像你不告诉别人我喜欢你,她永远也不会知道一样,一定要主动告诉她。
好的,那通过如何告诉“她”呢?那就需要了解Android源码的编译规则,我在上篇博客中有简单提到,这边就相当于对它的一个补充吧。
3.方法
方法大体有两种,一种是在android源码的原生的mk文件PRODUCT_PACKAGES宏中添加你的模块,还有一种是在你的Android.mk文件中加入一个ALL_DEFAULT_INSTALLED_MODULES宏变量。
对于方法一,android系统默认的PRODUCT_PACKAGES的变量配置mk文件一般存在于build/target/product下,此外和自己hardware平台相关的模块需求一般是定义到device目录下的product.mk或者device.mk文件中,定位到PRODUCT_PACKAGES这个变量,往后面加就行了。
对于方法二,我们可以在自定义的mk文件中添加这一行:
ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE)
4.原理
对于第一种方式原理不提了,第二种的话需要提一下
我们到源码路径的 /build/core/main.mk
找到下面的target:
.PHONY: files
files: prebuilt \
$(modules_to_install) \
$(INSTALLED_ANDROID_INFO_TXT_TARGET)
这个变量$(modules_to_install),从名字上可以看到这个是会被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) \
)
4.注意
注意m/mm/mmm的区别,根据build源码看规则差异。
好了后面再写吧,没时间了,有兴趣的童鞋可以自己研究一下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。