appcompat-v7 v21.0.0 provoca bloqueo en dispositivos Samsung con Android v4.2.2
proguard android-appcompat (9)
Acabamos de cambiar nuestra aplicación para usar la biblioteca de
appcompat-v7 support
para aprovechar la barra de acción de soporte y los temas de material de soporte.
Al usar
v21.0.0 of appcompat-v7
(y
v21.0.0 of support-v4)
, ahora vemos bloqueos en
Google Play
y Crashlytics solo en dispositivos Samsung
running
Android v4.2.2
. Here is the stack trace from Google Play and the app appears to crash as soon as the
. Here is the stack trace from Google Play and the app appears to crash as soon as the
se muestra o invalida
. Here is the stack trace from Google Play and the app appears to crash as soon as the
barra de acción`.
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 exhiben este comportamiento.
Tengo entendido que muchas aplicaciones de Google ya están utilizando esta nueva versión de
appcompat
para mostrar la barra de acción.
Si estas aplicaciones no informan fallas en estos dispositivos, sería útil saber cómo se está evitando / solucionando esto.
Informé esto como un error a Google, pero se cerró con la razón de que es un problema de desarrollo.
Aunque estoy de acuerdo en que este puede ser el caso, me pregunto si alguien puede usar
appcompat-v7 v21.0.0
y
appcompat-v7 v21.0.0
no se bloquea en los
Samsung 4.2.2 devices
.
Actualización: Parece que Google al menos está considerando posibles soluciones para esto. Vea this para más detalles.
Cambie la versión Compile Sdk de su proyecto a "API 18: (JellyBean)"
El valor predeterminado se establece en "Lollipop"
Hasta ahora resolvió mi problema en Qmobile i9
PASOS
- Haga clic derecho en su proyecto y seleccione Abrir configuración del módulo (o presione F4)
- En la pestaña de propiedades Versión compilada de SDK
Como decía el número 150 de this
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.** { *; }
Desde
Appcompat 23.1.1
.internal
paquete .internal del AppCompat jar.
Arreglo actualizado usando proguard:
#FOR APPCOMPAT 23.1.1:
-keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { *; }
-keep interface android.support.v7.* { *; }
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ó.
Encontré la solución adecuada aquí: https://.com/a/26641388/1266123
Mediante el uso
-keep class !android.support.v7.internal.view.menu.**,android.support.v7.** {*;}
en lugar de
-keep class android.support.v7.** {*;}
Para todos los que tienen este problema, solo la solución alternativa hasta ahora parece estar usando proguard. Discusión de pago en https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78377
Reemplace AppCompatActivity con actividad
Esto me ayudo.
Reemplazar
public class class_name extends AppCompatActivity
{
.........
}
Con
public class class_name extends Activity
{
.........
}
Esto me ayudo.
Si alguien está interesado en usar una solución sin progaurd.
Lea el link he intentado esto en una de mis aplicaciones que dio la excepción en setSupportActionBar (barra de herramientas) en onCreate ().
Es bastante simple, solo agregue try catch block alrededor de la llamada
try {
setSupportActionBar(toolbar);
} catch (Throwable t) {
// WTF SAMSUNG!
}