ticktakclockの日記

技術ポエムを綴ったりします。GitHub idも同じです (@ticktakclock)

BillingLibraryを1.2 -> 2.2.1にアップデートするまで(ついでにRx->Coroutinesも)

こんにちは、tkyです。

BillingLibraryのバージョンを遅ればせながら1.2 -> 2.2.1(20200603時点の最新)にアップデートしましたのでその時の作業内容をまとめておこうと思います。

バージョンアップは必要なのか?

必要です。

Google I/O'19において

  • 毎年のGoogle I/Oでメジャーバージョンをリリースする
  • メジャーバージョンは2年間サポートする
  • AIDL/BL 1.x は非推奨

ことが発表されています。

youtu.be

BL1.0がリリースされたのは 2017/9/19 、I/O'19ですでに非推奨と言われていますが、サポートはBL2.0と同じ期間設けられています。

BL2.0がリリースされたのは 2019/5/7、2年間のサポートを考慮するとXデーは2021/5/7ということになります。

我々は確実に2年に1度はBillingLibraryのアップデートが必要であるということがわかりました。

Google I/O'20は残念ながら新型コロナウィルス(COVID-19)の影響を懸念して完全中止になってしまったため、BillingLibrary3.0のリリースについては不透明な状況にあります。

とはいえいきなり1.0から3.0に上げると変更点が怖いので今のうちに2.0にあげておいて、3.0リリースを受けてもう一度アップデートしようかなと思い作業した次第です。

(どちらかという2.0へアップデートしつつもRxからCoroutinesへの置き換えがメインになりそうです)

versionを1.2 -> 2.2.1にあげる

1.x→2.xへの変更点

ドキュメントのリリースノートを見ると良いです。プログラムもいくつか修正必須項目があります。

Google Play Billing Library リリースノート  |  Android デベロッパー

私が主に変更したところをピックアップします。

レスポンスコードの定義場所が変更

// 変更前
BillingClient.BillingResponse.OK
// 変更後
BillingClient.BillingResponseCode.OK

レスポンスコードはBillingResultオブジェクトに変更

今までレスポンスコードが返っていた場所は全てBillingResult というクラスで表現されるようになります。

そのためリスナー関連のメソッドの引数の型を変更することと、 responseCodebillingResult.responseCode に書き換えることが必要となります。

// 変更前
BillingClientStateListener.onBillingSetupFinished(responseCode: Int)
// 変更後
BillingClientStateListener.onBillingSetupFinished(billingResult: BillingResult)
// 変更前
PurchasesUpdatedListener.onPurchasesUpdated(responseCode: Int, purchases: List<Purchase>?)
// 変更後
PurchasesUpdatedListener.onPurchasesUpdated(billingResult: BillingResult, purchases: List<Purchase>?)

その他のリスナーは別の変更点で一緒に見ていきます。

consumeAsyncの引数の型が変更

こちらについては2.1からCoroutines拡張ができましたので後にRx->Coroutinesに変更しますが、まずはバージョンアップすることだけを考えます。

併せて ConsumeResponseListener.onConsumeResponse(responseCode: Int, purchaseToken: String)ConsumeResponseListener.onConsumeResponse(billingResult: BillingResult, purchaseToken: String) へ変更しますが、

SAM変換を利用しており型推論も効いているので変数名を変更していきます。

// 変更前
billingClient.consumeAsync(purchase.purchaseToken) { responseCode, purchaseToken ->
    // レスポンスの処理
}
// 変更後
val consumeParam = ConsumeParams.newBuilder()
    .setPurchaseToken(purchase.purchaseToken)
    .build()
billingClient.consumeAsync(consumeParam) { billingResult, purchaseToken ->
    // レスポンスの処理
    // responseCodeはbillingResultオブジェクトへ変更
}

queryPurchaseHistoryAsyncで返るオブジェクトが変更

こちらもSAM変換を利用して型推論も効いているので変数名の変更です。Listから List< PurchaseHistoryRecord>になっていますが、中身は同じ(autoRenewing, orderId, packageNameは含まない)らしいです。

// 変更前
billingClient.queryPurchaseHistoryAsync(skuType) { responseCode, purchases ->
    // レスポンスの処理
}
// 変更後
billingClient.queryPurchaseHistoryAsync(skuType) { billingResponse, purchaseHistoryRecords ->
    // レスポンスの処理
}

BillingFlowParams.Builder()に設定するクラスの変更

これは1.2のリリースによる変更で2.xとは関係ありません。 とはいえ2.0においてsetSku(String sku)は削除されており本メソッドは利用できません。 BillingClient.querySkuDetailsAsync() から取得できるSkuDetailBillingFlowParams.Builder.setSkuDetails(skuDetail: SkuDetail) に設定する必要があります。

Google Play Billing Library リリースノート  |  Android デベロッパー

BillingClientの諸メソッドをCoroutinesに切り替え

com.android.billingclient:billing-ktx を利用することでCoroutinesに切り替えられるメソッドが幾つか存在します。必要に応じてCoroutinesに切り替えます。脱Rxです。

  • BillingClient.acknowledgePurchase()
  • BillingClient.consumePurchase()
  • BillingClient.queryPurchaseHistory()
  • BillingClient.querySkuDetails()

例えばRxでこのように書いていたら

Single.create<BillingResult> {
    val consumeParam = ConsumeParams.newBuilder()
        .setPurchaseToken(purchase.purchaseToken)
        .build()
    billingClient.consumeAsync(consumeParam) { billingResult, purchaseToken ->
        it.onSuccess(billingResult)
    }
}

Coroutines拡張によってスッキリかけるようになります。

val consumeParam = ConsumeParams.newBuilder()
    .setPurchaseToken(purchase.purchaseToken)
    .build()
return billingClient.consumePurchase(consumeParam)

コミットの分割

おおよそこんな感じでコミットを分けて作業用のブランチにPR出していました。

  • バージョンアップで出たビルドエラーの解消
  • Coroutinesで書き直せるところを1つずつリファクタ * n回

まとめ

  • billing libraryを 1.2 から 2.2.1にしたときの作業ログをここに残した
  • そんなに大きく変更があるわけではなかった
  • com.android.billingclient:billing-ktx を利用することでCoroutinesに切り替えられるメソッドがある
  • 近い将来また billing libraryを3.0にアップデートする時が来る
  • 来たるべきアプデの時までに覚悟を決めましょう