Proguard causa un accidente en los servicios de Google Play 'ActivityRecognitionResult getMostProbableActivity

Recientemente he lanzado una aplicación a la tienda de juegos, y aunque funciona perfectamente bien sin proguard, tengo un accidente inesperado cuando decidí usarlo.

He buscado aquí las reglas proguard recomendadas para los servicios de Google Play, también he intentado agregar otra línea para este caso. Esto es lo que tengo (la tercera línea es para mi aplicación):

-keep class * extends java.util.ListResourceBundle { protected Object[][] getContents(); } -keep class * implements com.google.android.gms.internal.ae -keep class * extends il.co.kix.minitasker.EntityBase 

Aquí está el informe del accidente después de hacer un retrace

 android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.google.android.gms.location.ActivityRecognitionResult at android.os.Parcel.readParcelable(Parcel.java:2086) at android.os.Parcel.readValue(Parcel.java:1965) at android.os.Parcel.readMapInternal(Parcel.java:2226) at android.os.Bundle.unparcel(Bundle.java:223) at android.os.Bundle.containsKey(Bundle.java:271) at android.content.Intent.hasExtra(Intent.java:4116) at com.google.android.gms.location.ActivityRecognitionResult.boolean hasResult(android.content.Intent)(Unknown Source) com.google.android.gms.location.DetectedActivity getMostProbableActivity() at il.co.kix.minitasker.ActivityRecognitionIntentService.void onHandleIntent(android.content.Intent)(Unknown Source) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.os.HandlerThread.run(HandlerThread.java:60) 

Las líneas ofensivas de código probablemente son:

 ... @Override protected void onHandleIntent(Intent intent) { if (ActivityRecognitionResult.hasResult(intent)) { ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); DetectedActivity mostProbableActivity = result.getMostProbableActivity(); ... 

¿Puede alguien ayudar con una regla para agregar? No quiero deshabilitarlo todo, pero sí soluciona el problema.

El tiempo de ejecución de Android accede a estos campos CREADOR mediante la reflexión, que es generalmente imposible de detectar mediante el análisis estático. Por lo tanto, necesitas decirle a ProGuard que los guarde:

 -keepclassmembers class * implements android.os.Parcelable { static ** CREATOR; } 

Esto no parece ser un ajuste estándar en android-sdk/tools/proguard/proguard-android.txt , pero probablemente debería ser.

Este problema me volvió loco. Proguard está eliminando clases internas que no se importan explícitamente. Aún peor, este problema no existía para mí (después de usar Proguard), entonces un día de repente apareció después de algunos pequeños cambios de código.

He añadido una serie de banderas Proguard para solucionar el problema. Al final, no estoy seguro de cuál hizo el truco:

Definitivamente agregue estos tres:

 -keep class android.os.Parcelable.Creator -keep class com.google.android.gms.location.ActivityRecognitionResult -keep class com.google.android.gms.** {*;} 

También puede probar:

 -dontshrink -dontoptimize 

en la cima

Honestamente es un problema de tipo dependencia-andador y Proguard debería ser mejor que esto, pero finalmente lo arreglé como arriba.

  • Progaurd issue "Advertencia: Ignorar el atributo InnerClasses para una clase interna anónima"
  • Problemas con la ofuscación del proyecto de la biblioteca de Android con Proguard
  • La ejecución falló para la tarea ': app: transformClassesAndResourcesWithProguardForRelease
  • Proguard mientras que la biblioteca Butterknife y otras advertencias
  • Dile a Proguard que mantenga la anotación en los métodos
  • Obfuscating ActionBarSherlock con Proguard
  • Implementación de Proguard Security con mi APK
  • Proguard: Excluir proyecto de biblioteca en Android
  • Field.getGenericType () devuelve la instancia de java.lang.Class en lugar de Type
  • Eliminación de cadenas no utilizadas durante la optimización de ProGuard
  • Proguard no funciona cuando se exporta con el complemento Eclipse ADT R19
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.