组件化
- 组件化的运行时期是在apk的编译时期 (重点)
- 组件化需要解决的问题?
- 组件化gradle配置
一 组件化需要解决的问题
1. 资源冲突问题
比如两个Module中都有名字叫做 name 的string资源。打包时就会产生冲突
解决办法 :在每个模块的build.gradle 文件的android Task中 声明resourcePrefix 这个属性
android {
resourcePrefix "user_"
}
这个的作用是 约束 你的res资源文件的前缀必须为 user_
2. 组件间通信问题 (这里采用阿里的Arouter 都可以实现)
这里的通信指的是 组件间跳转 和 组件间获取class对象 的问题
3.gradle 配置
二 组件化gradle配置
前提准备 - - 工程目录
壳工程 | app |
module | videocomponet |
1. 新建Project下config.gradle 这个文件相当于全局的配置文件 里面就是统一的属性啥的
ext {
isModule = true;//配置是否是application 还是 library 模式
compileSdkVersion = 29
buildToolsVersion = "29.0.3"
minSdkVersion = 15
targetSdkVersion = 29
versionCode = 1
versionName = "1.0"
dependencies = [
"appcompat" : 'androidx.appcompat:appcompat:1.0.2',
"constraintlayout" : 'androidx.constraintlayout:constraintlayout:1.1.3',
"okhttp" : 'com.squareup.okhttp3:okhttp:3.14.2'
]
}
2. 配置app下的build.gradle文件
1. def cof = rootProject.ext 引入config.gradle 文件 ,相当于c++的include
2. 判断是否是module模式 如果是module模式的话 依赖videocomponet这个模块
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation cof.dependencies.appcompat
implementation cof.dependencies.constraintlayout
implementation cof.dependencies.okhttp
if (isModule) {
implementation project(':videocomponet')
}
annotationProcessor project(':ZHRouter_compiler')
implementation project(':ZHRouter_annotation')
implementation project(':XHRouter_core')
}
3.配置videocomponet这个模块的build.gradle 文件
def cof = rootProject.ext // 引入config.gradle 文件 ,相当于c++的include
// 判断是否是module 是的话 library 不是的话作为一个单独的apk工程
if (isModule) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
4.配置videocomponet的 java文件 和 Manifast文件
android 结构下
sourceSets {
main {
if (isModule) {
manifest.srcFile 'src/main/AndroidManifest.xml'
} else {
java.srcDirs('src/main/java','src/main/module')
manifest.srcFile 'src/main/module/AndroidManifest.xml'
}
}
}
如果是module的话就是正常的java路径 和 Manifast路径,如果是作为单独的一个apk的话 就要重新指定一个AndroidManifest文件。
5.module的目录结构