滁州市南谯区建设局网站,直播电商平台开发,品牌建设网站,网站设计的设计方案组件化项目#xff0c;通过gradle脚本#xff0c;实现module在编译期隔离#xff0c;运行期按需加载#xff0c;实现组件间解耦#xff0c;高效单独调试。
先来一张效果图 组件化初衷
APP版本不断的迭代#xff0c;新功能的不断增加#xff0c;业务也会变的越来越复杂…组件化项目通过gradle脚本实现module在编译期隔离运行期按需加载实现组件间解耦高效单独调试。
先来一张效果图 组件化初衷
APP版本不断的迭代新功能的不断增加业务也会变的越来越复杂维护成本高。业务耦合度高代码越来越臃肿团队内部多人协作开发困难。Android项目在编译代码的时候电脑会非常卡又因为单一工程下代码耦合严重每修改一处代码后都要重新编译打包测试导致非常耗时。方便单元测试改动单独一个业务模块不需要着重于关注其他模块被影响。
什么是组件化
组件化就是将一个app分成多个Module如下图每个Module都是一个组件(也可以是一个基础库供组件依赖)开发的过程中我们可以单独调试部分组件组件间不需要互相依赖但可以相互调用最终发布的时候所有组件以lib的形式被主app工程依赖并打包成一个apk。 组件化优势
组件化就是将通用模块独立出来统一管理以提高复用将页面拆分为粒度更小的组件组件内部除了包含UI实现还包含数据层和逻辑层。每个工程都可以独立编译、加快编译速度独立打包。每个工程内部的修改不会影响其他工程。业务库工程可以快速拆分出来集成到其他App中。迭代频繁的业务模块采用组件方式业务线研发可以互不干扰、提升协作效率并控制产品质量加强稳定性。并行开发团队成员只关注自己的开发的小模块降低耦合性后期维护方便等。
指导思想
组件拆分将一个project划分成业务组件、基础组件、路由组件。其中业务组件是相互隔离的可以单独调试基础组件提供业务组件所公用的功能路由组件为业务组件之间通信提供支持。组件隔离业务组件之间的隔离可以单独调试。核心法则编译期隔离运行期按需依赖。
依赖关系 组件化需要考虑的问题
模式切换如何使得APP在单独调试跟整体调试自由切换资源冲突当我们创建了多个Module的时候如何解决相同资源文件名合并的冲突依赖关系多个Module之间如何引用一些共同的library以及工具类组件通信组件化之后Module之间是相互隔离的如何进行UI跳转以及方法调用入口参数我们知道组件之间是有联系的所以在单独调试的时候如何拿到其它的Module传递过来的参数
组件化后项目结构如下图 理论说了那么多下面开始撸代码
实现步骤
1、全局设置Gradle每一个业务Module需要的版本都定义在这里方便后期维护多个Module版本号
ext {// Sdk and toolsminSdkVersion 16targetSdkVersion 26compileSdkVersion 26buildToolsVersion 26.0.2supportLibraryVersion 26.1.0// App dependenciesaRouter 1.2.2leakcanaryVersion 1.3glideVersion 3.7.0
}####每个业务Module编译依赖版本compileSdkVersion rootProject.ext.compileSdkVersionbuildToolsVersion rootProject.ext.buildToolsVersionminSdkVersion rootProject.ext.minSdkVersiontargetSdkVersion rootProject.ext.targetSdkVersion2、模式切换
组件化后的每一个业务的module都可以是一个单独的APPisModuleRunfalse release 包的时候各个业务module作为lib依赖这里完全由一个变量控制在根项目 gradle.properties里面的 isModuleRuntrue。
isModuleRun状态不同加载application和AndroidManifest都不一样以此来区分是独立的APK还是lib 实现方式如下 在build.grade里面配置
if (isModuleRun.toBoolean()) {apply plugin: com.android.application
} else {apply plugin: com.android.library
}##单Module运行需要配置
sourceSets {main {if (isModuleRun.toBoolean()) {manifest.srcFile src/main/debug/AndroidManifest.xml} else {manifest.srcFile src/main/AndroidManifest.xmljava {//全部Module一起编译的时候剔除debug目录exclude **/debug/**}}}}3、资源冲突
业务Module和BaseModule资源文件名称重复会产生冲突解决方案在 每个 module 都有 app_name为了不让资源名重名在每个组件的 build.gradle 中增加 resourcePrefix “xxx_强行检查资源名称前缀。 固定每个组件的资源前缀。但是 resourcePrefix 这个值只能限定 xml 里面的资源并不能限定图片资源。 个人认为约定大于配置团队内协定好规范可以避免冲突。
4、组件通讯 组件通讯框架在github上有star最多的有ARouter和ActivityArouter前者是个人项目后者是阿里巴巴开源权衡之下选择阿里的ARouter 各业务Module之前不需要任何依赖可以通过路由跳转完美解决业务之间耦合 使用方式如下。 if (BuildConfig.DEBUG) { // 这两行必须写在init之前否则这些配置在init过程中将无效ARouter.openLog(); // 打印日志ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行必须开启调试模式线上版本需要关闭,否则有安全风险)}
ARouter.init(this); // 尽可能早推荐在Application中初始化compile com.alibaba:arouter-api:$rootProject.aRouter
每个业务Module都需要添加注解
annotationProcessor com.alibaba:arouter-compiler:1.1.3跳转方法 在目标Activity上添加path
Route(path ARouterManager.BModuleActivity)
public class BModuleActivity extends BaseActivity {Autowiredpublic String name;Autowired(name age)int age;TextView txt;Overrideprotected int getLayoutId() {return R.layout.b_module_layout;}Overrideprotected void initView() {txt findViewById(R.id.txt);//String name getIntent().getStringExtra(name); 也可以这样接受参数ARouter.getInstance().inject(this);txt.setText(name: name ,age: age);#开始跳转btn2.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {// 2\. 跳转并携带参数ARouter.getInstance().build(ARouterManager.BModuleActivity).withString(name, 888).withInt(age, 11).navigation();}});/*** 路由管理类*/public final class ARouterManager {public static final String AFragment /amodule/AFragment;public static final String BFragment /bmodule/BFragment;public static final String CFragment /cmodule/CFragment;public static final String AModuleActivity /amodule/AAModuleActivity;public static final String BModuleActivity /bmodule/BModuleActivity;public static final String CModuleActivity /cmodule/CModuleActivity;}上述只使用了ARouter的简单用法更多进阶用法请参考ARouter文档 ARouter
5、Application
当组件单独运行的时候每个Module自成一个APK那么就意味着会有多个Application很显然我们不愿意重复写这么多代码所以我们只需要定义一个BaseApplication即可其它的Application直接继承此BaseApplication就OK了BaseApplication里面还可定义公用的参数。 更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》 1.Android车载应用开发系统学习指南附项目实战
2.Android Framework学习指南助力成为系统级开发高手
3.2023最新Android中高级面试题汇总解析告别零offer
4.企业级Android音视频开发学习路线项目实战附源码
5.Android Jetpack从入门到精通构建高质量UI界面
6.Flutter技术解析与实战跨平台首要之选
7.Kotlin从入门到实战全方面提升架构基础
8.高级Android插件化与组件化含实战教程和源码
9.Android 性能优化实战360°全方面性能调优
10.Android零基础入门到精通高手进阶之路
敲代码不易关注一下吧。ღ( ´ᴗ )