studio optimize ofuscar minifyenabled false codigo code android proguard simple-framework

optimize - ofuscar codigo android studio



La ofuscación de Proguard está rompiendo simplexml (7)

Estoy usando simplexml en mi proyecto de Android, y todo funciona bien hasta que ofusco el código. Entonces, los errores comienzan a llegar.

Parte del XML es el siguiente:

<categories success="true"> <category id="102" caption="Magazin" parent="0" num_mags="114" > <category id="15" caption="Kunst" parent="102" num_mags="13" > <category id="17" caption="Design" parent="15" num_mags="10" ></category> <category id="18" caption="Haute+Couture" parent="15" num_mags="2" > ...

Tengo dos clases: CategoryItemList:

@Root(name = "categories") public class CategoryItemList { private final List<CategoryItem> mCategoryItems; /** * Create a new category items list. * * @param categoryItems the list of category items */ public CategoryItemList(@ElementList(name = "category", inline = true) final List<CategoryItem> categoryItems) { mCategoryItems = categoryItems; } @ElementList(name = "category", inline = true) public List<CategoryItem> getCategoryItems() { return mCategoryItems; } }

y CategoryItem:

@Root(name = "category") public class CategoryItem { private final int mId; private final String mCaption; private final int mParent; private final int mNumberOfMagazines; private final ArrayList<CategoryItem> mSubCategoryItems; /** * Creating a new category item. * * @param id the category id * @param caption the name of category * @param parent the parent category * @param numMags the number of magazines from that category */ public CategoryItem(@Attribute(name = "id") final int id, @Attribute(name = "caption") final String caption, @Attribute(name = "parent") final int parent, @Attribute(name = "num_mags") final int numMags, @ElementList(name = "category", inline = true, required = false) final ArrayList<CategoryItem> subCategoryItems) { mId = id; mCaption = caption; mParent = parent; mNumberOfMagazines = numMags; mSubCategoryItems = subCategoryItems; } @Attribute(name = "id") public int getId() { return mId; } @Attribute(name = "caption") public String getCaption() { String categoryName = null; try { categoryName = URLDecoder.decode(mCaption, "UTF-8"); } catch (final UnsupportedEncodingException e) { e.printStackTrace(); } return categoryName; } @Attribute(name = "parent") public int getParentId() { return mParent; } @Attribute(name = "num_mags") public int getNumbersOfMagazines() { return mNumberOfMagazines; } @ElementList(name = "category", inline = true, required = false) public ArrayList<CategoryItem> getSubCategory() { return mSubCategoryItems; } }

Ahora, cuando ofusco el código, si dejo fuera "-atitattributes Annotation " obtengo una PersistenceException: el constructor no coincide con la clase.

Si lo incluyo, obtengo una excepción "No se puede determinar el tipo genérico para el parámetro 1 del constructor", todo esto en tiempo de ejecución.
Como puede ver, los nombres están ahí, y traté de mantener a toda la clase sosteniéndolos, todo en vano.

¿Cómo puedo configurar Proguard para trabajar con simplexml?

EDITAR: Mi archivo proguard.cfg es el siguiente: (está un poco lleno de todas las cosas que he intentado, pero esta es la versión actual)

-dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -printseeds -dontoptimize -keepattributes *Annotation* -keepattributes EnclosingMethod -libraryjars <java.home>/lib/rt.jar (javax/xml/stream/** ) -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keepclasseswithmembers class * { native <methods>; } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -dontwarn android.support.**,de.greenrobot.**,org.simpleframework.xml.** -keep class com.crittercism.**{ *; } -keepclassmembernames class com.crittercism.**{ *; } -keepclasseswithmembers class com.crittercism.**{ *; } -keep class org.simpleframework.**{ *; } -keepclassmembernames class org.simpleframework.**{ *; } -keepclasseswithmembers class org.simpleframework.**{ *; } -keep class crittercism.android.** -keepclassmembers public class com.crittercism.*{ *;} -keep public class database.** { public static <fields>; } -keep class android.support.** -keepclasseswithmembers class android.support.** { *;} -keep class org.simpleframeork.** -keepclasseswithmembers class org.simpleframeork.** { *;} -keep class javax.** -keepclasseswithmembers class javax.** { *;} -keep class com.test.category.** -keepclassmembernames class com.test.category.** { *; } -keepclasseswithmembers class com.test.category.** { *;} -keep class com.test.download.** -keepclassmembernames class com.test.download.** { *; } -keepclasseswithmembers class com.test.download.** { *;} -keep class org.simpleframework.**{ *; } -keep class org.simpleframework.xml.**{ *; } -keep class org.simpleframework.xml.core.**{ *; } -keep class org.simpleframework.xml.util.**{ *; } -keep class org.simpleframework.xml.stream.**{ *; } -keepclassmembers class * implements java.io.Serializable { 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(); }


Esta adición exacta al archivo proguard funcionó para mí:

-dontwarn javax.xml.stream.** -keep public class org.simpleframework.** { *; } -keep class org.simpleframework.xml.** { *; } -keep class org.simpleframework.xml.core.** { *; } -keep class org.simpleframework.xml.util.** { *; } -keepattributes ElementList, Root -keepclassmembers class * { @org.simpleframework.xml.* *; }


Haz clic derecho en tu proyecto en eclipse. Ir a Android -> ejecutar Lint.

Lint tiene la capacidad de verificar las configuraciones erróneas del programa y puede detectar y explicar su error.


Intenta agregar esto a tu archivo de programa:

-keep public class org.simpleframework.** { *; } -keep class org.simpleframework.xml.** { *; } -keep class org.simpleframework.xml.core.** { *; } -keep class org.simpleframework.xml.util.** { *; } -keepattributes ElementList, Root -keepclassmembers class * { @org.simpleframework.xml.* *; }

Esto me lo arregló.


Los problemas al utilizar la biblioteca SimpleXML y ofuscar el código son los siguientes:

  1. Debe mantener las "Anotaciones" y las "Firmas" de sus entidades.

    @Attribute (name = "retcode", required = true) String _retcode privado;

  2. Tienes que mantener la biblioteca SimpleXML

  3. Debe evitar que se eliminen ciertos bloques de código, por ejemplo, si no se usa el constructor de una entidad, proguard lo eliminará, pero Simple XML Library puede utilizar ese método internamente.

El archivo proguard.cfg puede ser algo como esto:

# The following line may be different -libraryjars <java.home>/lib/rt.jar(java/**,javax/**) -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose # (3)Not remove unused code -dontshrink -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService # (2)Simple XML -keep public class org.simpleframework.**{ *; } -keep class org.simpleframework.xml.**{ *; } -keep class org.simpleframework.xml.core.**{ *; } -keep class org.simpleframework.xml.util.**{ *; } # (1)Annotations and signatures -keepattributes *Annotation* -keepattributes Signature -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }

Lo uso en mi propio proyecto y funciona;)


Seguí recibiendo los siguientes errores:

can''t find referenced class javax.xml.stream.XMLEventReader

can''t find referenced class javax.xml.stream.events.XMLEvent

Esto se debe a que son parte del tiempo de ejecución de Java ( rt.jar ) pero no del tiempo de ejecución de Android ( android.jar ), por lo que ProGuard advierte que algo podría estar roto. Esto no es realmente un problema, por lo que podemos hacer lo siguiente:

-dontwarn javax.xml.stream.events.**

Source

Combinado con la respuesta de zmicer, obtengo lo siguiente

-dontwarn javax.xml.stream.events.** -keep public class org.simpleframework.** { *; } -keep class org.simpleframework.xml.** { *; } -keep class org.simpleframework.xml.core.** { *; } -keep class org.simpleframework.xml.util.** { *; } -keepattributes ElementList, Root -keepclassmembers class * { @org.simpleframework.xml.* *; }



Ya te diste cuenta de que mantener una anotación es una buena idea. También puede intentar agregar un parámetro de tipo a la anotación de @ElementList - aparentemente hay un problema con el borrado de tipo genérico y simplexml necesita una pista adicional sobre el tipo de elementos en la lista

También puede jugar con la firma -keepattributes, * Annotation *:

Se requiere el atributo "Firma" para poder acceder a los tipos genéricos al compilar en JDK 5.0 y superior.