Сбой приложения после подписания приложения с сокращением ресурсов и Proguard - PullRequest
0 голосов
/ 31 декабря 2018

Это первый раз, когда я получаю исключение такого типа при создании подписанного APK.Я много искал, но не смог найти никакой полезной информации, чтобы это исправить.

Любая информация мне очень поможет.Потому что я уже провожу много времени, исправляя это.Я также хочу уменьшить размер APK.

Я создаю подписанный APK с настройками выпуска ниже и proguard

release {
    minifyEnabled true
    shrinkResources true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

Proguard:

-dontwarn okhttp3.internal.platform.*
-dontwarn java.nio.file.*
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8
-dontwarn javax.annotation.**
-dontwarn kotlin.Unit
-dontwarn retrofit2.-KotlinExtensions

После созданияПодписав APK, я попытался проверить это и обнаружил, что вход в Google и Facebook не работает (я не использую другие способы входа), а также сбой приложения, когда я открываю Политику конфиденциальности или Условия действия, которые запрашивают конечную точку API с помощью Retrofit 2.

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

Ниже приведен logcat аварии.

2018-12-31 15:24:42.054 15126-15126/com.sathi E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.sathi.c.a.i$a.a()' on a null object reference
        at com.sathi.activities.PrivacyPolicyActivity$1.a(Unknown Source)
        at com.sathi.c.d$3.a(Unknown Source)
        at d.h$a$1$1.run(Unknown Source)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6776)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
2018-12-31 15:24:42.281 15126-15126/com.sathi E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.sathi, PID: 15126
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.sathi.c.a.i$a.a()' on a null object reference
        at com.sathi.activities.PrivacyPolicyActivity$1.a(Unknown Source)
        at com.sathi.c.d$3.a(Unknown Source)
        at d.h$a$1$1.run(Unknown Source)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6776)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

Я не знаю, что является причиной этого исключения.Любая информация поможет.Заранее спасибо!

Обновление:

Это предупреждение о компиляции Java, которое я получаю при создании подписанного APK-файла без Proguard, но сохраняющего minifyEnabled true.

enter image description here

Ответ:

Благодаря ответу Реаза Проблема была в классе модели, который я использовал для получения ответа от Retrofit

Я добавил строку ниже в моем Proguard

-keepclassmembers class com.sathi.models.** { *; }

1 Ответ

0 голосов
/ 31 декабря 2018

Вы должны держать классы.Отключение предупреждений не сохранит классы и уменьшит соответствующим образом proguard.В этом случае библиотеки из Google или Facebook могут вести себя некорректно.

То же самое относится и к классам, используемым для вызова API.Когда вы пытаетесь сериализовать данные JSON из вашего ответа API в класс, члены класса должны иметь точные имена, где возвращаемые значения могут быть сопоставлены правильно.

Я поделюсь правилами из моего проекта для вашей справки.Надеюсь, это поможет!

-keep class com.google.** { *; }
-keep class com.github.** { *; }
-keep class com.android.** { *; }
-keep class junit.** { *; }
-keep class com.example.com.mymodels.** { *; }
-keepclassmembers class com.example.com.mymodels.** { *; }

Из вашего logcat я думаю, что классовые классы, которые вы используете для анализа ответов от вашего API, вызывают ошибку.Можете ли вы сохранить классы и сообщить мне, если это не работает ваша программа?

...