如何基于单一代码库构建适配Google Play与亚马逊应用商店的版本?
多应用商店发布的无分支代码管理方案
不需要维护两个代码分支,用Gradle的**Product Flavors(产品风味)**来管理不同平台的变体是最成熟的方案——Build Types主要用于区分Debug/Release这类构建环境,而Product Flavors才是专门用来定义不同版本/渠道变体的工具,完全适配你的需求。
具体实现步骤如下:
1. 配置Gradle的Product Flavors
在app模块的build.gradle(或build.gradle.kts)中定义对应平台的风味,同时给特定风味添加专属依赖:
android { flavorDimensions "platform" productFlavors { googlePlay { dimension "platform" // 可定义Google Play版本的专属配置,比如应用ID后缀 applicationIdSuffix ".google" } amazon { dimension "platform" applicationIdSuffix ".amazon" } } } dependencies { // 通用依赖放在此处 implementation "androidx.core:core-ktx:1.12.0" // 仅Google Play版本依赖Billing库 googlePlayImplementation "com.android.billingclient:billing:6.1.0" }
2. 隔离平台专属代码
通过源集(Source Sets)实现代码的条件编译,无需分支:
- 在项目目录下创建
src/googlePlay/java/目录,存放Google Billing相关代码(比如支付逻辑实现、BillingClient初始化等) - 创建
src/amazon/java/目录,存放亚马逊版本的专属逻辑(比如免费/完整版的权限判断、解锁逻辑等) - 主源码目录
src/main/java/仅存放通用业务逻辑,避免直接依赖任何平台专属类
如果需要更优雅的解耦,可以定义通用接口,比如:
// src/main/java/com/yourapp/PaymentManager.java public interface PaymentManager { boolean isFullVersion(); void unlockFullVersion(); }
然后在googlePlay风味下实现Google Billing版本的逻辑,在amazon风味下实现完整版判断逻辑,主代码仅依赖这个接口即可。
3. 差异化资源与清单配置
不同风味可拥有独立的资源和清单文件:
- 比如
src/googlePlay/AndroidManifest.xml中添加Google Billing所需权限:
<uses-permission android:name="com.android.vending.BILLING" />
src/amazon/AndroidManifest.xml无需该权限,还可修改应用名称、图标等资源,比如在src/amazon/res/values/strings.xml中定义专属应用名。
4. 构建与打包
直接通过Gradle命令构建对应版本:
- 构建Google Play正式版:
./gradlew assembleGooglePlayRelease - 构建亚马逊正式版:
./gradlew assembleAmazonRelease
构建完成后,对应APK/AAB会生成在app/build/outputs/apk/或app/build/outputs/bundle/目录下。
这种方案完全不需要维护多个代码分支,所有平台变体的差异化逻辑都通过Gradle风味和源集隔离,通用代码只需维护一份。
内容的提问来源于stack exchange,提问作者Mike Macpherson
相关产品推荐
相关产品推荐

