Согласно документации Google, биллинг Google Play должен работать с 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);
}
}
этот метод - КОПИРОВАТЬ / ВСТАВИТЬ из примера Google, никаких изменений с моей стороны, даже переименования переменных ...
сам мой класс даже не импортирует отсутствующий класс, упомянутый в исключении com.android.org.conscrypt.OpenSSLRSAPublicKey, поэтому это означает, что этот класс используется некоторыми внутренними вызовами API Google и не был включен в пакет, доступный для импорта
implementation 'com.android.billingclient:billing:1.1'
Мой вопрос: как использовать биллинг Google на android api lvl 15-18 (минимальный уровень api моего приложения 15)?
какой минимальный доступный пакет я могу импортировать, чтобы предоставить все необходимые классы, поскольку Google этого не сделал?
Я проверил на maven, и сам пакет consrypt составляет 5 МБ ... я не хочу импортировать 5 МБ api, так как мое ВСЕ ПРИЛОЖЕНИЕ составляет 5 МБ, я бы сделал его в два раза больше, и это не имеет смысла, потому что если есть какое-либо устройство, при использовании Android 4.3 или старше это устройство с очень ограниченными ресурсами, и неразумно иметь для него более крупный apk
=========== ОБНОВЛЕНИЕ =============
Я импортировал зависимость, упомянутую в комментариях, но все еще получаю то же исключение
olderImplementation 'org.conscrypt:conscrypt-android:1.2.0'
ошибка воспроизводима, как я описал, только на API ниже 19 ... у меня не включена минификация
Это похоже на часть github.com/google/conscrypt и упомянутый там пакет
implementation 'org.conscrypt:conscrypt-android:1.2.0'3.4MB согласно mvnrepository.com/artifact/org.conscrypt/conscrypt-android/…. Но перед тем, как что-то импортировать, вы пробовали запустить релизный apk, чтобы убедиться, что он воспроизводится? У вас включена минификация?