Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >踩坑记 | 多aar下修改常量的一个小坑

踩坑记 | 多aar下修改常量的一个小坑

作者头像
Holiday
发布于 2020-09-22 02:03:32
发布于 2020-09-22 02:03:32
48700
代码可运行
举报
文章被收录于专栏:哈利迪ei哈利迪ei
运行总次数:0
代码可运行

嗨,我是哈利迪~好久不见,最近大促比较忙,人也变懒了没啥时间写文章肝源码…本文做个小记,记录一个多aar下修改常量引起的问题,希望能给大家避避坑~

本文约0.9k字,阅读大约3分钟。

问题简述

App结构大致如下,各工程以aar形式进行依赖,壳工程以打平的形式依赖所有业务工程和基础工程的aar,避开依赖传递的问题,还可以加快开发过程的构建速度,

因业务需要,哈迪把基础工程1的1.0版本的一个常量TYPE_RECOMMEND_TAB从106改成了306,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:最近入秋了,大伙注意温差!身边好多同事感冒了?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 哈利迪ei 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
记一次Gradle依赖相关问题
‍最近对之前项目里面依赖的Flutter模块进行了一次升级。因为从1.x升级的时候3.0的flutter需要安卓原生适配compilesdkversion,所以我们APP使用的Flutter版本为2.8.1,现在app的构建版本升上来了,于是对之前的Flutter进行了升级。
烧麦程
2022/12/05
1.3K0
Android模块化开发
随着项目逐渐扩展,业务功能越来越多,代码量越来越多,开发人员数量也越来越多。此过程中,你是否有过以下烦恼?
kymjs张涛
2023/03/14
2.2K0
Android组件化方案及组件消息总线modular-event实战
组件化作为Android客户端技术的一个重要分支,近年来一直是业界积极探索和实践的方向。美团内部各个Android开发团队也在尝试和实践不同的组件化方案,并且在组件化通信框架上也有很多高质量的产出。最近,我们团队对美团零售收银和美团轻收银两款Android App进行了组件化改造。本文主要介绍我们的组件化方案,希望对从事Android组件化开发的同学能有所启发。
美团技术团队
2018/12/24
8830
携程Android App插件化和动态加载实践
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验。本文将详细介绍Android平台插件式开发和动态加载技术的原理和实现细节,回顾携程Android App的架构演化过程,期望我们的经验能帮助到更多的Android工程师。 需求驱动 2014年,随着业务发展需要和携程无线部门的拆分,各业务产品模块归属到各业务BU,原有携程无线App开发团队被分为基础框架、酒店、机票、火车票等多个开发团队,从此携程App的开发和发布进入了一个全
携程技术
2018/02/06
1.2K0
得物布局构建耗时优化方案实践
当谈到移动应用程序的体验时,页面启动速度是其中至关重要的一点,更快的页面展示速度确保应用程序可以迅速加载并响应用户的操作, 从而提高用户使用 App 时的满意度。在页面启动的整个流程中,随着 UI 复杂度的上升,布局的 Inflate 耗时占据了相当一部分关键的比例,本文分享得物自身在页面布局构建耗时优化方案上的探索历程。
得物技术
2024/03/13
2950
得物布局构建耗时优化方案实践
KMM 求生日记二:Kotlin/Native 被踩中的坑
最近几周团队的 KMM 进度推进了不少,已经陆续把几个小业务需求迁移到了 KMM。
bennyhuo
2021/03/18
2.7K0
修改AAR和Jar中class文件
最近帮助同事解决了一个比较棘手的问题,一路采坑的过程比较有意思。在此记录下来。(PS:主要原因是项目比较大,我们只有整个Android项目部分业务侧代码的开发权限。所以解决问题的一些解决问题的常规手段无法使用。)
静默加载
2021/01/26
1.7K0
修改AAR和Jar中class文件
Android:发布aar包到maven仓库以及 maven插件 和 maven-publish 插件的区别
在日常开发中,不可避免的需要把自己的 library 发布到 maven 仓库中,这样使用起来也更加方便。
分你一些日落
2021/12/06
4.5K0
Android:发布aar包到maven仓库以及 maven插件 和 maven-publish 插件的区别
aar和源码切换插件Plus | 一个没采纳的废案
我们的工程结构呢是monorepo, 但是因为之前需要治理基础库的依赖问题,所以有一部分公共的sdk就被从momorepo中移出去了。
逮虾户
2022/03/06
9260
(一)组件治理之多仓组件化编译的一些问题
首先介绍下我们的项目结构,我们是组件化开发,不同的业务组件存放在各自的仓库之中,组件通过提供 api 的方式供其他业务调用,大致效果图如下:
codelang
2023/11/20
3520
(一)组件治理之多仓组件化编译的一些问题
有赞 Android 编译进阶之路——全量编译提效方案
接下来的章节,我们从底层剖析 EnjoyDependence 的实现原理,主要包括:aar 发布、依赖管理、自动发布等内容。
有赞coder
2020/08/24
1.5K0
有赞 Android 编译进阶之路——全量编译提效方案
踩坑记 | Flutter升级影响了NestedScrollView?
嗨,我是哈利迪~最近有个bug排查了好几天,就是有个老页面因业务复杂度,使用了NestedScrollView+tab+多Fragment的结构(各Fragment里有RecyclerView,即存在嵌套滑动),在新的班车中,出现了偶现的滑不动问题。在业务相关组件里排查了很久都没思路,哈迪便开始了万能的组件排除法,即在几十个变更组件里用二分法分批排查(没错就是这么骚),最后定位到一个Flutter组件,只要把它回退就没问题了。。
Holiday
2020/08/07
9880
踩坑记 | Flutter升级影响了NestedScrollView?
踩坑记 | Flutter升级影响了NestedScrollView?
嗨,我是哈利迪~最近有个bug排查了好几天,就是有个老页面因业务复杂度,使用了NestedScrollView+tab+多Fragment的结构(各Fragment里有RecyclerView,即存在嵌套滑动),在新的班车中,出现了偶现的滑不动问题。在业务相关组件里排查了很久都没思路,哈迪便开始了万能的组件排除法,即在几十个变更组件里用二分法分批排查(没错就是这么骚),最后定位到一个Flutter组件,只要把它回退就没问题了。。
Holiday
2020/08/10
8320
从零到一搭建基础架构(8)-业务服务接入基础架构
本文为稀土掘金技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究!
柏炎
2022/11/16
3860
从零到一搭建基础架构(8)-业务服务接入基础架构
Android | 资源冲突覆盖的一些思考
啥是资源冲突覆盖,就是两个不同的文件,有着相同的文件名,在打包apk后引起的系列问题。本文将从情景、解决思路、延伸,三个方面展开。
Holiday
2020/08/07
2.6K0
Android | 资源冲突覆盖的一些思考
Android组件化方案及组件消息总线modular-event实战
组件化作为Android客户端技术的一个重要分支,近年来一直是业界积极探索和实践的方向。美团内部各个Android开发团队也在尝试和实践不同的组件化方案,并且在组件化通信框架上也有很多高质量的产出。最近,我们团队对美团零售收银和美团轻收银两款Android App进行了组件化改造。本文主要介绍我们的组件化方案,希望对从事Android组件化开发的同学能有所启发。
Android技术干货分享
2019/10/14
5620
Android组件化方案及组件消息总线modular-event实战
一文了解Android游戏SDK开发
SDK(Software Development Kit)是软件开发工具包的缩写,一般来说,SDK是用于给开发人员提供进行应用程序开发的工具的,这样程序员就可以快速的开发出应用软件,省去了编写硬件代码和基础代码框架的过程,我们常见的Android SDK就属于这一类。除了这种比较大的SDK,我们平时开发的library也属性SDK,只不过功能比较单一,适用的场合也比较简单,如短视频SDK、推送SDK,分享SDK等。 而我们所做的游戏SDK主要是用于第三方游戏开发接入我们的账号体系和支付体系,类似于友盟分享等聚合SDK。
xiangzhihong
2020/07/15
2.4K0
一文了解Android游戏SDK开发
解读 美团外卖Android Crash治理之路
Crash率是衡量一个App好坏的重要指标之一,如果你忽略了它的存在,它就会愈演愈烈,最后造成大量用户的流失,进而给公司带来无法估量的损失。本文讲述美团外卖Android客户端团队在将App的Crash率从千分之三做到万分之二过程中所做的大量实践工作,抛砖引玉,希望能够为其他团队提供一些经验和启发。
做个快乐的码农
2021/11/27
1.1K0
解读 美团外卖Android Crash治理之路
Android Dex分包最全总结:含Facebook解决方案
当程序越来越大之后,出现了一个 dex 包装不下的情况,通过 MultiDex 的方法解决了这个问题,但是在低端机器上又出现了 INSTALL_FAILED_DEXOPT 的情况,那再解决这个问题吧。等解决完这个问题之后,发现需要填的坑越来越多了,文章讲的是我在分包处理中填的坑,比如 65536、LinearAlloc、NoClassDefFoundError等等。
Android技术干货分享
2019/05/14
3K0
Android Dex分包最全总结:含Facebook解决方案
Android 大型工程 App Bundle 模块化实践
导言 Android App Bundle 是 Android 新推出的一种官方发布格式,可让您以更高效的方式开发和发布应用。企业微信基于 App Bundle 采用低入侵、业务代码基本零重构的技术方案,实现了全业务模块采用动态模块(dynamic feature)开发。最后展示并行编译方案,进一步加速持续集成。 一、项目背景 Android App Bundle 是 Android 新推出的一种官方发布格式,可让您以更高效的方式开发和发布应用。和国内开发者已经熟知的 Kotlin 开发语言、Androi
微信终端开发团队
2021/05/26
5.1K0
相关推荐
记一次Gradle依赖相关问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验