appcompat-v7 v21.0.0 que causa un bloqueo en dispositivos Samsung con Android v4.2.2

79

Acabamos de cambiar nuestra aplicación para usar la appcompat-v7 supportbiblioteca a fin de aprovechar la barra de acciones de soporte y los temas de materiales de soporte. Usando v21.0.0 of appcompat-v7(y v21.0.0 of support-v4), ahora estamos viendo fallas Google Playy Crashlytics solo desde dispositivos Samsung, la runningbarra de . Here is the stack trace from Google Play and the app appears to crash as soon as theacción Android v4.2.2 se muestra y / o se invalida.

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
at android.support.v7.app.ActionBarActivityDelegateBase.initializePanelMenu(ActionBarActivityDelegateBase.java:991)
at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:1041)
at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1259)
at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:80)
at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:116)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)

Otros dispositivos y emuladores que ejecutan v4.2.2 no muestran este comportamiento. Tengo entendido que muchas aplicaciones de Google ya están usando esta nueva versión de appcompatpara mostrar la barra de acciones. Si estas aplicaciones no informan fallas en estos dispositivos, sería útil saber cómo se está evitando / solucionando esto.

Informé de esto como un error a Google, pero se cerró con el motivo de que es un problema de desarrollo. Aunque estoy de acuerdo en que este puede ser el caso, me pregunto si / cómo alguien puede usar appcompat-v7 v21.0.0y no bloquearse Samsung 4.2.2 devices.

Actualización: Parece que Google al menos está considerando posibles soluciones para esto. Vea esto para más detalles.

Erik Pedersen
fuente
Este puede ser un problema relacionado, pero parece ser una excepción ligeramente diferente. Una solución reciente publicada en la otra pregunta se relaciona con tener un control giratorio en la barra de acción y no tengo esa situación. Solo estoy usando elementos del menú.
Erik Pedersen
Tengo este problema también. La aplicación está en producción y recibe fallos de Samsung con 4.2.2. dispositivos
Martin Vandzura
1
Tampoco tengo un control giratorio en mi barra de acción y lo obtengo de dispositivos que no son Samsung que ejecutan Android 4.2.2: Qmobile I9 y Wiko (modelo desconocido).
Jürgen 'Kashban' Wahlmann
1
@Devashish: La solución proguard en la segunda respuesta funcionó para mí. Probé contra el dispositivo Samsung afectado con appthwack.com y después de aplicar la configuración de proguard no obtuve más errores.
Jürgen 'Kashban' Wahlmann

Respuestas:

15

Encontré la solución adecuada aquí: https://stackoverflow.com/a/26641388/1266123

Mediante el uso

-keep class !android.support.v7.internal.view.menu.**,android.support.v7.** {*;}

en vez de

-keep class android.support.v7.** {*;}
robUx4
fuente
1
Creo que puede ahorrar más espacio utilizando "-keepnames" en lugar de "-keep".
Justin
Como se señaló en la discusión de code.google.com/p/android/issues/detail?id=78377 , el uso de esta solución en particular podría causar problemas debido a las referencias de recursos dentro de la biblioteca appcompat. Sin embargo, esto ha funcionado para nuestra aplicación en particular, así que estoy marcando esta respuesta como aceptada.
Erik Pedersen
¿Dónde debo escribir esta línea?
Suceden errores
@BugsHappen, esto iría en su archivo de compilación de Gradle. Puede leer más sobre ProGuard aquí: developer.android.com/tools/help/proguard.html
Dick Lucas
7

Como # 150 de https://code.google.com/p/android/issues/detail?id=78377 dicho

Porque cuidado con -keep class! Android.support.v7.internal.view.menu. **. Hay una serie de clases allí a las que se hace referencia desde los recursos de appcompat.

La mejor solución es agregar las siguientes líneas en su lugar:

-keep class !android.support.v7.internal.view.menu.MenuBuilder, !android.support.v7.internal.view.menu.SubMenuBuilder, android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
Pongpat
fuente
En mis pruebas, basadas en una revisión del archivo de mapeo de proguard generado, esta configuración de proguard sugerida no da como resultado la ofuscación del nombre de clase de MenuBuilder, aunque ofusca SubMenuBuilder
Andy Dennie
Lo averigué; mira mi respuesta.
Andy Dennie
Hey Andy, tengo el mismo problema, MenuBuilder no está ofuscado pero otros sí, ¿te importaría decirme cómo lo resolviste? gracias
Qing
6

Dado que se eliminó Appcompat 23.1.1el .internalpaquete en el tarro de AppCompat.

Corrección actualizada usando proguard:

#FOR APPCOMPAT 23.1.1:
-keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { *; }
-keep interface android.support.v7.* { *; }
RWIL
fuente
1

Si alguien interesado en utilizar una solución sin progaurd.

Lea el enlace que probé en una de mis aplicaciones que dio la excepción en setSupportActionBar (barra de herramientas) en onCreate ().

Es bastante simple, solo agregue el bloque try catch alrededor de la llamada

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}
Ravi
fuente
0

Encontré el mismo problema en Tecno P9, pero después de usar las herramientas de compilación 24 y para mi biblioteca de soporte usé 24.2.0, se solucionó.

Ikechukwu Kalu
fuente
-2

Cambie la versión Compile Sdk de su proyecto a "API 18: (JellyBean)"

El valor predeterminado es "Lollipop".

Hasta ahora resolvió mi problema en Qmobile i9

PASOS

  1. Haga clic derecho en su proyecto y seleccione Abrir configuración del módulo (o presione F4)
  2. En la pestaña de propiedades Compiled Sdk Version
Jazib Hasan
fuente
-3

Reemplazar AppCompatActivity con actividad

Eso me ayudó.

Sachin Waghmare
fuente
Solución barata. Podría estar usando AppCompat porque quiere admitir API <11 o algo así. Esto romperá esa idea.
Sufian
Creo que tal vez sea una publicación lo suficientemente mala como para ser rechazada, si alguien está de acuerdo con la razón mencionada por Sufian. Pero no está tan mal para ser eliminado.
Gangnus
-3

Reemplazar

public class class_name extends AppCompatActivity
{

.........

}

Con

public class class_name extends Activity
{

.........

}

Eso me ayudó.

Sachin Waghmare
fuente
Deje de duplicar sus respuestas a esta misma pregunta.
Sufian