我正在尝试在我的 android 应用程序中使用 proguard,并且我正在使用三星配件 sdk,它一直给我带来麻烦。
无论我在 proguard 配置中尝试什么,我似乎都无法克服这个运行时异常:
07-21 13:44:12.851: E/SAAgent(3563): <init> []
07-21 13:44:12.851: E/SAAgent(3563): java.lang.NoSuchMethodException: <init> []
...
07-21 13:44:12.851: E/AndroidRuntime(3563): Caused by: java.lang.RuntimeException: Invalid implemetation of SASocket. Provider a public default constructor.
...
有人知道要尝试什么吗?
最佳答案
问题是,开启一些优化后,Proguard 将更改顶级类中的每个内部类。
这意味着内部类的默认构造函数将与采用外部类实例的单参数构造函数交换,因为在 Java 中,内部类保留对外部类的引用。
Samsung Accessory SDK 需要 SASocket 内部类实现的默认构造函数,因为我猜他们使用反射来实例化该对象。
在这里http://sourceforge.net/p/proguard/bugs/387/您可以读到:“Outer$Inner 未更改为顶级类,除非您还向配置添加 -repackageclasses 和 -allowaccessmodification”。
不幸的是,这些标志通常是从 proguard-android-optimize.txt 继承的,如果你想保持优化,解决方案是添加到你的 proguard 配置中:
-keepattributes InnerClasses
请注意,为了能够使用 Samsung Accessory SDK 的全部功能,您还应该包括以下规则:
# Based on http://proguard.sourceforge.net/manual/examples.html#library
-keep public class com.samsung.** {
public protected *;
}
-keepclassmembernames class com.samsung.** {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
-keepclasseswithmembernames class com.samsung.** {
native <methods>;
}
-keepclassmembers enum com.samsung.** {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class com.samsung.** implements java.io.Serializable {
static final long serialVersionUID;
private 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();
}
关于java - SAAgent(三星配件)java.lang.NoSuchMethodException : <init> [] 的 Proguard 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24872517/