所谓组件化 可以理解我Android项目是一个机器人,那么胳膊,腿,头就是组件。项目App加是一个个组件组成的。当然给个组件也是具有生命力的也是可以单独运行的。
这里我们直接进去主题。
Demo 下载:https://download.csdn.net/download/gjy211/10594060
实践之前你需要了解的基本知识:
- 组件化项目,通过gradle脚本,实现module在编译期隔离,运行期按需加载,实现组件间解耦,高效单独调试。
为什么要用组件化以及使用组件化的优势:
- APP版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,维护成本高。
- 业务耦合度高,代码越来越臃肿,团队内部多人协作开发困难。
- Android项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,导致非常耗时。
- 方便单元测试,改动单独一个业务模块,不需要着重于关注其他模块被影响。
这里我用了一个Demo的截图。
那我们实现组价化之前需要搞清楚自己App中的一些业务逻辑和框架,然后区分相应的模块,一些基本的公共类和基础库,一些共用的资源文件。等
那么搞清楚这个 我们就很容易上手了。
所谓的五个步骤:
- 全局设置Gradle ,每一个业务Module需要的版本都定义在这里方便后期维护多个Module版本
gradle.properties 中定义isModuleRun=fasle
- 模式切换
组件化后的每一个业务的module都可以是一个单独的APP
(isModuleRun=false)
, release 包的时候各个业务module作为lib依赖,这里完全由一个变量控制,在根项目gradle.properties
里面的isModuleRun=true
。isModuleRun状态不同,加载application和AndroidManifest都不一样,以此来区分是独立的APK还是lib,
实现方式如下 在build.grade
里面配置 -
新建一个baseres模块 添加一些XML布局文件和相应的string字符串。新建一个baselib存放一些共用的BaseApplication和共用的util类等。接着根据自己需要新建相应的模块。如果模块中应用到baseres模块 baselib模块中的资源或者是类,吸引依赖一下 eg:
implementation project(':basiclib') implementation project(':imagemodule')
- 组件通讯 不熟悉ARouter基本用法的可以看看我的这篇文章阿里巴巴ARouter基本使用方法
各业务Module之前不需要任何依赖可以通过路由跳转,完美解决业务之间耦合
使用方式如下。
compile "com.alibaba:arouter-api:$rootProject.aRouter"
每个业务Module都需要添加注解
annotationProcessor 'com.alibaba:arouter-compiler:1.1.3'
跳转方法
在目标Activity上添加path
上述只使用了ARouter的简单用法,更多进阶用法请参考ARouter文档,
ARouter
5.Application
当组件单独运行的时候,每个Module自成一个APK,那么就意味着会有多个Application,很显然我们不愿意重复写这么多代码,所以我们只需要定义一个BaseApplication即可,其它的Application直接继承此BaseApplication就OK了,BaseApplication里面还可定义公用的参数。
下面说一下我在组件化的时候遇到的问题:
一:
描述:
解决方法:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
.......
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false //开启代码混淆
zipAlignEnabled false
shrinkResources false // 移除无用资源
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
很可能是build.gradle中这部分代码没有配置的原因。
二:
描述:Error:Execution failed for task ':homemodule:compileReleaseJavaWithJavac'.
> java.lang.RuntimeException: ARouter::Compiler >>> No module name, for more information, look at gradle log.
解决方法:
检查下子module里面有没配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
三:
描述:Demo mFragmentTab01 = (Fragment) ARouter.getInstance().build(ARouterManager.AFragment).navigation();这个地方 跨模块获取Frament却为null呢?
解决办法:
检出一下ARouterManag里定义的路径是不是有问题。