Android多构建变体项目如何跨模块访问复用已有模块
Android多构建变体复用已有模块落地指南
直接复制代码目录的维护成本极高,以下两种方案均可以实现修改一次wallet模块代码,同时在wallet和companion两个构建变体中生效,适配你当前main为公共源集、verify为独立源集的项目结构。
方案一:源集路径映射(改动最小,适配当前结构)
Android Gradle插件原生支持给单个构建变体配置多个代码/资源加载路径,不需要调整现有文件目录,只需要修改app模块下的build.gradle配置即可:
- 先确认你已经在配置中声明了所有构建变体:
android { // 省略compileSdk、defaultConfig等基础配置 productFlavors { verify {} wallet {} companion {} } }
- 新增
sourceSets配置,让companion变体编译时自动加载wallet源集下的所有文件:
android { // 上述productFlavors配置保留 sourceSets { companion { // 追加wallet的Kotlin/Java代码目录 java.srcDirs('src/wallet/java', 'src/companion/java') kotlin.srcDirs('src/wallet/kotlin', 'src/companion/kotlin') // 追加wallet的资源目录 res.srcDirs('src/wallet/res', 'src/companion/res') // 若有assets、jniLibs、aidl等其他目录需要复用,按相同规则追加即可 // AndroidManifest建议优先使用companion目录下的文件,系统会自动做清单合并 manifest.srcFile 'src/companion/AndroidManifest.xml' } } }
配置优先级说明:如果
companion和wallet目录下存在同包名同类名的代码、同名资源,构建时会优先使用companion目录下的文件,你可以直接在companion目录下编写需要差异化的逻辑覆盖默认实现,不需要改动wallet的原有代码。
方案二:独立公共模块抽离(适合长期迭代场景)
如果后续还会有更多构建变体需要复用钱包相关逻辑,可以把通用能力抽成独立本地依赖模块:
- 新建名为
feature-wallet的Android Library模块,将src/wallet目录下无差异化的通用代码、资源全部迁移到该模块中 - 配置变体依赖,仅给需要钱包能力的变体添加模块依赖:
dependencies { // 原有main公共依赖、verify变体依赖保持不变 walletImplementation project(':feature-wallet') companionImplementation project(':feature-wallet') }
wallet和companion两个源集目录下,仅保留各自独有的差异化逻辑即可,后续修改feature-wallet中的代码,所有依赖该模块的变体会自动同步生效。
选型参考
- 如果
companion和wallet的逻辑重合度在80%以上,仅存在少量差异化点,优先选择方案一,不需要迁移现有代码,配置完成即可生效,维护成本最低 - 如果后续钱包能力会被3个及以上变体复用,且不同变体的差异化逻辑占比会持续提升,选择方案二,模块边界更清晰,耦合度更低
内容的提问来源于stack exchange,提问作者Anshul Tyagi
相关产品推荐
相关产品推荐

