android proguard appcompat android-appcompat samsung-mobile android-4.2-jelly-bean

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

  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 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.** {*;}



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! }