Android APP组件化

本文最后更新于:2024年12月24日 晚上

前导知识

配置 build 变体 ?|? Android Studio ?|? Android Developers: https://developer.android.com/build/build-variants?hl=zh-cn#groovy

Android模块化之MicroModule(微信Pins工程)相信你看过微信关于模块化的分享《微信Android模块化 - 掘金: https://juejin.cn/post/6844903647956959246?from=search-suggest

怎么实现微信Android Pins工程结构?Pins工程结构是什么? 如何做代码边界检查? - 掘金: https://juejin.cn/post/6844903602645893128

微信Android模块化架构重构实践: https://mp.weixin.qq.com/s/6Q818XA5FaHd7jJMFBG60w

美团外卖Android平台化架构演进实践 - 美团技术团队: https://tech.meituan.com/2018/03/16/meituan-food-delivery-android-architecture-evolution.html

Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus - 美团技术团队: https://tech.meituan.com/2018/07/26/android-livedatabus.html

Android组件化方案及组件消息总线modular-event实战 - 美团技术团队: https://tech.meituan.com/2018/12/20/modular-event.html

创建 Android 库 ?|? Android Studio ?|? Android Developers: https://developer.android.com/studio/projects/android-library?hl=zh-cn

添加 build 依赖项 ?|? Android Studio ?|? Android Developers: https://developer.android.com/build/dependencies?hl=zh-cn

高级测试设置 ?|? Android Studio ?|? Android Developers: https://developer.android.com/studio/test/advanced-test-setup?hl=zh-cn#create-instrumented-test-for-build-variant

Andriod 多渠道分包,实用的module分层,开发代码混淆规Andriod studio 3.0 有必要重新学习更 - 掘金: https://juejin.cn/post/6844903518411702286 (混淆规则)

资源冲突

Android 组件资源覆盖冲突解决方案在 Android 的日常开发中,我们会使用到大量的第三方库或者自己编写的组件库 - 掘金: https://juejin.cn/post/6844903993894780942

https://github.com/hust201010701/CheckResourceConflict

Android Gradle Plugin 3.3 版本及其以上,提供了一个 API 可以获取编译所有的资源文件。

1
2
3
4
5
variants.forEach { variant ->
variant as BaseVariantImpl
// files 即对应所有的编译资源
def files = variant.allRawAndroidResources.files

终于理解~Android 模块化里的资源冲突? 前言 作为 Android 开发者,我们常常需要去管理非常多不同的资源文 - 掘金: https://juejin.cn/post/7170562275374268447

利用Android Gradle进行自动化设置资源名命名规则一、背景描述: ????公司再不断推进组件化,多个Modul - 掘金: https://juejin.cn/post/7065889116780494855

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
android {  

flavorDimensions "versionCode"

productFlavors {
productFlavors.all {//遍历productFlavors多渠道,设置渠道号(xiaomi 、huawei)
flavor -> flavor.manifestPlaceholders.put("CHANNEL", name)
}
}
applicationVariants.all { variant ->
// 打包完成后输出路径
def name = ((project.name != "app") ? project.name : rootProject.name.replace(" ", "")) +
"_" + variant.flavorName +
"_" + variant.buildType.name +
"_" + variant.versionName +
"_" + new Date().format('yyyyMMddhhmm') + ".apk"
//相对路径app/build/outputs/apk/huawei/release/
def path = "../../../../../apk/" //相当于路径 app/apk/
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
//指定路径输出
output.outputFileName = new File(path, name)
}
}
// 在打包完成后还可以做一些别的操作,可以复制到指定目录,或者移动文件到指定目录
variant.assemble.doLast {
File out = new File(“${project.rootDir}/apk”)
variant.outputs.forEach { file ->
//复制apk到指定文件夹
//copy {
// from file.outputFile
// into out
//}
//把文件移动到指定文件夹
ant.move file: file.outputFile,
todir: "${project.rootDir}/apk"
}
}
}
//多渠道签名的配置
signingConfigs {
test {
storeFile file("../test.keystore")
storePassword 'test'
keyAlias 'test'
keyPassword 'test'
v1SigningEnabled true
v2SigningEnabled true
}
xiaomi {
storeFile file("../xiaomi.keystore")
storePassword 'xiaomi'
keyAlias 'xiaomi'
keyPassword 'xiaomi'
v1SigningEnabled true
v2SigningEnabled true
}
}
buildTypes {
debug {
// debug这里设置不起作用,可能是编译器的问题?
// productFlavors.xiaomi.signingConfig signingConfigs.test
// productFlavors.huawei.signingConfig signingConfigs.test
}
release {
productFlavors.xiaomi.signingConfig signingConfigs.xiaomi
productFlavors.huawei.signingConfig signingConfigs.huawei
}
}
}

1
2
3
4
5
6
7
android {
variantFilter { variant ->
if (variant.buildType.name.equals('debug')) {
variant.setIgnore(true);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
lintOptions {
checkReleaseBuilds false
abortOnError false
// 防止在发布的时候出现因MissingTranslation导致Build Failed!
disable 'MissingTranslation'
}

dexOptions {
incremental true
javaMaxHeapSize "8g"
jumboMode = true
preDexLibraries = false
threadCount ="8"
}

missingDimensionStrategy

配置产品变种productFlavors matchingFallbacks missingDimensionStrategy - 简书: https://www.jianshu.com/p/4b311bd9840d

gradle - Android buildTypes vs. productFlavors error - Stack Overflow: https://stackoverflow.com/questions/64758477/android-buildtypes-vs-productflavors-error

ProductFlavor多渠道的神器 - 简书: https://www.jianshu.com/p/00ceb35b090b

参考

Android 多渠道打包多渠道配置(2 种方式) 1、可写在主模块(app)的 build.gradle 下 2、在项 - 掘金: https://juejin.cn/post/7023661293781385247

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道) - 简书: https://www.jianshu.com/p/533240d222d3

Android 官方模块化方案解读快速了解 Android 官方模块化方案。还有一些你可能不知道的实用小技巧。还有官方模 - 掘金: https://juejin.cn/post/7142884855091560479


Android APP组件化
https://iwesley.top/article/69eef408/
作者
Wesley
发布于
2024年11月17日
许可协议