
组件化、模块化就是理清关系、解耦、组合的过程。
资源合并
先来回顾下,模块化架构的图。

组件化中,Network、Image等功能模块 与 BaseLib是一样的,都是Library Module,所以,都将会被编译成aar文件。
先学一个命令
./gradlew module_name:dependencies
这是gradle命令,可以查看module的依赖树。
你会发现preRelease、release、debug等各种Build variant。
给发范例
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//黄油刀
annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.butterknifeVersion"
//ARouter
annotationProcessor "com.alibaba:arouter-compiler:$rootProject.arouterCompilerVersion"
//Lombok
compileOnly 'org.projectlombok:lombok:1.18.8'
annotationProcessor 'org.projectlombok:lombok:1.18.8'
compile project(path: ':projectcore')
}
你会看到以release为例。
你会看到
releaseAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: release
+--- com.jakewharton:butterknife-compiler:8.4.0
| | +--- com.android.support:support-fragment:27.1.1
| | | +--- com.android.support:support-compat:27.1.1 (*)
| | | +--- com.android.support:support-core-ui:27.1.1
| | | | +--- com.android.support:support-annotations:27.1.1 -> 28.0.0
| | | | +--- com.android.support:support-compat:27.1.1 (*)
| | | | \--- com.android.support:support-core-utils:27.1.1 (*)
| | | +--- com.android.support:support-core-utils:27.1.1 (*)
| | | +--- com.android.support:support-annotations:27.1.1 -> 28.0.0
| | | +--- android.arch.lifecycle:livedata-core:1.1.0
| | | | +--- android.arch.lifecycle:common:1.1.0
| | | | +--- android.arch.core:common:1.1.0
| | | | \--- android.arch.core:runtime:1.1.0
| | | | \--- android.arch.core:common:1.1.0
| | | \--- android.arch.lifecycle:viewmodel:1.1.0
| ......
+--- com.alibaba:arouter-compiler:1.1.4
| ......
\--- org.projectlombok:lombok:1.18.8
这里我节选了一部分
releaseCompileClasspath - Resolved configuration for compilation for variant: release
+--- project :projectcore
| +--- project :basePlatform:core
| | +--- com.android.support:appcompat-v7:27.1.1
| | +--- com.android.support.constraint:constraint-layout:1.1.1
| | +--- com.github.chrisbanes.photoview:library:1.2.4
| | ......
| +--- project :basePlatform:net
| \--- project :otherLib:customview
\--- org.projectlombok:lombok:1.18.8
这便是module的引用依赖库列表。
在编码过程中,一旦你改动了build.gradle、settings.gradle。你总会看gradle sync同步的提示,这时就会再次生成目录树。
目录树产生后,便gradle就不会重复添加 库 到编译内。
你需要注意 * 号,这个依赖会被忽略,因为重复了。可以看上面,引入的第一段gradle dependencies依赖树。
资源冲突
这包括AndroidManifest冲突、包冲突(aar、lib库等)、资源名冲突
AndroidManifest冲突
这里包括几方面呢?
Actiivty
通过编译生成的apk,用AS进行查看。可以看到这样一段
<activity
android:theme="@ref/0x7f0b0186"
android:name="com.wangxueming.account.module.cash.WithDrawActivity"
android:screenOrientation="1" />
编译完成后,其实,activity的路径是被完整的补齐的。
Application
在多模块的情况下,我们一般是支持剔除几个模块,以加快编译速度的。所以,每个模块是可以有自己的Application的。
按照App Module、Library module来划分,规则如下
| App Module | Library Module | 结果 |
|---|---|---|
| 有定义 | 无定义 | 用App的Module |
| 无定义 | 有定义 | 用功能的Module |
| 无定义 | 多个定义 | 解决冲突后用功能的Module |
| 有定义 | 多个定义 | 解决冲突后用App的Module |
| 高优先级属性 | 低优先级属性 | 属性的合并结果 |
|---|---|---|
| 高优先级属性 | 低优先级属性 | 属性的合并结果 |
| 没有值 | 没有值 | 没有值(使用默认值) |
| 没有值 | 值 B | 值 B |
| 值 A | 没有值 值 A | |
| 值 A | 值 A | 值 A |
| 值 A | 值 B | 冲突错误 - 您必须添加合并规则标记 |
注意:
- 这里会有tools:replace来解决冲突
- App Module > Library Module (优先级)
更详细的请科学上网,参考这个合并多个清单文件
Permission
这块就参考 《组件化攻略-权限管理》
主题
Activity的主题是独立的,每个Activity的主题都会引用自身module的AndroidManifest所声明的主题,若没声明,就是系统默认主题。
我截取编译出来Apk的AndroidManifest.xml的一部分theme
<activity
android:name="com.winfae.login.LoginActivity"
android:screenOrientation="1" />
<activity
android:theme="@ref/0x7f0b0186"
android:name="com.winfae.fintransation.module.home.HomeActivity"
android:screenOrientation="1" />
<activity
android:theme="@ref/0x7f0b019e"
android:label="@ref/0x7f090028"
android:icon="@ref/0x7f020143"
android:name="com.squareup.leakcanary.internal.RequestStoragePermissionActivity"
android:enabled="false"
android:taskAffinity="com.squareup.leakcanary.com.winfae.fintransation" />
shareUid
只有App module的sharedUserId,才会最终打包进full AndroidManifest.xml。
service
参考activity的规则
包冲突
使用gradlew dependencies来查看 module的依赖树(参考本文第一部分)
规则:
- 多个lib同时依赖同一个包的 多个版本,默认使用版本比较高的依赖
- 如果想使用版本较低的依赖,可以用exclude来排除依赖。
比如以下的范例
api("com.squareup.retrofit2:converter-simplexml:$rootProject.retrofitVersion") {
exclude group: 'xpp3', module: 'xpp3'
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
}
资源名冲突
资源名冲突,涉及到R.java文件。这一块,我觉得不需要详细叙述。
R.drawable.xxxx来进行引用,如果资源名称一样,就存在,你用了另外一个资源。
直接上解决方案:
强制添加前缀!
defaultConfig {
//强制前缀
resourcePrefix "acco_"
}
同时,每次上传版本到master,请进行一次lint(我的用的AliLint)进行检测。
通过resourcePrefix会进行提醒,通过Lint进行二次确认。避免冲突产生。
1001



被折叠的 条评论
为什么被折叠?



