现在的位置: 首页 > 移动开发 > 正文

Android makefile中的LOCAL_JAR_EXCLUDE_FILES分析

2019年07月29日 移动开发 ⁄ 共 1182字 ⁄ 字号 评论关闭

在开发Android程序的时候,或者修改Android ROM的时候,总会遇到某些情况你需要把某些文件跟其他的文件一起编译,但是却不希望打到同一个包中的需求。

对于刚接触到Android makefile的人来说,这个需求太痛苦,太难满足了。其实不然,在Android中提供了一个LOCAL_JAR_EXCLUDE_FILES的变量,允许大家设置一些文件参与编译,但不参与打包。

但是,要使用LOCAL_JAR_EXCLUDE_FILES也会遇到很多问题。

在文件build/core/java.mk中,我们可以看到这样的定义:

$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := $(LOCAL_JAR_EXCLUDE_FILES)

这里将LOCAL_JAR_EXCLUDE_FILES赋值给了PRIVATE_JAR_EXCLUDE_FILES,然后在build/core/definitions.mk中的打包之前有这样一句话:

$(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \
        -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \
        $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \
        | xargs rm -rf)

不难看到,如果定义了PRIVATE_JAR_EXCLUDE_FILES,就会执行命令

find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) | xargs rm -rf)

即在打包之前找到PRIVATE_JAR_EXCLUDE_FILES中定义的每个文件,删除之。

问题出现了:

1. 显然,如果有多个同名文件在不同的包中,所有的同名文件都会被删除。(这往往不是你需要的结果,小心最好不要有同名文件)
2. 请看这个文件没有处理后缀,所以在LOCAL_JAR_EXCLUDE_FILES中给出的文件必须是.class,而不是一般认为的.java
3. 不会处理内部类!!如果有内部类,需要在LOCAL_JAR_EXCLUDE_FILES中给出。(包括匿名内部类!!)

解决好了上述三个问题,LOCAL_JAR_EXCLUDE_FILES还是值得一用的。

当然,如果你比较了解makefile的原理和编写机制,也可以仿照这个变量再写一个满足你自己需求的变量。比如说,移除特定的包等。

抱歉!评论已关闭.