在我的 android 应用程序中,我使用 Google Maps API v2 来显示带有标记的 map 。它与本地调试和发布版本完美配合。一旦我构建了一个签名的 APK,应用程序就会在应该显示 map 时崩溃。仅当我在 Google Cloud Console 中授权已签名 APK 的 SHA1 进行 API 访问时,它才会崩溃。如果我删除 SHA1 指纹,从而取消对应用程序的授权,我会得到一张空 map ,但应用程序不会崩溃。
崩溃目录:
2020-09-28 11:03:12.000 32246-32369/? E/AndroidRuntime: FATAL EXCEPTION: DefaultPool5
Process: zz.yyyyyyyyyy.xxxxxxxxxx, PID: 32246
java.lang.NullPointerException: throw with null exception
at com.google.android.libraries.maps.lv.zzj.<init>(Unknown Source:9)
at com.google.android.libraries.maps.lv.zzau.zza(Unknown Source:19)
at com.google.android.libraries.maps.lv.zze.zzb(:1)
at com.google.android.libraries.maps.lv.zze.zza(Unknown Source:2)
at com.google.android.libraries.maps.eq.zzo.zza(Unknown Source:28)
at com.google.android.libraries.maps.eq.zzc.zza(Unknown Source:11)
at com.google.android.libraries.maps.fj.zzi.zza(Unknown Source:30)
at com.google.android.libraries.maps.fj.zzi.zza(Unknown Source:85)
at com.google.android.libraries.maps.fj.zzd.run(Unknown Source:8)
at com.google.android.libraries.maps.fv.zzc.run(Unknown Source:4)
at com.google.android.libraries.maps.fv.zzae.run(Unknown Source:7)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at com.google.android.libraries.maps.fv.zzv.run(Unknown Source:50)
at java.lang.Thread.run(Thread.java:919)
最佳答案
解决方案是抑制相关类的 proguard 混淆:
-optimizations !code/simplification/variable
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Fragment
-keep public class * extends android.support.v4.app.Fragment
# The Maps API uses custom Parcelables.
# Use this rule (which is slightly broader than the standard recommended one)
# to avoid obfuscating them.
-keepclassmembers class * implements android.os.Parcelable {
static *** CREATOR;
}
# The Maps API uses serialization.
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
奎尔:https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/proguard-rules.pro
关于android - 使用 Google Maps API v2 时,已签名的 APK 会崩溃,未签名的则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64099274/