android - 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'
解决方案
推荐阅读
- node.js - Post req (NodeJs/Express) 的问题 - 发送一个空对象?
- validation - 谷歌表格:有没有办法防止重复的月份条目?
- vimeo - 在白名单域中嵌入 Vimeo 密码保护的视频
- java - Android Java - 变量“适配器”可能尚未初始化
- node.js - 如何从我的 POST 请求负载中提取特定信息并保存到 txt 文件中?
- android - 使用 ROOM 和 @Database 注释执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障
- reactjs - 如何从 JSON 创建组件树层次结构?反应JS
- python - Matplotlib 和 FileNotFoundError
- python - 如何在损失函数中使用模型输入?
- angular - 服务器响应状态为 431 (Request Header Fields Too Large) chrome Angular