使用资源缩减和 Proguard 签署应用程序后应用程序崩溃
App Crash after signing app with resource shrinking and Proguard
这是我在构建签名 APK 时第一次遇到此类异常。我搜索了很多但找不到任何有用的信息来解决这个问题。
任何信息都会对我有很大帮助。因为我已经花了很多时间来解决这个问题。我也想减小 APK 的大小。
我正在使用以下发布设置和混淆器创建签名 APK
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
混淆器:
-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 端点的术语 Activity。
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.a(Unknown Source)
at com.sathi.c.d.a(Unknown Source)
at d.h$a.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.a(Unknown Source)
at com.sathi.c.d.a(Unknown Source)
at d.h$a.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 编译警告,我在构建一个没有 Proguard 的标志 APK 文件但保持 minifyEnabled true
.
时收到
答案:
感谢 Reaz 的回答
问题是我用来从 Retrofit
获得响应的模型 class
我在 Proguard 中添加了以下行
-keepclassmembers class com.sathi.models.** { *; }
您需要保留 classes。调低警告不会保留 classes 并且会被 proguard 相应地缩小。在这种情况下,来自 Google 或 Facebook 的库可能会出现错误。
用于调用 API 的 class 也是如此。当您尝试将 API 响应中的 JSON 数据序列化为 class 时,class 成员应该具有可以正确映射返回值的确切名称。
我正在分享我项目中的规则供您参考。希望有帮助!
-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 响应的模型 classes 导致了错误。您能否保留 classes 并在您的程序崩溃时告诉我?
这是我在构建签名 APK 时第一次遇到此类异常。我搜索了很多但找不到任何有用的信息来解决这个问题。
任何信息都会对我有很大帮助。因为我已经花了很多时间来解决这个问题。我也想减小 APK 的大小。
我正在使用以下发布设置和混淆器创建签名 APK
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
混淆器:
-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 端点的术语 Activity。
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.a(Unknown Source)
at com.sathi.c.d.a(Unknown Source)
at d.h$a.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.a(Unknown Source)
at com.sathi.c.d.a(Unknown Source)
at d.h$a.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 编译警告,我在构建一个没有 Proguard 的标志 APK 文件但保持 minifyEnabled true
.
答案:
感谢 Reaz 的回答 问题是我用来从 Retrofit
获得响应的模型 class我在 Proguard 中添加了以下行
-keepclassmembers class com.sathi.models.** { *; }
您需要保留 classes。调低警告不会保留 classes 并且会被 proguard 相应地缩小。在这种情况下,来自 Google 或 Facebook 的库可能会出现错误。
用于调用 API 的 class 也是如此。当您尝试将 API 响应中的 JSON 数据序列化为 class 时,class 成员应该具有可以正确映射返回值的确切名称。
我正在分享我项目中的规则供您参考。希望有帮助!
-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 响应的模型 classes 导致了错误。您能否保留 classes 并在您的程序崩溃时告诉我?