Android Proguard异常:ExceptionInInitializerError和RuntimeException

3

我希望对我的.apk文件进行混淆,但是在使用Proguard时遇到了一些问题。我已经在Eclipse中启用了以下选项:

# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

我正在使用4个外部库:

  • android-support-v4.jar
  • nine-old-android-lib.jar
  • gson-2.2.2.jar
  • commons-io-2.4.jar

我猜我遇到了gson的问题:

private static Type MY_DATA_TYPE = new TypeToken<Pair<Map<Point, Void>, Integer>>() {}.getType();

每次我使用它时:
FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError at com.myapp.MyActivity.onCreate(Unknown Source)

...

Caused by: java.lang.RuntimeException: Missing type parameter.
at com.google.gson.reflect.TypeToken.getSuperclassTypeParameter(Unknown Source)
at com.google.gson.reflect.TypeToken.<init>(Unknown Source)

我正在使用这些选项,但我猜它们不会有帮助:

-keepattributes Exceptions, InnerClasses, *Annotation*, EnclosingMethod

-dontskipnonpubliclibraryclassmembers
-libraryjars .../libs/android-support-v4.jar
-libraryjars .../libs/nine-old-android-lib.jar
-libraryjars .../libs/gson-2.2.2.jar
-libraryjars .../libs/commons-io-2.4.jar


-keep class java.** { *; }
-keep class android.** { *; }
-keep class org.** { *; }
-keep class com.google.** { *; }
-keep class com.facebook.** { *; }
-keep class com.nineoldandroids.** { *; }

我该如何解决这个问题并创建一个正常工作的混淆.apk文件?
感谢您的时间。

我正在使用... Type type = new TypeToken<HashMap<String, ArrayList<Station>>>() { }.getType(); ...这段代码可以给我返回一个列表,但是其中的Station对象却是null,我该怎么办? - Pankaj Nimgade
2个回答

8

我正在使用以下代码:Type type = new TypeToken<HashMap<String,ArrayList<Station>>>() { }.getType(); 该代码可以给我返回一个列表,但是其中的Station对象却为null。请问我该怎么办? - Pankaj Nimgade
创建一个新主题,包含你的问题、一些代码示例和错误输出,这样我们就可以给你提供高质量的帮助。 - GuilhE
是的,我创建了一个https://dev59.com/MpTfa4cB1Zd3GeqPO1Dm,显然我无法获得有关出现问题及如何修复它的解释。 - Pankaj Nimgade
但是您已将该问题标记为“已回答”。如果尚未解决,请取消“已回答”标记。 - GuilhE

1
以下是谷歌gson proguard示例所展示的Proguard配置。 谷歌gson proguard配置链接
##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

##---------------End: proguard configuration for Gson  ----------

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接