Я использовал XStream для десериализации xml в своем приложении для Android, и сейчас я пытаюсь добавить Proguard (обфускатор) в смесь.
Вот исключение времени выполнения, с которым я столкнулся (полное: pastebin ):
WARN/System.err(6209): net.lp.collectionista.util.a.g: XStream could not parse the response
WARN/System.err(6209): at net.lp.collectionista.a.s.a(Collectionista:215)
...
WARN/System.err(6209): Caused by: com.thoughtworks.xstream.converters.ConversionException: id : id in loader dalvik.system.PathClassLoader[/data/app/net.lp.collectionista-2.apk] : id : id in loader dalvik.system.PathClassLoader[/data/app/net.lp.collectionista-2.apk]
WARN/System.err(6209): ---- Debugging information ----
WARN/System.err(6209): message : id : id in loader dalvik.system.PathClassLoader[/data/app/net.lp.collectionista-2.apk]
WARN/System.err(6209): cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
WARN/System.err(6209): cause-message : id : id in loader dalvik.system.PathClassLoader[/data/app/net.lp.collectionista-2.apk]
WARN/System.err(6209): class : net.lp.collectionista.jaxb.googlebooks.search.Feed
WARN/System.err(6209): required-type : java.lang.Object
WARN/System.err(6209): path : /feed/entry/id
WARN/System.err(6209): line number : 1
WARN/System.err(6209): -------------------------------
WARN/System.err(6209): at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(Collectionista:89)
...
WARN/System.err(6209): at com.thoughtworks.xstream.XStream.fromXML(Collectionista:861)
...
WARN/System.err(6209): Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: id : id in loader dalvik.system.PathClassLoader[/data/app/net.lp.collectionista-2.apk]
WARN/System.err(6209): at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(Collectionista:68)
...
Само собой разумеется, что это прекрасно работает без Proguard. Я использую сжатие, оптимизацию и запутывание здесь, хотя я отключил все это для любого класса XStream, а также для любого класса, который соответствует модели для полей xml:
-keep class net.lp.collectionista.jaxb.** { *; }
-keep class com.thoughtworks.xstream.** { *; }
Я могу подтвердить из запутанного jar, а также из mapping.txt (для методов), что все упомянутые классы существуют и не запутаны, так что нетронутый AFAICT. Я также храню аннотации.
Исключение для меня довольно очевидно. У меня есть:
xstream.omitField(Feed.class, "id");
среди других. Кажется, что вызов omitField () больше не работает, и он начинает искать класс модели "id" из-за Proguard. Вот где я застрял, даже после погружения в код XStream. Весь вызов omitField в запутанном конечном результате, кажется, не поврежден, так что здесь может быть дополнительно нарушено? Он также не должен быть «Feed.class», так как он все еще там. Что мне не хватает? Что является хорошим следующим шагом для отладки?
РЕДАКТИРОВАТЬ: Я заметил, что файлы классов классов xstream в моем запутанном банке немного меньше оригинальных, даже с -dontoptimize. Что еще уронили?
EDIT2: Я начинаю думать, что это связано с отсутствием предупреждений dex, подобных следующему:
[apply] warning: Ignoring InnerClasses attribute for an anonymous inner class
[apply] (com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$1) that doesn't come with an
[apply] associated EnclosingMethod attribute. This class was probably produced by a
[apply] compiler that did not target the modern .class file format. The recommended
[apply] solution is to recompile the class from source, using an up-to-date compiler
[apply] and without specifying any "-target" type options. The consequence of ignoring
[apply] this warning is that reflective operations on this class will incorrectly
[apply] indicate that it is *not* an inner class.
... а может и нет ...
EDIT3: Наконец, несмотря на устранение многих других ошибок и проблем, таких как ошибка SimException , я смог заставить ее работать в некоторых ограниченных случаях. Таким образом, я мог бы точно указать на шаг запутывания. То есть, по крайней мере, если я добавлю «-dontobfuscate», проблема исчезнет. это не первый раз, когда я играю с этим, так что, возможно, это обходные пути для других проблем или более узкая конфигурация, которая также облегчает эту проблему. Итак, вот я снова спрашиваю: когда я уже защитил основные части xstream и мои классы моделей от обфускации с помощью «-keep», что еще может создать этот беспорядок?
Если вам нужна дополнительная информация, дайте мне знать.