首页 > 解决方案 > Google Play 账单在 Api 级别低于 19 时崩溃

问题描述

根据谷歌的文档,谷歌播放计费应该适用于 API 8 及更高版本,但不起作用。

https://developer.android.com/google/play/billing/billing_overview

我从他们的 github 实现了基本指南:
https ://github.com/googlesamples/android-play-billing/tree/master/TrivialDrive_v2

然后我删除了我不需要的所有内容,保留核心并传输到我的真实应用程序

在我的测试中一切似乎都运行良好,但是当我部署到生产环境时,甚至在加载第一个活动之前,在应用程序初始化期间,就会启动大量崩溃:

Caused by java.lang.ClassNotFoundException: Didn't find class "com.android.org.conscrypt.OpenSSLRSAPublicKey" on path: DexPathList[[zip file "/data/app/com.tomatedigital.instagramgiveawaywinner-5.apk", zip file "/data/data/com.tomatedigital.instagramgiveawaywinner/code_cache/secondary-dexes/com.tomatedigital.instagramgiveawaywinner-5.apk.classes2.zip"],nativeLibraryDirectories=[/data/app-lib/com.tomatedigital.instagramgiveawaywinner-5, /vendor/lib, /system/lib]]
       at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:64)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
       at java.lang.Class.classForName(Class.java)
      at com.tomatedigital.giveawaymaster.billing.Security.generatePublicKey(Security.java:73)
       at com.tomatedigital.giveawaymaster.util.App$2.run(App.java:302)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
       at java.lang.Thread.run(Thread.java:841)

失败的方法是:

/**
 * Generates a PublicKey instance from a string containing the
 * Base64-encoded public key.
 *
 * @param encodedPublicKey Base64-encoded public key
 * @throws IllegalArgumentException if encodedPublicKey is invalid
 */
public static PublicKey generatePublicKey(String encodedPublicKey) {
    try {
        byte[] decodedKey = Base64.decode(encodedPublicKey, Base64.DEFAULT);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);
        return keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    } catch (InvalidKeySpecException e) {
        Log.e(TAG, "Invalid key specification.");
        throw new IllegalArgumentException(e);
    }
}

这种方法是来自谷歌示例的复制/粘贴,我这边没有修改,甚至变量重命名......

我的类本身甚至不导入异常中提到的缺失类,com.android.org.conscrypt.OpenSSLRSAPublicKey所以这意味着这个类被谷歌的一些内部 api 调用使用,并且不包含在可导入的包中

implementation 'com.android.billingclient:billing:1.1'

我的问题是如何在 android api lvl 15 - 18 上使用谷歌计费(我的应用程序最低 api 级别为 15)?

我可以导入的最小包是什么,以便提供所有需要的类,因为谷歌没有?

我检查了 maven,conscrypt 包本身是 5MB ......我不愿意导入 5MB 的 api,因为我的整个 APP 是 5MB 我会把它放大两倍,它没有意义,因为如果还有任何设备使用 android 4.3 或更早版本,它是一个资源非常有限的设备,拥有这么大的 apk 是不合理的

===========更新==============

我导入了评论中提到的依赖项,但我仍然遇到同样的异常

olderImplementation 'org.conscrypt:conscrypt-android:1.2.0'

标签: androidin-app-purchasein-app-billingandroid-billingplay-billing-library

解决方案


推荐阅读