在 Eclipse 中的 ProGuard Obfuscation 之后,Google 地图不会加载



我正在开发一个使用谷歌地图的应用程序。在我导出签名的应用程序包之前,该应用程序运行良好。在代码被混淆后,不再加载地图。我是ProGuard的新手,我尝试过修改ProGuard.cfg,但到目前为止没有任何效果。以下是我尝试过的一些不同的东西:

-libraryjars C:/Program Files/Android/android-sdk/add-ons/addon-google_apis-google_inc_-10/libs/maps.jar
-keep class android.location.** { *; }
-keepnames class com.google.android.maps.** {*;}
-keep public class com.google.android.maps.** {*;}
-dontwarn com.google.android.maps.GeoPoint
-dontwarn com.google.android.maps.MapActivity
-dontwarn com.google.android.maps.MapView
-dontwarn com.google.android.maps.MapController 
-dontwarn com.google.android.maps.Overlay

感谢

编辑:适用于Android V2的谷歌地图特别是:

为了防止有人看到这一点并遇到类似的问题——当我试图查看第二个映射时,我得到了一个Parcelable RuntimeException(如中所示,Activity A有一个映射实例,然后移动到Activity B,另一个具有不同参数的实例),指向我所认为的谷歌包中模糊的类名。

在我添加之后

-keep class com.google.android.gms.maps.** { *; }
-keep interface com.google.android.gms.maps.** { *; }

在我的proguard-project.txt中,一切似乎都像正常的一样工作

这很可能是映射API密钥的问题。您应该使用导出应用程序时使用的签名生成密钥,并在地图视图中使用它
使用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

我在使用Google Maps Roads API时也遇到过类似的问题——它在模糊代码中不起作用。事实证明,API库在后台使用反射,因此解决方案是添加

-keep class com.google.maps.** { *; }

至proguard-rules.pro.

(在这里特别添加这个答案,因为当我搜索问题的解决方案时,这个问题是最相关的,在这里找到答案可以节省我几个小时的进一步搜索。)

这是更好的

-keep class * implements com.google.android.gms.maps { *; }
-keep class com.google.android.gms.maps.** { *; }
-keep interface com.google.android.gms.maps.** { *; }

最新更新