编程语言
首页 > 编程语言> > 与SAAgent(三星附件)java.lang.NoSuchMethodException:[]的Proguard问题

与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