组件化:在编译期分模块
原理:正常一个App中可以有多个module,但是一般只会有一个module是设置为application的,其他均设置为library,组件化开发就是要每个module都可以运行起来,因此在开发期间每个module均设置为application,发布时再进行合并。
优点:1.多人协作开发过程中,上拉提交代码,很容易导致代码冲突, 组件化可以有效避免代码冲突
2.降低代码模块的耦合度,使代码架构更加清晰,层级更加鲜明
3.降低了编译速度
4.方便单元测试
步骤1.在gradle.properties中设置变量, 如IsBuildMudle=false
2.在子模块的build.gradle中:
println IsBuildMudle.toBoolean()
if (IsBuildMudle.toBoolean()){
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
3.在主模块的build.gradle中设置:
println IsBuildMudle.toBoolean()
if (!IsBuildMudle.toBoolean()) {
compile project(':ModuleA')
compile project(':ModuleB')
} else {
compile project(':Library')
}
4.这样每个module就可以独立安装使用了,注意在修改IsBuildMudle的值时,一定要sync gradle。
当module单独运行和作为module运行时,其activity在manifest中设置也会不同,这里可以根据IsBuildMudle设置不同的manifest:
sourceSets {
main {
if (IsBuildMudle.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/release/AndroidManifest.xml'
}
}
}
在每个子模块的main下创建debug包和release包与java/res平级,
在分别在不同的目录下创建manifest文件,一定要保持debug和release下manifest内容一致
资源冲突问题
当分别开发模块时,容易出资源重复命名的问题,可以在build.gradle中设置resourcePrefix"module1_"
通过给模块设置不同的资源前缀,可以避免重复命名。
model之间的跳转,传值
ActivityRouter, 每个model依赖
compile 'com.github.mzule.activityrouter:activityrouter:1.2.2'
annotationProcessor 'com.github.mzule.activityrouter:compiler:1.1.7'
在需要跳转到的AndroidManifest里设置
<activity android:name=".BActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="modularization" /> </intent-filter> </activity>
A跳转B, 在B中创建空java类注解
@Router("b") public class BActivity extends AppCompatActivity {}
A中:
Routers.open(MainActivity.this, Uri.parse("modularization://b"));
Activity间参数传递等,详见ActivityRouter
组件化学习过程中遇到的问题:
1.把子模块的apply plugin 从library改为application之后,要对子模块里的manifest进行相应内容的添加,比如theme,初始化activity等
2.Model: App中的Activity跳转到ModelB中的BActivity,跳转成功,但是页面BActivity内容不显示
原因:没有在主模块的build.gradle里 设置resourcePrefix"module1_"导致资源冲突(因为:三个模块的xml我起名为act_main.xml)