大型 Android 系统重构实战
黄俊彬
Thoughtworks 资深咨询师
2840 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
大型 Android 系统重构实战
15
15
1.0x
00:00/00:00
登录|注册

13 | 组件运行时兼容:让组件可以灵活插拔

你好,我是黄俊彬。
上节课我们一起完成了 Sharing 项目的路由与注入改造,目前各个组件在编译时的依赖已经完全解除了。
如果说将代码编译时期的耦合解开,是迈开组件化的第一步,那么完善组件运行时的兼容就是组件化落地的重要验收标准。只有完善组件的运行时兼容,才能真正做到组件的动态插拔。
当组件可以做到灵活的动态插拔,则可以为产品的版本组合带来更加灵活的选择,更加高效地满足不同地区及用户的需求。
今天我们将一起来学习兼容性的定义、3 类组件的兼容性要求以及通过 Sharing 项目来学习如何进行组件运行时的兼容性处理,让组件可以更灵活进行插拔。

运行时兼容

我们继续以 Sharing 项目为例,分析一下运行时的依赖具体指的是什么。
在 Sharing 项目中,我们不把文件组件打包到项目中,你可以参考后面这张截图。
由于前面我们已经将编译时期的耦合解开了,所以这里可以正常编译出安装包。但是当我们运行应用时,程序会出现闪退,具体的异常日志如下所示。
2022-09-15 09:45:30.940 12820-12820/com.jkb.junbin.sharing E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jkb.junbin.sharing, PID: 12820
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
at androidx.fragment.app.FragmentTransaction.doAddOp(FragmentTransaction.java:245)
at androidx.fragment.app.BackStackRecord.doAddOp(BackStackRecord.java:183)
at androidx.fragment.app.FragmentTransaction.add(FragmentTransaction.java:234)
at androidx.fragment.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:176)
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了组件运行时兼容性的重要性以及实现方法。通过Sharing项目的案例分析,阐述了运行时依赖的问题,并定义了组件的兼容性等级。针对业务组件、功能组件和技术组件,分析了它们的兼容性要求,并详细介绍了对基座组件、消息组件和日志组件的兼容性改造方法。文章以日志组件改造为例,展示了兼容性改造的实际操作,强调了保证向上兼容的重要性。最后,对组件的兼容性定义和处理方法进行了总结,并提出了思考题,引发读者对动态控制组件插拔机制的思考。整体而言,本文对于开发人员来说具有一定的参考价值,为组件化架构的代码改造提供了深入的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《大型 Android 系统重构实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • williamwue
    原文:对于功能及业务组件的兼容性通常要求为基本兼容(A)或者完全兼容(S)。 请问老师,这里的“业务组件”是不是应该是“技术组件”?

    作者回复: 这里是对的,通常功能及业务组件的兼容性要求为基本兼容(A)或者完全兼容(S)

    2023-04-14归属地:江苏
  • ikun
    请教老师几个问题: Q1:组件化是单工程方案好还是多工程方案好 Q2:对于组件化后的项目比如A、B、C、D,A是一个基础版,B、C、D在A的基础上做一些不同版本的定制化需求怎样处理对于后期的代码维护代价比较小

    作者回复: Hi,ikun。 Q1:对于单工程还是多工程还有一个重要的影响因素就是团队的规模,并没有那个就比那个好。我们在持续交付篇中会进一步介绍。 Q2:我理解最重要的是要保持组件间的API稳定及兼容性。

    2023-03-17归属地:北京
  • peter
    请教老师几个问题: Q1:ARouter实际支持priority吗? 文中“假设 Arouter 支持通过 priority 属性控制多个实现的优先级”,这里用了“假设”,实际情况是什么? Q2:使用Deprecated方法会有什么问题? 写过一些不太复杂的应用,代码中经常用一些标注为Deprecated的方法,能编译、能运行,感觉不到有什么问题。那么,如果是上线运营的产品,会有什么问题吗? Q3:怎么找到Deprecated方法的替代方法? 碰到Deprecated的方法时,也想用最新的方法,但有时候不知道怎么找其对应的新方法。 Q4:实例sharing项目,会讲屏幕适配吗?

    作者回复: Hi,peter。 Q1: 实际我试了是不支持。 Q2:通常不会。Deprecated注解告诉你标注方法要废弃,而且IDE也会有警告⚠️提示。此时建议及时使用新的方法。 Q3:你可以查看标记了Deprecated注解方法的注释,通常会有介绍如何使用新的替代方法。 Q4:目前没有涉及到,后续我们可以考虑,感谢反馈🤝。

    2023-03-10归属地:北京
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部