史上最全的Android面试题集锦(五)


5、热点技术

5.1、组件化

(1)概念:

组件化:是将一个APP分成多个module,每个module都是一个组件,也可以是一个基础库供组件依赖,开发中可以单独调试部分组件,组件中不需要相互依赖但是可以相互调用,最终发布的时候所有组件以lib的形式被主APP工程依赖打包成一个apk。

(2)由来:

APP版本迭代,新功能不断增加,业务变得复杂,维护成本高

业务耦合度高,代码臃肿,团队内部多人协作开发困难

Android编译代码卡顿,单一工程下代码耦合严重,修改一处需要重新编译打包,耗时耗力。

方便单元测试,单独改一个业务模块,不需要着重关注其他模块。

(3)优势:

组件化将通用模块独立出来,统一管理,以提高复用,将页面拆分为粒度更小的组件,组件内部出了包含UI实现,还可以包含数据层和逻辑层

每个组件度可以独立编译、加快编译速度、独立打包。

每个工程内部的修改,不会影响其他工程。

业务库工程可以快速拆分出来,集成到其他App中。

迭代频繁的业务模块采用组件方式,业务线研发可以互不干扰、提升协作效率,并控制产品质量,加强稳定性。

并行开发,团队成员只关注自己的开发的小模块,降低耦合性,后期维护方便等。

(4)考虑问题:

模式切换:如何使得APP在单独调试跟整体调试自由切换

组件化后的每一个业务的module都可以是一个单独的APP(isModuleRun=false), release 包的时候各个业务module作为lib依赖,这里完全由一个变量控制,在根项目 gradle.properties里面isModuleRun=true。isModuleRun状态不同,加载application和AndroidManifest都不一样,以此来区分是独立的APK还是lib。

在build.grade里面配置:


资源冲突

当我们创建了多个Module的时候,如何解决相同资源文件名合并的冲突,业务Module和BaseModule资源文件名称重复会产生冲突,解决方案在于:

每个 module 都有 app_name,为了不让资源名重名,在每个组件的 build.gradle 中增加 resourcePrefix “xxx_强行检查资源名称前缀。固定每个组件的资源前缀。但是 resourcePrefix 这个值只能限定 xml 里面的资源,并不能限定图片资源。

依赖关系

多个Module之间如何引用一些共同的library以及工具类

组件通信

组件化之后,Module之间是相互隔离的,如何进行UI跳转以及方法调用,具体可以使用阿里巴巴ARouter或者美团的WMRouter等路由框架。

各业务Module之前不需要任何依赖可以通过路由跳转,完美解决业务之间耦合。

入口参数

我们知道组件之间是有联系的,所以在单独调试的时候如何拿到其它的Module传递过来的参数

Application

当组件单独运行的时候,每个Module自成一个APK,那么就意味着会有多个Application,很显然我们不愿意重复写这么多代码,所以我们只需要定义一个BaseApplication即可,其它的Application直接继承此BaseApplication就OK了,BaseApplication里面还可定义公用的参数。

关于如何进行组件化,可以参考:安居客Android项目架构演进

5.2、插件化

(1)概述

提到插件化,就不得不提起方法数超过65535的问题,我们可以通过Dex分包来解决,同时也可以通过使用插件化开发来解决。插件化的概念就是由宿主APP去加载以及运行插件APP。

(2优点)

在一个大的项目里面,为了明确的分工,往往不同的团队负责不同的插件APP,这样分工更加明确。各个模块封装成不同的插件APK,不同模块可以单独编译,提高了开发效率。

解决了上述的方法数超过限制的问题。可以通过上线新的插件来解决线上的BUG,达到“热修复”的效果。

减小了宿主APK的体积。

(3缺点)

插件化开发的APP不能在Google Play上线,也就是没有海外市场。

原文链接:https://blog.csdn.net/xiangzhihong8/java/article/details/96280254

点击下方链接免费获取Android进阶资料:

https://shimo.im/docs/tXXKHgdjPYj6WT8d/

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容