在编译一个APK的时候,采用标准的BUCK三段式(res,library,apk)
1 | android_resource( |
在编译library时,res的任务会构建出一个R.JAVA出来,但奇怪的是此时编译出来的R.JAVA是以
1 | public static int |
来修饰的,没错,不是final.
这就有可能对我们需要编译的代码产生影响,诸如直接使用switch-case来进行ID判断时
1 | switch(id) |
会出现”error: constant expression required”,就是提示R.id.test不是常量,但switch-case中的要求case是常量.
本来私心想着看一下能不能通过正常的配置来满足我的要求,但寻思一番后并无结果,怒了,直接改源码.既然问题是出在生成R.java的过程中,必然是找生成R.java的部分,对于这种文件生成,必然是通过各种组合来生成的,只能选取部分的关键字进行xargs grep,运气不错,一下子就定位了buck中的一个文件 buck/src/com/facebook/buck/android/MergeAndroidResourcesStep.java
稍微看一下就能看到生成每一条记录的地方:
1 | // Write out the resource. |
这个uberRDotTxt是个Optional类型,来用包装一个Path对象的,首先这里判断这个Path对象有没有,有的话就添加final,没就不添加.
是的,我特么现在已经怒了,哪管那么多直接注释直接返回final,重新编译,一切都太平了.