yoomoney / yookassa-android-sdk

This library allows implementing payment acceptance into mobile apps on Android. It works as an extension to the YooMoney API.
https://yookassa.ru/developers/payment-forms/android-sdk
MIT License
40 stars 22 forks source link

AndroidX + Proguard #22

Closed username4564 closed 5 years ago

username4564 commented 5 years ago

При попытке стартануть intent, созданный с помощью Checkout.createTokenizeIntent, приложение падает.

Стектрейс: E/AndroidRuntime: FATAL EXCEPTION: main Process: ru.example.yandexkassax, PID: 5430 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/threatmetrix/TrustDefender/internal/יִ; at com.threatmetrix.TrustDefender.TrustDefender.(Unknown Source:3) at com.threatmetrix.TrustDefender.TrustDefender.getInstance(Unknown Source:15) at ru.yandex.money.android.sdk.impl.d.a(Unknown Source:458) at ru.yandex.money.android.sdk.impl.k.a(Unknown Source:115) at ru.yandex.money.android.sdk.impl.CheckoutActivity.onCreate(Unknown Source:70) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.threatmetrix.TrustDefender.internal.יִ" on path: DexPathList[[zip file "/data/app/ru.example.yandexkassax-Ez3S87Y9_Fz9GhROeigZiQ==/base.apk"],nativeLibraryDirectories=[/data/app/ru.example.yandexkassax-Ez3S87Y9_Fz9GhROeigZiQ==/lib/x86_64, /system/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at com.threatmetrix.TrustDefender.TrustDefender.(Unknown Source:3)  at com.threatmetrix.TrustDefender.TrustDefender.getInstance(Unknown Source:15)  at ru.yandex.money.android.sdk.impl.d.a(Unknown Source:458)  at ru.yandex.money.android.sdk.impl.k.a(Unknown Source:115)  at ru.yandex.money.android.sdk.impl.CheckoutActivity.onCreate(Unknown Source:70)  at android.app.Activity.performCreate(Activity.java:7136)  at android.app.Activity.performCreate(Activity.java:7127)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:193)  at android.app.ActivityThread.main(ActivityThread.java:6669)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

Условия: 1) Версия SDK 2.1.0 2) Включенный Proguard

Пример проекта (необходимо запустить и нажать на кнопку Pay): ykx-proguard-issue.zip

drukarev commented 5 years ago

Подскажите, пожалуйста: Если в вашем приложении поставить "android.enableR8 = true" в gradle.properties, падение исчезает?

username4564 commented 5 years ago

К сожалению собрать проект в таком режиме не представляется возможным, т.к. выскакивает ошибка, с которой не совсем понятно что делать. AGPBI: {"kind":"warning","text":"Type com.google.android.gms.common.util.zzv was not found, it is required for default or static interface methods desugaring of void com.google.android.gms.iid.zzo.\u003cinit\u003e(android.content.Context, java.lang.String)" Гугл пишет, что нужно отключать R8 - такое себе решение проблемы.

Также есть сомнения на счет адекватности и качества работы R8 на данный момент.

drukarev commented 5 years ago

Рекомендации по сборке проекта:

1) По возможности использовать R8 (он уже стабилен и является инструментом по умолчанию в новых версиях Android Studio

2) Если возникают проблемы с R8, можно попробовать следующие шаги:

3) При использовании Proguard может понадобиться правило -keep class com.threatmetrix.TrustDefender.internal.* { ; } в proguard-rules