NullPointerException al usar el archivo XML en res / raw con Proguard
Estoy utilizando un serializador XML simple en mi aplicación y parecen haberlo excluido con éxito de la ofuscación Proguard mediante el uso de las siguientes líneas en proguard.cfg, gracias a esta pregunta SO :
-keep public class org.simpleframework.**{ *; } -keep class org.simpleframework.xml.**{ *; } -keep class org.simpleframework.xml.core.**{ *; } -keep class org.simpleframework.xml.util.**{ *; }
Puedo firmar y exportar el apk, pero cuando trato de ejecutar mi aplicación, se bloquea con una NullPointerException al intentar acceder a un archivo XML en el directorio res / raw (R.raw.home_screen_menu).
- Atributo "vacío" no funciona como se esperaba con SimpleFramework
- La ofuscación de Proguard está rompiendo simplexml
- Uso de XML simple y obtención de NoClassDefFoundError en Android
- Android - XML serialization - simpleframework - Ruta con Elementos opcionales (required = false) - ¿Cómo ocultar valores nulos?
- Cómo port jaxb anotación a la biblioteca simpleXml?
Excluyo a R.java con esto:
-keepclassmembers class **.R$* { public static <fields>; }
He estado jugando con este archivo de configuración todo el día, pero sin ninguna suerte. ¿Alguien ha encontrado este problema o algo así? Lo último que he probado es usar las opciones de "adaptresource" como las que se muestran a continuación:
-adaptresourcefilenames **.xml -adaptresourcefilecontents **.xml
Para referencia, he aquí el contenido de mi proguard.cfg:
#Use 5 step of optimization -optimizationpasses 5 #When not preverifing in a case-insensitive filing system, such as Windows. This tool will unpack your processed jars,(if using windows you should then use): -dontusemixedcaseclassnames #Specifies not to ignore non-public library classes. As of version 4.5, this is the default setting -dontskipnonpubliclibraryclasses #Preverification is irrelevant for the dex compiler and the Dalvik VM, so we can switch it off with the -dontpreverify option. -dontpreverify #Specifies to write out some more information during processing. If the program terminates with an exception, this option will print out the entire stack trace, instead of just the exception message. -verbose #The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. Note that the Dalvik VM also can't handle aggressive overloading (of static fields). #To understand or change this check http://proguard.sourceforge.net/index.html#/manual/optimizations.html -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -dump ../bin/class_files.txt -printseeds ../bin/seeds.txt -printusage ../bin/unused.txt -printmapping ../bin/mapping.txt -dontskipnonpubliclibraryclassmembers #Ignore warnings for roboguice.activity.RoboAccountAuthenticatorActivity -dontwarn roboguice.activity.RoboAccountAuthenticatorActivity -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 -keep class com.google.inject.Binder # Keep annotations -keepattributes *Annotation* -keepattributes Signature #To remove debug logs: -assumenosideeffects class android.util.Log { public static *** d(...); public static *** v(...); public static *** w(...); } # Roboguice -keepclassmembers class * { @com.google.inject.Inject <init>(...); } # SimpleXML -keep public class org.simpleframework.**{ *; } -keep class org.simpleframework.xml.**{ *; } -keep class org.simpleframework.xml.core.**{ *; } -keep class org.simpleframework.xml.util.**{ *; } -dontwarn javax.xml.stream.** -dontwarn javax.xml.namespace.** -keep public class roboguice.** # There's no way to keep all @Observes methods, so use the On*Event convention to identify event handlers -keepclassmembers class * { void *(**On*Event); } -keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } -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 *; } -keepclassmembers class * implements android.os.Parcelable { static android.os.Parcelable$Creator CREATOR; } -keepclassmembers class **.R$* { public static <fields>; }
- Simple-XML analiza el feed RSS con 2 que se declara dos veces
- Constructor no coincidente para la clase {proguard]
- No se puede crear un conversor para mi clase en Android Retrofit2 converter-simplexml library
- Simple Xml - orden de elementos no conservados?
- Android: error que incluye / reempaque las dependencias que hacen referencia a las clases principales de javax
- @Namespace en Android SimpleXml
- Cómo generar simple-xml java objeto anotado desde el esquema xsd
- Android, org.simpleframework.xml Existencia de persistencia, Elemento 'foo' ya se utiliza
Tengo exactamente el mismo problema. Finalmente lo resuelvo gracias a esta pregunta y respuesta. Dejé aquí la configuración final:
build.gradle:
buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } dependencies { compile('org.simpleframework:simple-xml:2.7.1') { exclude module: 'stax' exclude module: 'stax-api' exclude module: 'xpp3' } }
proguard-rules.pro (además de la configuración predeterminada de proguard)
-dontwarn javax.xml.** -keep public class org.simpleframework.**{ *; } -keep class org.simpleframework.xml.**{ *; } -keep class org.simpleframework.xml.core.**{ *; } -keep class org.simpleframework.xml.util.**{ *; } -keepattributes Signature -keepattributes *Annotation* # Ignore our XML Serialization classes -keep public class your.annotated.pojo.models.*{ public protected private *; }
Espero que ayude a alguien
Resulta que los archivos sin procesar se dejaron solos y bien. El problema era mi clase utilizada para la serialización con anotaciones para el serializador XML simple. Añadí instrucciones de registro a mi aplicación y encontré este error en la línea ofensiva: "Attribute 'id' no tiene una coincidencia en la clase com.xxx.ListViewItems en la línea 2". Esto me hizo darme cuenta de que la variable "id" privada estaba siendo ofuscada y no reconocida por el serializador Simple XML. Aquí está el código de ListViewItems.java:
@Attribute(required=false) private String id; // This was being obfuscated and thus unrecognizable!
Esto es lo que he añadido a Proguard para saltar completamente ofuscando una clase (probablemente hay una mejor manera):
# Ignore our XML Serialization classes -keep public class com.xxx.ListViewItems { public protected private *; }