InvalidClassCastException в .jar после использования proguard

Я использую eclipse для разработки приложения для Android. Когда я нажимаю «Выполнить» (зеленый треугольник), приложение работает нормально. Но я включил proguard, и приложение вылетает. Я использую файл proguard-android.txt по умолчанию, который находится в sdk/tools/proguard.

У меня есть jar под названием Software.jar, в котором есть несколько классов. Один из них (данные) является сериализуемым классом.(with serialversionUID=112358L). Это (вероятно) та часть, которая вызывает ошибку.

Это журнал ошибок (я не знаю почему, но он отображается желтым цветом как предупреждение):

07-22 15:29:46.429: W/System.err(2051): java.io.InvalidClassException: software.Data; Несовместимый класс (SUID): программное обеспечение. Данные: static final long serialVersionUID = 112358L; но ожидаемое программное обеспечение. Данные: static final long serialVersionUID =-4551990835091843772L; 07-22 15:29:46.433: W/System.err(2051): в 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): в java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960) 07-22 15:29:46.445: W/System.err(2051): в java.util.ArrayList.readObject(ArrayList.java:657) 07-22 15:29:46.445: W/System.err(2051): на java.lang.reflect.Me thod.invokeNative(собственный метод) 07-22 15:29:46.449: W/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): в 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): в 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): на com.main package.de.run (неизвестный источник)

а это красные линии(ошибка тега)

07-22 15:29:46.465: E/AndroidRuntime(2051): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: Thread-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): at 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 1 5:29:46.529: E/SocketStream(112): readFully ждал 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 ждал 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

Самое смешное, что у меня есть system.out в одном из классов software.jar. Это печатается.

Я попытался добавить -libraryjars C:\Users\Harsh\git\marks++\Marks++\Software.jar, а также

-keep  class Software.**

в уже упомянутый файл .txt

Где я ошибаюсь?

ИЗМЕНИТЬ

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

person harveyslash    schedule 22.07.2014    source источник


Ответы (2)


Кажется, после прохождения proguard ваш serializable класс serialVersionUID меняется. Вам нужно изменить configuration of proguard, чтобы включить:

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

}

Как описано здесь

person Sanjeev    schedule 22.07.2014
comment
я получаю classnotfoundexception сейчас - person harveyslash; 22.07.2014
comment
Пожалуйста, опубликуйте трассировку стека - person Sanjeev; 22.07.2014

Я нашел рабочее решение после небольшого эксперимента. Это то, что я использовал:

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

}
person harveyslash    schedule 22.07.2014