准备----
1. 新建项目不多说了,在项目中添加Module模块,我们可以选择“Phone & Tablet Module”,这样创建出来的模块可以直接单独运行。
2. 创建好自己的模块后,新加一个gradle.properties
,用于记录当前模块的运行模式(library或application)
gradle.properties
内容如下:
isRunAlone=false
3. 在模块中复制出一份AndroidManifest.xml
到manifest文件夹中(参考图一),并将main目录下的AndroidManifest.xml
修改成组件集成运行时需要的内容(参考图二):
图一
图二
4. 在新建模块的build.gradle中配置,根据gradle.properties
设置的isRunAlone=false
(名字随意)的值进行判断, isRunAlone.toBoolean()
字符串转boolean,true为单独运行,false是组件化运行,
if (isRunAlone.toBoolean()) {// isRunAlone.toBoolean()字符串转boolean,true为组件单独运行,false是组件化集成运行
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
compileSdkVersion 30
buildToolsVersion "29.0.3"
defaultConfig {
// 组件单独运行时需要的applicationId
if (isRunAlone.toBoolean()) {
applicationId "com.mm.testmodule"
}
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// 配置组件单独运行和组件一起集成运行时需要的AndroidManifest.xml
sourceSets {
main {
if (isRunAlone.toBoolean()) {
manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
// ARouter路由的配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
5. 在APP下的build.gradle中依赖刚刚新建的组件,这里需要注意一下,我们组件开发的目的就是为了解耦,如果用implementation project(path:':testmodule')
依赖的方式太直接,所以,我们要使用runtimeOnly project(path:':testmodule')
,再用ARouter路由去跳转页面!
到此,基本的组件化就成型了,我们可以根据gradle.properties
设置的isRunAlone=false
的值,组件化运行也好,组件单独运行也成!
坑点:
1、主APP模块和其他组件中的界面,布局XML和资源文件的命名一定要有规则,尽量不要使用相同的命名,否则会出现意想不到的画面
2、在组件间的页面转场需要在app的build中依赖各个组件,还是建议使用
runtimeOnly project(path:':testmodule')
,并且使用ARouter路由跳转,这样比较好的解耦了各个组件关联性。- implementation 不对外开放,只是本项目依赖.
- runtimeOnly 运行时才依赖
3、如果使用
ARouter
在组件间转场时发生“There’s no route matched” 这个错误时,我们不要慌,首先确保,每个组件和主APP下的build.gradle
中,都配置和依赖的ARouter
,其次再去找,是不是我们没有在app下的build中进行各组件的依赖导致的。
网友评论