Proguard de Android – ClassNotFoundException
He habilitado proguard para mi aplicación Android. Puedo construir el proyecto con éxito, pero se bloquea en el inicio con classNotFoundException. Ni siquiera encuentra la actividad del lanzador. Aquí está mi archivo proguard rules
-libraryjars libs -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keepnames class com.mypackage.** { *; } //someone suggested this but doesn't work # We only want obfuscation -keepattributes InnerClasses,Signature # Sdk -keep public interface com.zendesk.sdk.** { *; } -keep public class com.zendesk.sdk.** { *; } # Appcompat and support -keep interface android.support.v7.** { *; } -keep class android.support.v7.** { *; } -keep interface android.support.v4.** { *; } -keep class android.support.v4.** { *; } # Gson -keep interface com.google.gson.** { *; } -keep class com.google.gson.** { *; } # Retrofit #-keep class com.google.inject.** { *; } #-keep class org.apache.http.** { *; } #-keep class org.apache.james.mime4j.** { *; } #-keep class javax.inject.** { *; } #-keep class retrofit.** { *; } #-keep interface retrofit.** { *; } # Retrofit -keep class com.squareup.okhttp.** { *; } -keep interface com.squareup.okhttp.** { *; } -dontwarn com.squareup.okhttp.** -dontwarn rx.** -dontwarn retrofit.** -dontwarn okio.** -keep class retrofit.** { *; } -keepclasseswithmembers class * { @retrofit.http.* <methods>; } # Jackson -keepattributes *Annotation*,EnclosingMethod,Signature -keepnames class com.fasterxml.jackson.** { *; } -dontwarn com.fasterxml.jackson.databind.** -keep class org.codehaus.** { *; } -keepclassmembers public final enum org.codehaus.jackson.annotate.JsonAutoDetect$Visibility { public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; } -keep public class your.class.** { public void set*(***); public *** get*(); } #Picasso -dontwarn com.squareup.okhttp.** #-dontwarn javax.management.** #-dontwarn java.lang.management.** #-dontwarn org.apache.log4j.** #-dontwarn org.apache.commons.logging.** #-dontwarn org.json.* #-dontwarn org.apache.commons.codec.binary.Base64 #-keep class javax.** {* ; } #-keep class org.** { *; } -dontwarn org.mortbay.** -dontwarn org.slf4j.** -dontwarn org.apache.log4j.** -dontwarn org.apache.commons.logging.** -dontwarn org.apache.commons.codec.binary.**
y aquí está mi archivo build.gradle si eso ayuda, pero no incluye todas las dependencias. Tengo algunos frascos en la carpeta de las librerías también.
- Ofuscación de los archivos .aar
- Aplicaciones se bloquea después de la ofuscación con ProGuard
- Android - Errores de entrada de zip de Proguard duplicados - Biblioteca de soporte de Android
- Obfuscate campos privados con ProGuard
- Uso de GSON con proguard habilitado
apply plugin: 'com.android.application' apply plugin: 'robolectric' apply plugin: 'android' apply plugin: 'newrelic' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.mypackage" minSdkVersion 14 targetSdkVersion 21 versionCode 54 versionName "2.002" multiDexEnabled true testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner" resConfigs "en", "fr" , "ar" } buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { androidTest { setRoot('src/test') } } dexOptions { javaMaxHeapSize "4g" } lintOptions { checkReleaseBuilds false // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when errors are found: abortOnError false } repositories{ maven { url 'https://zendesk.artifactoryonline.com/zendesk/repo' } } repositories { mavenCentral() } dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile 'com.android.support:appcompat-v7:21.+' compile 'com.github.chrisbanes.photoview:library:1.2.3' compile 'com.etsy.android.grid:library:1.0.5' compile 'com.facebook.android:facebook-android-sdk:3.21.1' compile 'com.google.android.gms:play-services-base:6.5.+' compile 'com.google.android.gms:play-services-wallet:6.5.+' compile 'com.google.android.gms:play-services-ads:6.5.+' compile 'com.google.android.gms:play-services-maps:6.5.+' compile 'com.google.android.gms:play-services-drive:6.5.+' compile 'com.google.android.gms:play-services-appindexing:6.5.+' compile 'com.google.android.gms:play-services-location:6.5.+' compile 'com.google.android.gms:play-services-identity:6.5.+' compile 'com.google.android.gms:play-services-plus:6.5.+' compile 'com.android.support:multidex:1.0.+' compile project(':Adjust') compile project(':aFileChooser-cbccac1d1cb74a6d57d25c5ded61e4bf4fc40c91') compile 'com.parse.bolts:bolts-android:1.+' compile 'com.squareup.picasso:picasso:2.4.0' compile 'com.android.support:recyclerview-v7:+' compile (group: 'com.zendesk', name: 'sdk', version: '1.0.0.1'){ // exclude group:'picasso' } compile 'com.android.support:recyclerview-v7:+' compile 'com.newrelic.agent.android:android-agent:4.+' compile 'com.fasterxml.jackson.core:jackson-databind:2.4.2' compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.2' compile 'com.fasterxml.jackson.core:jackson-core:2.4.2' /*compile ('oauth.signpost:signpost-commonshttp4:1.2.1.2') { exclude module: 'commons-logging' exclude module: 'httpcore' exclude module: 'httpclient' } compile ('oauth.signpost:signpost-core:1.2.1.2') { exclude module: 'commons-codec' }*/ androidTestCompile 'org.robolectric:robolectric:2.4' androidTestCompile('junit:junit:4.12') androidTestCompile('org.mockito:mockito-core:1.10.19') } packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/ASL2.0' exclude 'LICENSE.txt' } } robolectric { include '**/*Test.class' }
Aquí está el rastro completo de la pila:
02-17 19:01:09.752: E/AndroidRuntime(2079): FATAL EXCEPTION: main 02-17 19:01:09.752: E/AndroidRuntime(2079): Process: com.mypackage, PID: 2079 02-17 19:01:09.752: E/AndroidRuntime(2079): java.lang.NoClassDefFoundError: Failed resolution of: Lcom/mypackage/activities/MainActivity; 02-17 19:01:09.752: E/AndroidRuntime(2079): at cmypackage.application.ApplicationContextProvider.onCreate(Unknown Source) 02-17 19:01:09.752: E/AndroidRuntime(2079): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011) 02-17 19:01:09.752: E/AndroidRuntime(2079): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4518) 02-17 19:01:09.752: E/AndroidRuntime(2079): at android.app.ActivityThread.access$1500(ActivityThread.java:144) 02-17 19:01:09.752: E/AndroidRuntime(2079): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1339) 02-17 19:01:09.752: E/AndroidRuntime(2079): at android.os.Handler.dispatchMessage(Handler.java:102) 02-17 19:01:09.752: E/AndroidRuntime(2079): at android.os.Looper.loop(Looper.java:135) 02-17 19:01:09.752: E/AndroidRuntime(2079): at android.app.ActivityThread.main(ActivityThread.java:5221) 02-17 19:01:09.752: E/AndroidRuntime(2079): at java.lang.reflect.Method.invoke(Native Method) 02-17 19:01:09.752: E/AndroidRuntime(2079): at java.lang.reflect.Method.invoke(Method.java:372) 02-17 19:01:09.752: E/AndroidRuntime(2079): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 02-17 19:01:09.752: E/AndroidRuntime(2079): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 02-17 19:01:09.752: E/AndroidRuntime(2079): Caused by: java.lang.ClassNotFoundException: Didn't find class "mypackage.activities.MainActivity" on path: DexPathList[[zip file "/data/app/mypackage-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 02-17 19:01:09.752: E/AndroidRuntime(2079): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 02-17 19:01:09.752: E/AndroidRuntime(2079): at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 02-17 19:01:09.752: E/AndroidRuntime(2079): at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 02-17 19:01:09.752: E/AndroidRuntime(2079): ... 12 more 02-17 19:01:09.752: E/AndroidRuntime(2079): Suppressed: java.lang.NoClassDefFoundError: mypackage.activities.MainActivity 02-17 19:01:09.752: E/AndroidRuntime(2079): at dalvik.system.DexFile.defineClassNative(Native Method) 02-17 19:01:09.752: E/AndroidRuntime(2079): at dalvik.system.DexFile.defineClass(DexFile.java:226) 02-17 19:01:09.752: E/AndroidRuntime(2079): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219) 02-17 19:01:09.752: E/AndroidRuntime(2079): at dalvik.system.DexPathList.findClass(DexPathList.java:321) 02-17 19:01:09.752: E/AndroidRuntime(2079): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54) 02-17 19:01:09.752: E/AndroidRuntime(2079): ... 14 more 02-17 19:01:09.752: E/AndroidRuntime(2079): Suppressed: java.lang.ClassNotFoundException: mypackage.MainActivity 02-17 19:01:09.752: E/AndroidRuntime(2079): at java.lang.Class.classForName(Native Method) 02-17 19:01:09.752: E/AndroidRuntime(2079): at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 02-17 19:01:09.752: E/AndroidRuntime(2079): at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 02-17 19:01:09.752: E/AndroidRuntime(2079): at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 02-17 19:01:09.752: E/AndroidRuntime(2079): ... 13 more 02-17 19:01:09.752: E/AndroidRuntime(2079): Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
Editar: A continuación se muestra la parte que falta en el stacktrace.
02-17 19:01:09.749: I/MultiDex(2079): VM with version 2.1.0 has multidex support 02-17 19:01:09.749: I/MultiDex(2079): install 02-17 19:01:09.749: I/MultiDex(2079): VM has multidex support, MultiDex support library is disabled. 02-17 19:01:09.750: I/art(2079): Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.FragmentActivity> 02-17 19:01:09.750: I/art(2079): Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.FragmentActivity> 02-17 19:01:09.751: I/art(2079): Rejecting re-init on previously-failed class java.lang.Class<mypackage.activities.MainActivity> 02-17 19:01:09.751: I/art(2079): Rejecting re-init on previously-failed class java.lang.Class<mypackage.activities.MainActivity> 02-17 19:01:09.751: D/AndroidRuntime(2079): Shutting down VM 02-17 19:01:09.751: D/AndroidRuntime(2079): --------- beginning of crash
- Ofuscando múltiples módulos con el estudio de Android
- Cómo ofuscar con ProGuard pero mantener los nombres legibles durante la prueba?
- Manejo de errores personalizados con Retrofit cuando se ofusca usando proguard da java.lang.reflect.UndeclaredThrowableException
- Proguard: ignorar los errores proguard de la biblioteca
- Cómo cambiar el nombre del archivo mapping proguard en gradle para el proyecto de Android
- ofuscación androide Proguard con twitter4j
También querrá asegurarse de agregar las excepciones proguard New Relic que se encuentran aquí: https://docs.newrelic.com/docs/mobile-monitoring/mobile-monitoring-installation/android/installing-android-apps-gradle -android-studio #proguard
-keep class com.newrelic.** { *; } -dontwarn com.newrelic.** -keepattributes Exceptions, Signature, InnerClasses
Eliminar las reglas de obfuscation relacionadas con la actividad y todos los relacionados con el apoyo libaries.Android estudio por defecto tiene esas plantillas.Puede habilitarlos mediante la adición de esta regla en su gradle
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt') } }
También edite la regla para el procesador Jackson
-keep public class your.class.** { public void set*(***); public *** get*(); }
En esta su clase. ** es la clase POJO (getter / setter) que ha creado para analizar su respuesta