如何用Gradle变体在Google与亚马逊计费库的Kotlin导入间切换?
解决Google Billing与亚马逊兼容SDK的条件导入问题
方案1:Kotlin类型别名+Flavor源集
这是最轻量化的方案,无需包装大量接口,完全复用现有业务代码:
为每个Flavor创建独立源目录
新增以下目录结构:src/ google/kotlin/com/yourapp/billing/ BillingAliases.kt amazon/kotlin/com/yourapp/billing/ BillingAliases.kt main/kotlin/ // 你的业务代码分别定义类型别名
- Google flavor版本(
BillingAliases.kt):package com.yourapp.billing typealias BillingClient = com.android.billingclient.api.BillingClient typealias BillingResult = com.android.billingclient.api.BillingResult typealias Purchase = com.android.billingclient.api.Purchase typealias SkuDetails = com.android.billingclient.api.SkuDetails // 按需添加业务用到的其他计费类别名 - Amazon flavor版本(
BillingAliases.kt):package com.yourapp.billing typealias BillingClient = com.amazon.device.iap.billingclient.api.BillingClient typealias BillingResult = com.amazon.device.iap.billingclient.api.BillingResult typealias Purchase = com.amazon.device.iap.billingclient.api.Purchase typealias SkuDetails = com.amazon.device.iap.billingclient.api.SkuDetails // 对应亚马逊兼容SDK的类
- Google flavor版本(
修改主代码导入
将原import com.android.billingclient.api.*替换为:import com.yourapp.billing.*编译时Gradle会根据当前Flavor自动加载对应源集的别名文件,业务代码无需改动。
方案2:Kotlin Expect/Actual机制
如果需要更严格的类型约束,可借助Kotlin的expect/actual特性:
主源集定义
expect声明
在main/kotlin/com/yourapp/billing/BillingTypes.kt中添加:package com.yourapp.billing expect class BillingClient expect class BillingResult expect class Purchase expect class SkuDetails // 如需用到接口或伴生方法,补充expect声明 expect interface BillingClientBuilder { fun enablePendingPurchases(): BillingClientBuilder fun build(): BillingClient }各Flavor实现
actual类型别名- Google flavor的
BillingTypes.kt:package com.yourapp.billing actual typealias BillingClient = com.android.billingclient.api.BillingClient actual typealias BillingResult = com.android.billingclient.api.BillingResult actual typealias Purchase = com.android.billingclient.api.Purchase actual typealias SkuDetails = com.android.billingclient.api.SkuDetails actual typealias BillingClientBuilder = com.android.billingclient.api.BillingClient.Builder - Amazon flavor的
BillingTypes.kt:package com.yourapp.billing actual typealias BillingClient = com.amazon.device.iap.billingclient.api.BillingClient actual typealias BillingResult = com.amazon.device.iap.billingclient.api.BillingResult actual typealias Purchase = com.amazon.device.iap.billingclient.api.Purchase actual typealias SkuDetails = com.amazon.device.iap.billingclient.api.SkuDetails actual typealias BillingClientBuilder = com.amazon.device.iap.billingclient.api.BillingClient.Builder
- Google flavor的
业务代码使用统一类型
导入com.yourapp.billing.*后,直接使用BillingClient等类型即可,编译时自动绑定对应SDK实现。
注意事项
- 确保两个SDK的API签名完全一致(亚马逊兼容SDK已做适配),否则会出现编译错误;
- 保持Gradle中
googleImplementation和amazonImplementation的依赖配置正确,避免同时引入两个SDK; - 若业务用到SDK的伴生对象方法(如
BillingClient.newBuilder()),需在别名或expect声明中对应处理。
内容的提问来源于stack exchange,提问作者mm2001
相关产品推荐
相关产品推荐

