λ:
仓库地址: https://github.com/lzyprime/android_demos
之前想复用data层, ui层分别用compose
和传统view
分别实现。所以通过gradle moudle
组织工程:
core
: 通用部分, 包括data层,viewModel,共用资源文件等view
: view实现compose
: compose实现
但是实际体验之后,发现还是有很多弊端:
- Hilt依赖注入跨moudle的问题
- Application, Manifest文件维护两份(view, compose),但大部分逻辑相同
- gralde 依赖声明,module 存在相同依赖,管理繁琐
初衷本来只是隔离ui层实现和部分资源文件,所以改为通过sourceSet
实现:
val useCompose by project.extra(false)
android {
sourceSets {
getByName("main") {
if (useCompose) {
kotlin.srcDir("src/ui/compose")
res.srcDir("src/ui/compose/res")
} else {
res.srcDir("src/ui/view/res")
kotlin.srcDir("src/ui/view")
}
}
}
}
- buildTypes
- dependencies
- productFlavors
- sourceSets
实现 配置,源码,资源文件 多版本控制
sourceSet 源码集
sourceSet 是 gradle 本身就提供的接口,用来组织项目源码。 gradle sourceSets
// build.gradle
plugins {
id 'java'
}
sourceSets {
main {
java {
exclude 'some/unwanted/package/**'
}
}
}
android gradle plugin
自己也有一个sourceSet, 目的很简单,就是先塞一些默认行为:android sourceSet 默认源码集。 kts
版本的api相比groovy
要少一部分,没有exclude 等操作
src/main/
此源代码集包含所有变体
共用的代码和资源。src/<buildType>/
创建此源代码集可加入特定 buildType 专用的代码和资源。 比如常用的debug
,release
。在 android.buildTypes 中配置src/<productFlavor>/
创建此源代码集可加入特定产品变种
专用的代码和资源。在 android.productFlavors 配置
// build.gradle.kts
android {
...
sourceSets {
// NamedDomainObjectContainer<out AndroidSourceSet>
getByName