使用 Google Maps API v2 时,签名的 APK 崩溃,未签名的 APK

Posted

技术标签:

【中文标题】使用 Google Maps API v2 时,签名的 APK 崩溃,未签名的 APK【英文标题】:Signed APK crashes, unsigned not, when using Google Maps API v2 【发布时间】:2021-01-13 20:45:05 【问题描述】:

在我的 android 应用程序中,我使用 Google Maps API v2 显示带有标记的地图。它与本地调试和发布版本完美配合。一旦我构建了一个签名的 APK,应用程序就会在应该显示地图时崩溃。仅当我授权已签名 APK 的 SHA1 以在 Google Cloud Console 中进行 API 访问时,它才会崩溃。如果我删除 SHA1 指纹,然后取消对应用程序的授权,我会得到一张空地图,但应用程序不会崩溃。

崩溃目录:

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)

【问题讨论】:

您找到解决方案了吗?我有同样的问题:( 在下面添加解决方案 【参考方案1】:

解决方案是抑制相关类的 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

【讨论】:

尽快尝试,非常感谢,您确实为我节省了我的应用程序,或者数百小时的迁移到 Mapbox xD 刚刚意识到此修复程序适用于 V2,我认为它不适用于 V3... :( 将继续尝试寻找解决方案。顺便说一句,请修复链接,我认为是正确的一个可能是这个:github.com/googlemaps/android-samples/blob/main/ApiDemos/java/…

以上是关于使用 Google Maps API v2 时,签名的 APK 崩溃,未签名的 APK的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 Android Google Maps API v2 地图以显示全球地图?

如何使用 Google MAps API v2 围绕引脚绘制圆圈

将 Google maps api v2 添加到现有项目

居中位图标记(Google Maps Android API v2)

使用 Google Maps API v2 获取行车路线

Google Maps Android API V2 检查设备上是不是安装了 GoogleMaps