Gradle多渠道构建实战:Diia应用GMS/HMS版本差异化编译方案

Gradle多渠道构建实战:Diia应用GMS/HMS版本差异化编译方案

【免费下载链接】android-diia 【免费下载链接】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 定义了项目模块结构,将功能按libsfeaturesdoc等目录组织,便于按渠道选择性依赖。
  • 版本管理gradle/libs.versions.toml 集中管理第三方依赖版本,通过gplayImplementationhuaweiImplementation区分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 渠道专属依赖

通过gplayImplementationhuaweiImplementation关键字,为不同渠道添加专属依赖:

// GMS专属依赖
gplayImplementation(platform(libs.firebase.bom))
gplayImplementation(libs.firebase.crashlytics)

// HMS专属依赖
huaweiImplementation(libs.huawei.agconnect.crash)

完整依赖配置见opensource/build.gradle.ktsdependencies块。

三、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中声明,避免冲突:

<service android:name="ua.gov.diia.notifications.service.FCMS">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
<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版本的自动化构建。核心要点包括:

  1. 使用产品风味分离渠道配置
  2. 通过源码集目录隔离渠道专属代码
  3. 利用条件依赖管理第三方库
  4. 采用统一接口抽象渠道差异

该方案可扩展至更多渠道(如小米、OPPO等),只需添加新的产品风味并配置相应依赖即可。建议结合CI/CD工具(如Jenkins)实现自动化测试和发布,进一步提升开发效率。

如果你在实践中遇到问题,欢迎查阅项目的官方文档或提交Issue。点赞收藏本文,关注作者获取更多Android构建技巧!

【免费下载链接】android-diia 【免费下载链接】android-diia 项目地址: https://gitcode.com/GitHub_Trending/an/android-diia

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值