嗨,我是哈利迪~好久不见,最近大促比较忙,人也变懒了没啥时间写文章肝源码…本文做个小记,记录一个多aar下修改常量引起的问题,希望能给大家避避坑~
本文约0.9k字,阅读大约3分钟。
App结构大致如下,各工程以aar形式进行依赖,壳工程以打平的形式依赖所有业务工程和基础工程的aar,避开依赖传递的问题,还可以加快开发过程的构建速度,
因业务需要,哈迪把基础工程1
的1.0版本的一个常量TYPE_RECOMMEND_TAB
从106改成了306,
public class DATA_TYPE {
//public static final int TYPE_RECOMMEND_TAB = 106;
public static final int TYPE_RECOMMEND_TAB = 306;
}
然后推代码,打出一个新的aar,版本为1.1,壳工程使用1.1版本,运行后debug如下,
在debug一个业务工程1
的类SearchResultListAdapter
时,发生了神奇的一幕,alt键点击TYPE_RECOMMEND_TAB
可见他的值是新的306,然而把他赋值给type后,type的值居然是106,这是什么鬼!
马上联想到,是不是编译期常量自动替换的问题呢,在壳工程搜一下SearchResultListAdapter.class
(注意是class文件),
果然,前面debug看到的只是表象,实际上我们就是给type赋值了106,那么问题来了,这个106是哪里来的,我明明已经改掉了啊?
其实问题并不难找,前边提到了壳工程会以打平的形式依赖业务工程和基础工程的aar,如下,
当我们修改了基础工程1
的常量后,进行aar升级,壳工程更新依赖版本,从1.0变成1.1,
这时在壳工程不管搜DATA_TYPE.java
还是DATA_TYPE.class
,毋庸置疑常量TYPE_RECOMMEND_TAB
的值都是新的306,那问题出在哪呢?出在依赖了基础工程1
的业务工程1
,即306只对壳工程可见,对于业务工程1
来说,TYPE_RECOMMEND_TAB
仍然是106,我去怎么越说越绕…上图!
壳工程把基础工程1
升级到1.1,看见了306;但是在业务工程1
里,他依赖的还是基础工程1
的旧的1.0版本,所以对他来说,他看到的TYPE_RECOMMEND_TAB
仍然是106,因此,他的类SearchResultListAdapter
被编译成class后,由于编译期常量自动替换的设计,class文件里就会写死106,
然后,他向壳工程提供的class文件SearchResultListAdapter.class
就是106,
这样子上线,估计又要P1故障警告⚠️了!到此我们可以先得出结论,
谨慎修改常量值,一旦修改了一个常量,依赖了当前aar的所有项目,都要把当前aar升到最新版本,确保向壳工程提供的class文件是正确的。
哈迪在壳工程看了下,依赖了基础工程1
并且用到了常量TYPE_RECOMMEND_TAB
的上层工程,还有四五个,涉及了六七个类,这要是忘了改,就真的是大型翻车现场了…
sorry,哈迪也还没想到很好的工程化的方式去避免,只能先小记一下加深印象,恳请大佬们一起出谋划策!
ps:最近入秋了,大伙注意温差!身边好多同事感冒了?
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有