java - SAAgent(三星配件)java.lang.NoSuchMethodException : <init> [] 的 Proguard 问题

标签 java android proguard samsung-mobile samsung-mobile-sdk

我正在尝试在我的 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/

相关文章:

java - 在一系列整数上使用扫描仪时,如何跳过一些整数?

android - 将 android-numberpicker backport 添加到 Android Studio Gradle 项目

android - Youtube API 不返回更新的结果

android - 启用混淆器后出现致命信号 11 (SIGSEGV)

android - Android 上的 Proguard 和 Netty

java - Maven - 如何管理具有共同依赖项的多个 jar

java电子邮件附件在正文中以纯文本形式发送

java - 使用 Blackberry Java API 将十进制数格式化为 (###,###.##)

android - MODE_IN_CALL、MODE_IN_COMMUNICATION、MODE_CALL_SCREENING 有什么区别?

android - 在 Android Studio 中将 Build Type debuggable 设置为 True 不适用