Gradle多渠道构建实战:Diia应用GMS/HMS版本差异化编译方案
【免费下载链接】android-diia 项目地址: https://gitcode.com/GitHub_Trending/an/android-diia
你是否还在为Android应用适配不同厂商服务而头疼?同一套代码需要维护GMS(Google Mobile Services)和HMS(Huawei Mobile Services)两个版本,手动修改配置容易出错且效率低下。本文将以Diia应用为例,详解如何通过Gradle实现多渠道自动化构建,轻松搞定GMS/HMS版本的差异化编译。读完本文,你将掌握产品风味配置、依赖隔离、资源差异化管理等核心技能,让多渠道构建不再繁琐。
一、项目结构与多渠道架构设计
Diia项目采用模块化架构,通过Gradle的产品风味(Product Flavors)实现GMS/HMS版本分离。核心配置文件如下:
- 项目配置:settings.gradle.kts 定义了项目模块结构,将功能按
libs、features、doc等目录组织,便于按渠道选择性依赖。 - 版本管理:gradle/libs.versions.toml 集中管理第三方依赖版本,通过
gplayImplementation和huaweiImplementation区分GMS/HMS专属库。
项目模块划分如下表所示:
| 模块类型 | 路径示例 | 说明 |
|---|---|---|
| 核心库 | libs/core/ | 基础功能模块,全渠道共享 |
| 特性模块 | features/notifications/ | 通知功能模块,包含GMS/HMS子目录 |
| 应用入口 | opensource/ | 应用主模块,配置产品风味 |
二、Gradle多渠道核心配置
2.1 产品风味定义
在应用模块的build.gradle.kts中,通过androidComponents配置GMS/HMS渠道:
androidComponents {
onVariants {
val platformType = if (it.flavorName == "huawei") "\"Huawei\"" else "\"Android\""
it.buildConfigFields.put(
"PLATFORM_TYPE",
BuildConfigField("String", platformType, "platform type")
)
}
}
此配置会根据渠道生成BuildConfig.PLATFORM_TYPE常量,供代码中判断当前渠道。
2.2 渠道专属依赖
通过gplayImplementation和huaweiImplementation关键字,为不同渠道添加专属依赖:
// GMS专属依赖
gplayImplementation(platform(libs.firebase.bom))
gplayImplementation(libs.firebase.crashlytics)
// HMS专属依赖
huaweiImplementation(libs.huawei.agconnect.crash)
完整依赖配置见opensource/build.gradle.kts的dependencies块。
三、GMS/HMS差异化实现
3.1 通知服务差异化
通知模块通过源码目录分离实现渠道隔离,GMS版本使用Firebase,HMS版本使用华为推送:
@AndroidEntryPoint
class FCMS : FirebaseMessagingService() {
@Inject lateinit var pushService: PushService
override fun onNewToken(token: String) {
pushService.onNewToken(token) // 统一推送服务接口
}
}
@AndroidEntryPoint
class HCMS : HmsMessageService() {
@Inject lateinit var pushService: PushService
override fun onNewToken(token: String) {
pushService.onNewToken(token) // 统一推送服务接口
}
}
3.2 Manifest文件分离
渠道专属权限和组件在各自的AndroidManifest.xml中声明,避免冲突:
- GMS Manifest:notifications/src/gplay/AndroidManifest.xml 声明Firebase服务和权限:
<service android:name="ua.gov.diia.notifications.service.FCMS">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
- HMS Manifest:notifications/src/huawei/AndroidManifest.xml 声明华为推送服务:
<service android:name="ua.gov.diia.notifications.service.HCMS">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service>
四、构建流程与命令
4.1 构建命令
通过以下Gradle命令构建不同渠道版本:
# 构建GMS debug版本
./gradlew :opensource:assembleGplayDebug
# 构建HMS release版本
./gradlew :opensource:assembleHuaweiRelease
4.2 构建产物
构建输出位于opensource/build/outputs/apk/目录,文件命名格式为opensource-[渠道]-[构建类型].apk,例如:
opensource-gplay-debug.apk(GMS测试版)opensource-huawei-release.apk(HMS正式版)
五、关键技术点与最佳实践
5.1 统一接口抽象
通过接口定义屏蔽渠道差异,如推送服务的PushService,GMS和HMS分别提供实现,上层业务无需关心具体渠道。
5.2 资源差异化管理
使用Gradle的资源合并机制,为不同渠道提供专属资源,例如:
- GMS图标:
src/gplay/res/drawable/ic_push.png - HMS图标:
src/huawei/res/drawable/ic_push.png
系统会根据当前渠道自动选择对应资源。
5.3 版本号统一管理
在opensource/version.properties中定义版本号,确保各渠道版本同步:
VERSION_CODE=123
VERSION_NAME=2.5.0
六、总结与扩展
通过本文介绍的Gradle多渠道构建方案,Diia应用成功实现了GMS/HMS版本的自动化构建。核心要点包括:
- 使用产品风味分离渠道配置
- 通过源码集目录隔离渠道专属代码
- 利用条件依赖管理第三方库
- 采用统一接口抽象渠道差异
该方案可扩展至更多渠道(如小米、OPPO等),只需添加新的产品风味并配置相应依赖即可。建议结合CI/CD工具(如Jenkins)实现自动化测试和发布,进一步提升开发效率。
如果你在实践中遇到问题,欢迎查阅项目的官方文档或提交Issue。点赞收藏本文,关注作者获取更多Android构建技巧!
【免费下载链接】android-diia 项目地址: https://gitcode.com/GitHub_Trending/an/android-diia
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



