Android makefile中的LOCAL_JAR_EXCLUDE_FILES分析

在开发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的原理和编写机制,也可以仿照这个变量再写一个满足你自己需求的变量。比如说,移除特定的包等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值