【问题标题】:App Crash after signing app with resource shrinking and Proguard使用资源缩减和 Proguard 签署应用程序后应用程序崩溃
【发布时间】:2018-12-31 10:16:48
【问题描述】:

这是我在构建签名 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 登录不起作用(我没有使用任何其他方式登录),并且当我打开请求使用 Retrofit 2 的 API 端点。

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)

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

更新:

这些是我在构建没有 Proguard 但保留 minifyEnabled true 的标志 APK 文件时收到的 Java 编译警告。

答案:

感谢 Reaz 的回答 问题是我用来从 Retrofit 获得响应的模型类

我在我的 Proguard 中添加了以下行

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

【问题讨论】:

  • 检查 proguard 输出是否有任何错误。
  • 如何检查?
  • 构建项目时得到的输出。 Proguard 通常会在构建日志中吐出大量消息。
  • 只写一次-keep class com.sathi.activities.** { *; }
  • 谢谢@EktaBhawsar,但就我而言,问题出在我的模型上。我添加了 -keep class com.sathi.models.* { ; } 我的问题解决了。

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


【解决方案1】:

您需要保留课程。关闭警告不会保留课程,并且会被 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 响应的模型类会导致错误。您能否保留课程并让我知道这是否会使您的程序崩溃?

【讨论】:

  • 感谢@Reaz 的回复。但我还需要减小应用程序的大小。我也更新了问题。
  • 这个想法是保留与您正在使用的库相关的文件。缩小其他类和资源,以使您的 apk 大小保持在最小状态。
  • 这个配置好像太多了。
  • 谢谢@ReazMurshed,是的,它奏效了。这是我过去从 Retrofit 得到响应的模型问题。
  • 很高兴知道我可以帮助你。不客气!
猜你喜欢
  • 2014-03-09
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
相关资源
最近更新 更多