简体   繁体   English

使用proguard后,.jar中的InvalidClassCastException

[英]InvalidClassCastException in .jar after using proguard

I am using eclipse to develop an android app. 我正在使用eclipse开发一个Android应用程序。 When I press Run(the green triangle), the app works fine. 当我按运行(绿色三角形)时,该应用程序运行正常。 But , I enabled proguard, and the app crashes. 但是,我启用了proguard,应用程序崩溃了。 I am using the default proguard-android.txt which is present in sdk/tools/proguard. 我正在使用sdk / tools / proguard中存在的默认proguard-android.txt。

I have a jar called Software.jar , which has a few classes. 我有一个名为Software.jar的jar,其中包含几个类。 One of them (Data) is a serializable class. 其中之一(数据)是可序列化的类。 (with serialversionUID=112358L) . (with serialversionUID=112358L) This is (probably) the part that causes the error. (可能)这是导致错误的部分。

This is the error log(i dont know why, but it is showing in yellow as a warning): 这是错误日志(我不知道为什么,但是以黄色显示为警告):

07-22 15:29:46.429: W/System.err(2051): java.io.InvalidClassException: software.Data; 07-22 15:29:46.429:W / System.err(2051):java.io.InvalidClassException:software.Data; Incompatible class (SUID): software.Data: static final long serialVersionUID =112358L; 不兼容的类(SUID):软件。数据:静态最终长串serialVersionUID = 112358L; but expected software.Data: static final long serialVersionUID =-4551990835091843772L; 数据:静态最终长long serialVersionUID = -4551990835091843772L; 07-22 15:29:46.433: W/System.err(2051): at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2380) 07-22 15:29:46.433: W/System.err(2051): at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1662) 07-22 15:29:46.437: W/System.err(2051): at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683) 07-22 15:29:46.437: W/System.err(2051): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1803) 07-22 15:29:46.441: W/System.err(2051): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 07-22 15:29:46.441: W/System.err(2051): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 07-22 15:29:46.441: W/System.err(2051): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 07-22 15:29:46.445: W/System.err(2051): at java.util.ArrayList.readObject(ArrayList.java:657) 07-22 15:29:46.445: W/System.err(2051): at java.lang.reflect.Method.invokeNative(Native Method) 07-22 15:29:46.449: W 07-22 15:29:46.433:W / System.err(2051):at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2380)07-22 15:29:46.433:W / System.err(2051) :位于java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1662)07-22 15:29:46.437:W / System.err(2051):位于java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683)07 -22 15:29:46.437:W / System.err(2051):在java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1803)07-22 15:29:46.441:W / System.err(2051):在java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)07-22 15:29:46.441:W / System.err(2051):在java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)07- 22 15:29:46.441:W / System.err(2051):at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)07-22 15:29:46.445:W / System.err(2051):at java.util.ArrayList.readObject(ArrayList.java:657)07-22 15:29:46.445:W / System.err(2051):at java.lang.reflect.Method.invokeNative(Native Method)07-22 15 :29:46.449:W /System.err(2051): at java.lang.reflect.Method.invoke(Method.java:511) 07-22 15:29:46.449: W/System.err(2051): at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1354) 07-22 15:29:46.449: W/System.err(2051): at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 07-22 15:29:46.453: W/System.err(2051): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 07-22 15:29:46.453: W/System.err(2051): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 07-22 15:29:46.457: W/System.err(2051): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 07-22 15:29:46.457: W/System.err(2051): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 07-22 15:29:46.457: W/System.err(2051): at com.mainpackage.FullGenPhysics.a(Unknown Source) 07-22 15:29:46.457: W/System.err(2051): at com.mainpackage.de.run(Unknown Source) /System.err(2051):在java.lang.reflect.Method.invoke(Method.java:511)07-22 15:29:46.449:W / System.err(2051):在java.io.ObjectInputStream。 readObjectForClass(ObjectInputStream.java:1354)07-22 15:29:46.449:W / System.err(2051):at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266)07-22 15:29:46.453: W / System.err(2051):位于java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855)07-22 15:29:46.453:W / System.err(2051):位于java.io.ObjectInputStream.readNonPrimitiveContent (ObjectInputStream.java:787)07-22 15:29:46.457:W / System.err(2051):at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)07-22 15:29:46.457:W /System.err(2051):在java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)07-22 15:29:46.457:W / System.err(2051):在com.mainpackage.FullGenPhysics.a(未知来源)07-22 15:29:46.457:W / System.err(2051):at com.mainpackage.de.run(未知来源)

and these are the red lines(tag error) 这些是红线(标记错误)

07-22 15:29:46.465: E/AndroidRuntime(2051): FATAL EXCEPTION: Thread-161 07-22 15:29:46.465: E/AndroidRuntime(2051): java.lang.NullPointerException 07-22 15:29:46.465: E/AndroidRuntime(2051): at software.Gen_Phy.a(Unknown Source) 07-22 15:29:46.465: E/AndroidRuntime(2051): at software.Gen_Phy.a(Unknown Source) 07-22 15:29:46.465: E/AndroidRuntime(2051): at software.Gen_Phy.(Unknown Source) 07-22 15:29:46.465: E/AndroidRuntime(2051): at com.mainpackage.FullGenPhysics.a(Unknown Source) 07-22 15:29:46.465: E/AndroidRuntime(2051): at com.mainpackage.de.run(Unknown Source) 07-22 15:29:46.465: W/ActivityManager(333): Force finishing activity com.mainpackage/.FullGenPhysics 07-22 15:29:46.525: E/SocketStream(112): readFully was waiting for 403440 bytes, got 49152 07-22 15:29:46.525: E/SocketStream(112): readFully was waiting for 354288 bytes, got 16384 07-22 15:29:46.529: E/SocketStream(112): readFully was waiting for 337904 bytes, got 1624 07-22 15:29:46.529: E/SocketStream(112): readFully wa 07-22 15:29:46.465:E / AndroidRuntime(2051):致命例外:线程161 07-22 15:29:46.465:E / AndroidRuntime(2051):java.lang.NullPointerException 07-22 15:29: 46.465:E / AndroidRuntime(2051):在software.Gen_Phy.a(未​​知源)07-22 15:29:46.465:E / AndroidRuntime(2051):在software.Gen_Phy.a(未​​知源)07-22 15: 29:46.465:E / AndroidRuntime(2051):在software.Gen_Phy。(未知源)07-22 15:29:46.465:E / AndroidRuntime(2051):在com.mainpackage.FullGenPhysics.a(未知源)07- 22 15:29:46.465:E / AndroidRuntime(2051):位于com.mainpackage.de.run(未知源)07-22 15:29:46.465:W / ActivityManager(333):强制完成com.mainpackage /活动。 FullGenPhysics 07-22 15:29:46.525:E / SocketStream(112):readFully在等待403440字节,得到49152 07-22 15:29:46.525:E / SocketStream(112):readFully在等待354288字节,得到16384 07-22 15:29:46.529:E / SocketStream(112):readFully正在等待337904字节,得到1624 07-22 15:29:46.529:E / SocketStream(112):readFully wa s waiting for 336280 bytes, got 49152 07-22 15:29:46.533: E/SocketStream(112): readFully was waiting for 287128 bytes, got 16384 07-22 15:29:46.533: E/SocketStream(112): readFully was waiting for 270744 bytes, got 1624 07-22 15:29:46.537: E/SocketStream(112): readFully was waiting for 269120 bytes, got 49152 07-22 15:29:46.537: E/SocketStream(112): readFully was waiting for 219968 bytes, got 16384 07-22 15:29:46.537: E/SocketStream(112): readFully was waiting for 203584 bytes, got 1624 07-22 15:29:46.541: E/SocketStream(112): readFully was waiting for 201960 bytes, got 49152 07-22 15:29:46.541: E/SocketStream(112): readFully was waiting for 152808 bytes, got 16384 07-22 15:29:46.541: E/SocketStream(112): readFully was waiting for 136424 bytes, got 1624 07-22 15:29:46.545: E/SocketStream(112): readFully was waiting for 134800 bytes, got 49152 07-22 15:29:46.545: E/SocketStream(112): readFully was waiting for 85648 bytes, got 16384 07-22 15:29:46.549: E/SocketStream(112): readFully was w s等待336280字节,得到49152 07-22 15:29:46.533:E / SocketStream(112):readFully正在等待287128字节,得到16384 07-22 15:29:46.533:E / SocketStream(112):readFully正在等待270744字节,得到1624 07-22 15:29:46.537:E / SocketStream(112):readFully正在等待269120字节,得到49152 07-22 15:29:46.537:E / SocketStream(112):readFully正在等待219968字节,得到16384 07-22 15:29:46.537:E / SocketStream(112):readFully正在等待203584字节,得到1624 07-22 15:29:46.541:E / SocketStream(112):readFully正在等待201960字节,得到49152 07-22 15:29:46.541:E / SocketStream(112):readFully正在等待152808字节,得到16384 07-22 15:29:46.541:E / SocketStream(112):readFully正在等待136424字节,得到1624 07-22 15:29:46.545:E / SocketStream(112):readFully正在等待134800字节,得到49152 07-22 15:29:46.545:E / SocketStream(112):readFully正在等待85648字节,得到16384 07-22 15:29:46.549:E / SocketStream(112):readFully是w aiting for 69264 bytes, got 1624 07-22 15:29:46.549: E/SocketStream(112): readFully was waiting for 67640 bytes, got 49152 07-22 15:29:46.549: E/SocketStream(112): readFully was waiting for 18488 bytes, got 16384 等待69264字节,得到1624 07-22 15:29:46.549:E / SocketStream(112):readFully正在等待67640字节,得到49152 07-22 15:29:46.549:E / SocketStream(112):readFully是等待18488字节,得到16384

The funny thing is, that I have a system.out in one of the classes of software.jar. 有趣的是,我在software.jar之一类中有一个system.out。 That is getting printed. 那是打印。

I have tried adding -libraryjars C:\\Users\\Harsh\\git\\marks++\\Marks++\\Software.jar as well as 我尝试添加-libraryjars C:\\Users\\Harsh\\git\\marks++\\Marks++\\Software.jar以及

-keep  class Software.**

to the already mentioned .txt file 到已经提到的.txt文件

Where am I going wrong ? 我要去哪里错了?

EDIT 编辑

 07-22 16:10:54.957: W/System.err(2233): java.lang.ClassNotFoundException: software.Data 07-22 16:10:54.961: W/System.err(2233): at java.lang.Class.classForName(Native Method) 07-22 16:10:54.961: W/System.err(2233): at java.lang.Class.forName(Class.java:217) 07-22 16:10:54.965: W/System.err(2233): at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2301) 07-22 16:10:54.965: W/System.err(2233): at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1660) 07-22 16:10:54.965: W/System.err(2233): at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683) 07-22 16:10:54.969: W/System.err(2233): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1803) 07-22 16:10:54.969: W/System.err(2233): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 07-22 16:10:54.973: W/System.err(2233): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 07-22 16:10:54.973: W/System.err(2233): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 07-22 16:10:54.973: W/System.err(2233): at java.util.ArrayList.readObject(ArrayList.java:657) 07-22 16:10:54.973: W/System.err(2233): at java.lang.reflect.Method.invokeNative(Native Method) 07-22 16:10:54.977: W/System.err(2233): at java.lang.reflect.Method.invoke(Method.java:511) 07-22 16:10:54.977: W/System.err(2233): at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1354) 07-22 16:10:54.977: W/System.err(2233): at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1266) 07-22 16:10:54.977: W/System.err(2233): at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1855) 07-22 16:10:54.977: W/System.err(2233): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787) 07-22 16:10:54.977: W/System.err(2233): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003) 07-22 16:10:54.977: W/System.err(2233): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 07-22 16:10:54.977: W/System.err(2233): at com.mainpackage.FullGenPhysics.a(Unknown Source) 07-22 16:10:54.977: W/System.err(2233): at com.mainpackage.de.run(Unknown Source) 07-22 16:10:54.981: W/System.err(2233): Caused by: java.lang.NoClassDefFoundError: software/Data 07-22 16:10:54.981: W/System.err(2233): ... 20 more 07-22 16:10:54.981: W/System.err(2233): Caused by: java.lang.ClassNotFoundException: software.Data 07-22 16:10:54.981: W/System.err(2233): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) 07-22 16:10:54.981: W/System.err(2233): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 07-22 16:10:54.981: W/System.err(2233): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 07-22 16:10:54.985: W/System.err(2233): ... 20 more 

It seems after going through proguard your serializable class's serialVersionUID is getting changed. 它经历后,似乎proguard你的serializable类的serialVersionUID是得到改变。 You need to change the configuration of proguard to include: 您需要将configuration of proguardconfiguration of proguard更改为包括:

-keepclassmembers class software.Data {
    static final long serialVersionUID;

}

As described Here 如上所述这里

I found a working solution after a bit of experimenting. 经过一些试验,我找到了一个可行的解决方案。 This is what I used: 这是我使用的:

-libraryjars Software.jar
-keep  class software.**{
*;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM