You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Gradle变体在Google与亚马逊计费库的Kotlin导入间切换?

解决Google Billing与亚马逊兼容SDK的条件导入问题

方案1:Kotlin类型别名+Flavor源集

这是最轻量化的方案,无需包装大量接口,完全复用现有业务代码:

  1. 为每个Flavor创建独立源目录
    新增以下目录结构:

    src/
      google/kotlin/com/yourapp/billing/
        BillingAliases.kt
      amazon/kotlin/com/yourapp/billing/
        BillingAliases.kt
      main/kotlin/
        // 你的业务代码
    
  2. 分别定义类型别名

    • 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的类
      
  3. 修改主代码导入
    将原import com.android.billingclient.api.*替换为:

    import com.yourapp.billing.*
    

    编译时Gradle会根据当前Flavor自动加载对应源集的别名文件,业务代码无需改动。

方案2:Kotlin Expect/Actual机制

如果需要更严格的类型约束,可借助Kotlin的expect/actual特性:

  1. 主源集定义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
    }
    
  2. 各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
      
  3. 业务代码使用统一类型
    导入com.yourapp.billing.*后,直接使用BillingClient等类型即可,编译时自动绑定对应SDK实现。

注意事项

  • 确保两个SDK的API签名完全一致(亚马逊兼容SDK已做适配),否则会出现编译错误;
  • 保持Gradle中googleImplementation和amazonImplementation的依赖配置正确,避免同时引入两个SDK;
  • 若业务用到SDK的伴生对象方法(如BillingClient.newBuilder()),需在别名或expect声明中对应处理。

内容的提问来源于stack exchange,提问作者mm2001

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:32:53