使用资源缩减和Proguard对应用程序签名后,应用程序崩溃

时间:2018-12-31 10:16:49

标签: android android-studio apk proguard android-proguard

这是我在构建签名的APK时第一次遇到此类异常。我进行了很多搜索,但找不到任何有用的信息来解决此问题。

任何信息都会对我有很大帮助。因为我已经花了很多时间解决此问题。我也想减小APK的大小。

我正在使用以下发行版设置和proguard创建签名的APK

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登录无法正常工作(我没有使用任何其他方式登录),并且在我打开隐私政策或“条款活动”并要求使用翻新2的API端点。

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

下面是崩溃的日志。

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)

我不知道此异常的原因是什么。任何信息都会有所帮助。提前致谢!

更新

这些是我在不使用Proguard而是保留minifyEnabled true的情况下构建标志APK文件时收到的Java编译警告。

enter image description here

答案:

感谢Reaz的回答 问题是模型类,我曾经从Retrofit获得响应

我在Proguard中添加了以下行

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

1 个答案:

答案 0 :(得分:0)

您需要保留课程。拒绝警告不会使课程停滞不前,并且会因Proguard而相应缩小。在这种情况下,来自Google或Facebook的库可能行为不正确。

用于调用API的类也是如此。当您尝试将API响应中的JSON数据序列化为一个类时,该类成员应具有确切的名称,可以正确映射返回的值。

我正在分享我项目中的规则,供您参考。希望有帮助!

-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的响应的模型类导致该错误。您能否保留课程并让我知道是否使您的程序崩溃了?