与SAAgent(三星附件)java.lang.NoSuchMethodException:[]的Proguard问题
作者:互联网
我正在尝试使用我的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 Accesory SDK需要SASocket内部类实现的默认构造函数,因为我猜他们使用反射来实例化该对象.
在这里http://sourceforge.net/p/proguard/bugs/387/,您可以读到:“外部$Inner不会更改为顶级类,除非您还将-repackageclasses和-allowaccessmodification添加到配置中”.
不幸的是,这些标志通常是从proguard-android-optimize.txt继承的,如果你想保持优化,解决方案是添加到你的proguard配置:
-keepattributes InnerClasses
请注意,为了能够使用Samsung Accesory 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,android,proguard,samsung-mobile,samsung-mobile-sdk 来源: https://codeday.me/bug/20190528/1173335.html