Échec étrange NoClassDefFoundError lors du lancement d'une version signée APK avec proguard activé

Quelques choses que j'ai essayé:

  • En supprimant la dépendance de Facebook, l'application ne bloque plus, mais elle affiche uniquement un écran blanc vierge. C'est avec proguard et multidex activé.
  • Mettre à niveau Gradle vers la dernière version ne résout rien. J'ai mis à niveau vers gradle 2.0.0-beta4 plugin et gradle 2.10.0.
  • L'installation d'une version précédente d'Android Studio 1.5.1 n'a résolu aucun problème.
  • J'ai installé Java JDK 1.8 s'il s'agit d'un indice de quoi que ce soit. Je peux également publier des journaux Logcat pour voir ce qui se passe.

J'utilise MultiDex support dans mon application avec Proguard activé.

Tout fonctionne bien lorsque je crée un fichier APK SANS PROTEGER activé et que je l'installe sur mon téléphone Android (j'ai plus de 8 téléphones, donc un téléphone est sans problème).

  • Comment afficher un PDF via un navigateur internet Android sans avoir à "télécharger" d'abord
  • Android proguard, garde la classe intérieure
  • Poussez l'activité vers la droite lorsque le tiroir ouvert
  • Comment vérifier si une activité est activée?
  • Android: mise à jour des problèmes sur Android SDK Tools, révision 7
  • Le hash de la clé ne correspond pas tant que le login de Facebook dans Android
  • Lorsque je crée une version APK WITH proguard activé, il se bloque le démarrage de l'application après l'installation de l'application.

    Je reçois les messages de journal suivants:

     I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.n> I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.n> I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.o> I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.o> I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.r> I/art: Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.r> I/art: Rejecting re-init on previously-failed class java.lang.Class<com.facebook.FacebookActivity> I/art: Rejecting re-init on previously-failed class java.lang.Class<com.facebook.FacebookActivity> 

    Et je vois la RuntimeException suivante:

     E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mycustomapp.app, PID: 6814 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/facebook/FacebookActivity; at com.facebook.b.aa.c(Validate.java:175) at com.facebook.pM(FacebookSdk.java:160) at com.mycustomapp.app.utils.aba<init>(CustomFacebookManagerUtility.java:68) at com.mycustomapp.app.utils.abact(CustomFacebookManagerUtility.java:54) at com.mycustomapp.app.utils.application.MyCustomApplication.onCreate(MyCustomApplication.java:84) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1021) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5990) at android.app.ActivityThread.access$1700(ActivityThread.java:205) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1756) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:6895) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.facebook.FacebookActivity" on path: DexPathList[[zip file "/data/app/com.mycustomapp.app-1/base.apk"],nativeLibraryDirectories=[/data/app/com.mycustomapp.app-1/lib/arm, /vendor/lib, /system/lib]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) at com.facebook.b.aa.c(Validate.java:175) at com.facebook.pM(FacebookSdk.java:160) at com.mycustomapp.app.utils.aba<init>(CustomFacebookManagerUtility.java:68) at com.mycustomapp.app.utils.abact(CustomFacebookManagerUtility.java:54) at com.mycustomapp.app.utils.application.MyCustomApplication.onCreate(MyCustomApplication.java:84) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1021) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5990) at android.app.ActivityThread.access$1700(ActivityThread.java:205) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1756) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:6895) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) Suppressed: java.lang.NoClassDefFoundError: com.facebook.FacebookActivity at dalvik.system.DexFile.defineClassNative(Native Method) at dalvik.system.DexFile.defineClass(DexFile.java:226) at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219) at dalvik.system.DexPathList.findClass(DexPathList.java:321) at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54) ... 18 more Suppressed: java.lang.ClassNotFoundException: com.facebook.FacebookActivity at java.lang.Class.classForName(Native Method) at java.lang.BootClassLoader.findClass(ClassLoader.java:781) at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) at java.lang.ClassLoader.loadClass(ClassLoader.java:504) ... 17 more Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available 

    À perte de ce qui pourrait causer cette question, mais par un processus d'élimination, Proguard semble causer des problèmes.

    J'ai regardé les docs de SDK de Facebook, et ils ont mentionné que je n'ai pas besoin de règles de proguard spécifiques pour leur SDK de Facebook.

    Quelqu'un sait-il comment résoudre ce problème?


    EDIT: Ajout du build.gradle l'application

     buildscript { repositories { mavenCentral() maven { url 'https://maven.fabric.io/public' } } dependencies { classpath 'io.fabric.tools:gradle:1.+' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath "com.newrelic.agent.android:agent-gradle-plugin:5.4.0" } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' apply plugin: 'com.neenbedankt.android-apt' apply plugin: 'newrelic' repositories { maven { url 'https://maven.fabric.io/public' } } android { compileSdkVersion 23 buildToolsVersion "22.0.1" packagingOptions { exclude 'META-INF/services/javax.annotation.processing.Processor' exclude '.readme' exclude 'LICENSE.txt' exclude 'README.txt' exclude 'META-INF/notice.txt' exclude 'META-INF/license.txt' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/MANIFEST.MF' } defaultConfig { applicationId "com.mycustomapp.app" minSdkVersion 15 targetSdkVersion 23 versionCode 3 versionName "1.2" /** * Enabling multidex support. */ multiDexEnabled true } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile files('libs/gcm.jar') /** * For MultiDex Support */ compile 'com.android.support:multidex:1.0.1' /** * android support/compatibility libraries. */ compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:recyclerview-v7:23.1.1' compile 'com.android.support:support-v4:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.nineoldandroids:library:2.4.0' compile 'com.android.support:cardview-v7:23.1.1' compile 'com.android.support:palette-v7:23.1.1' compile 'com.google.android.gms:play-services-gcm:8.3.0' /** * facebook sdk */ compile 'com.facebook.android:facebook-android-sdk:4.1.0' compile 'com.squareup.okhttp:okhttp:2.2.0' compile 'com.squareup.okio:okio:1.1.0' compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'com.mcxiaoke.volley:library-aar:1.0.0' compile 'com.jakewharton:butterknife:7.0.1' compile 'com.github.bumptech.glide:glide:3.6.1' compile 'com.jakewharton:disklrucache:2.0.2' compile('com.crashlytics.sdk.android:crashlytics:2.5.2@aar') { transitive = true; } compile 'com.amplitude:android-sdk:2.2.0' compile 'com.appboy:android-sdk-ui:1.11.+' compile 'joda-time:joda-time:2.3' compile 'com.facebook.conceal:conceal:1.0.1@aar' compile 'com.newrelic.agent.android:android-agent:5.4.0' } 

    Règles du Procureur:

     # Obfuscation parameters: #-dontobfuscate -useuniqueclassmembernames -keepattributes SourceFile,LineNumberTable -allowaccessmodification # Ignore warnings: #-dontwarn org.mockito.** #-dontwarn org.junit.** #-dontwarn com.robotium.** # Glide -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # Crashlytics -keep class com.crashlytics.** { *; } -keep class com.crashlytics.android.** # Ignore warnings: We are not using DOM model -dontwarn com.fasterxml.jackson.databind.ext.DOMSerializer # Ignore warnings: https://github.com/square/okhttp/wiki/FAQs -dontwarn com.squareup.okhttp.internal.huc.** # Ignore warnings: https://github.com/square/okio/issues/60 -dontwarn okio.** # Ignore warnings: https://github.com/square/retrofit/issues/435 -dontwarn com.google.appengine.api.urlfetch.** # Keep GSON stuff -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.** { *; } # Keep Jackson stuff -keep class org.codehaus.** { *; } -keep class com.fasterxml.jackson.annotation.** { *; } # Butterknife -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; } # Keep these for GSON and Jackson -keepattributes Signature -keepattributes *Annotation* -keepattributes EnclosingMethod # Retrofit 1.X -keep class com.squareup.okhttp.** { *; } -keep class retrofit.** { *; } -keep interface com.squareup.okhttp.** { *; } -dontwarn com.squareup.okhttp.** -dontwarn okio.** -dontwarn retrofit.** -dontwarn rx.** -keepclasseswithmembers class * { @retrofit.http.* <methods>; } # If in your rest service interface you use methods with Callback argument. -keepattributes Exceptions # If your rest service methods throw custom exceptions, because you've defined an ErrorHandler. -keepattributes Signature # Joda Time -dontwarn org.joda.convert.** -dontwarn org.joda.time.** -keep class org.joda.time.** { *; } -keep interface org.joda.time.** { *; } # Keep Picasso -keep class com.squareup.picasso.** { *; } -keepclasseswithmembers class * { @com.squareup.picasso.** *; } -keepclassmembers class * { @com.squareup.picasso.** *; } # RenderScript -keep class android.support.v8.renderscript.** { *; } # DBFlow -keep class com.raizlabs.android.dbflow.config.GeneratedDatabaseHolder # AppBoy -dontwarn com.amazon.device.messaging.** -dontwarn bo.app.** -dontwarn com.appboy.ui.** -dontwarn com.google.android.gms.** -keep class bo.app.** { *; } -keep class com.appboy.** { *; } # Android Volley # see: http://stackoverflow.com/questions/21816643/volley-seems-not-working-after-proguard-obfuscate -keep class org.apache.commons.logging.** { *; } 

    2 Solutions collect form web for “Échec étrange NoClassDefFoundError lors du lancement d'une version signée APK avec proguard activé”

    SENSATIONNEL. Il s'agissait de NewRelic et KeepAttributes qui causait des problèmes, ajoutant que les règles de proguard suivantes ont résolu le problème:

     # New Relic -keep class com.newrelic.** { *; } -dontwarn com.newrelic.** -keepattributes Exceptions, Signature, InnerClasses 

    Peut-être que ce n'est pas la meilleure réponse, mais j'espère que cela vous aidera. En ce qui concerne les préoccupations de Facebook lors de la validation du proguard, oui dans la documentation, il n'y a pas de règles pour le sdk de Facebook. REMARQUE: J'utilise la version 4.7.0 'com.facebook.android:facebook-android-sdk:4.7.0' . Et je l'ai mis en œuvre dans mon projet et je n'ai eu aucun problème. Et essayez ceci sur votre projet:

    1. Utilisez buildToolsVersion "23" ou dernière version 23.0.2
    2. Utilisez ce qui suit buildToolsVersion useLibrary 'org.apache.http.legacy'
    3. Essayez de modifier votre domaine secondaire dans le classpath 'com.android.tools.build:gradle:1.3.1' dépendances classpath 'com.android.tools.build:gradle:1.3.1' et ci-dessous, je vous présente mes règles de proguard et mon build.gradle.

    J'espère que cela peut résoudre votre problème.

    Ce sont mes règles:

     -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } -keepclasseswithmembernames class * { @butterknife.* <fields>; } -keepclasseswithmembernames class * { @butterknife.* <methods>; } -dontwarn com.squareup.okhttp.** # # Twitter library - start # -dontwarn twitter4j.** -keep class twitter4j.** { *; } # # Twitter library - end # # adcolony start -dontwarn com.immersion.** -dontnote com.immersion.** -dontwarn android.webkit.** #adcolony end #app billing -keep class com.android.vending.billing.** #end app billing 

    Et c'est mon build.gradle:

     apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23" useLibrary 'org.apache.http.legacy' defaultConfig { applicationId "antiboring.game" minSdkVersion 16 targetSdkVersion 23 versionCode 11 versionName "1.9.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } packagingOptions { exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' exclude 'META-INF/LICENSE' exclude 'META-INF/services/javax.annotation.processing.Processor' } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } sourceSets { androidTest { java.srcDirs = ['androidTest/java'] } main { java.srcDirs = ['src/main/java', 'src/androidTest/java'] } } lintOptions { disable 'InvalidPackage' } } repositories { mavenCentral() } dependencies { // App dependencies compile 'com.android.support:support-annotations:23.1.1' compile 'com.google.guava:guava:18.0' //unit testing androidTestCompile 'com.android.support:support-annotations:23.1.1' androidTestCompile 'com.android.support.test:runner:0.4.1' androidTestCompile 'com.android.support.test:rules:0.4.1' //apps library compile files('libs/twitter4j-core-4.0.2.jar') compile fileTree(dir: 'libs', include: ['adcolony.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:recyclerview-v7:23.1.1' compile 'com.android.support:palette-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.balysv.materialmenu:material-menu-toolbar:1.5.4' compile 'com.google.android.gms:play-services-ads:8.4.0' compile 'com.jakewharton:butterknife:7.0.1' compile 'com.squareup.picasso:picasso:2.5.2' //social media compile 'com.facebook.android:facebook-android-sdk:4.7.0' //animation compile 'com.nineoldandroids:library:2.4.0' compile 'com.daimajia.easing:library:1.0.1@aar' compile 'com.daimajia.androidanimations:library:1.1.3@aar' } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.