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):
- No se puede acceder a jarfile ./lib/proguardgui.jar
- ¿Cómo funciona Proguard en Intellij Idea?
- Cómo configurar mi archivo proguard-project.txt para eliminar solo Logs
- Proguard-project.txt no se encuentra en android studio
- Configuración de ProGuard para Guava con obfuscación y optimizació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.
- Problema con ProGuard y RoboGuice con anotaciones de @Inject
- Falta el archivo proguard.cfg
- ProGuard para Android "java.lang.nosuchfielderror: Toast" excepción
- No se puede generar APK firmado en Android Studio, porque proguard-rules.txt está ausente
- Problemas al compilar la aplicación de Android en modo de liberación con proguard activado
- Android Build con Gradle y ProGuard: "El frasco de salida debe especificarse después de un tarro de entrada, o estará vacío"
- Google Analytics vuelve a consultar Proguard
- ¿Cuál es la diferencia entre proguard-android.txt y proguard-rules.pro? - Android
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.
- Cómo animar barras de herramientas superior e inferior (o cualquier otra vista) entrar / salir de la pantalla en desplazamiento en CoordinatorLayout?
- Android sin actividad getSharedPreferences