简体   繁体   English

启动带有proguard的签名版本APK时出现奇怪的NoClassDefFoundError错误

[英]Strange NoClassDefFoundError error when launching a signed release APK with proguard enabled

Some Things I have Tried: 我试过的一些事情:

  • Removing the Facebook Dependency makes the app not crash anymore but then it only shows a blank white screen. 删除Facebook依赖关系使应用程序不再崩溃,但它只显示一个空白的白色屏幕。 This is with proguard and multidex enabled. 这是通过proguard和multidex启用的。
  • Upgrading gradle to the latest version doesn't solve anything. 将gradle升级到最新版本并没有解决任何问题。 I upgraded to gradle 2.0.0-beta4 plugin and gradle 2.10.0. 我升级到gradle 2.0.0-beta4插件并且gradle 2.10.0。
  • Installing a previous version of Android Studio 1.5.1 did not solve anything. 安装以前版本的Android Studio 1.5.1并没有解决任何问题。
  • I have installed Java JDK 1.8 if this is a clue into anything. 我已经安装了Java JDK 1.8,如果这是任何事情的线索。 I can also post some logcat logs to see what is happening. 我还可以发布一些logcat日志来查看发生了什么。

I am using MultiDex support in my application with Proguard enabled. 我在启用了Proguard应用程序中使用MultiDex支持。

Everything works fine when I build a APK file WITHOUT proguard enabled and install that on my android phone (I have more than 8 phones so a phone is a non-issue). 当我在没有启动proguard的情况下构建一个APK文件时,一切正常,并在我的Android手机上安装(我有超过8部手机,所以手机不是问题)。

When I build a release APK WITH proguard enabled it crashes on app startup after i install the app. 当我构建一个版本APK WITH proguard启用它在安装应用程序后在应用程序启动时崩溃。

I get the following log messages: 我收到以下日志消息:

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>

And I see the following RuntimeException : 我看到以下RuntimeException

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.p.M(FacebookSdk.java:160)
                  at com.mycustomapp.app.utils.a.b.a.<init>(CustomFacebookManagerUtility.java:68)
                  at com.mycustomapp.app.utils.a.b.a.ct(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.p.M(FacebookSdk.java:160) 
                  at com.mycustomapp.app.utils.a.b.a.<init>(CustomFacebookManagerUtility.java:68) 
                  at com.mycustomapp.app.utils.a.b.a.ct(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

At a loss of what could be causing this issue, but through process of elimination Proguard seems to cause some issues. 不知道可能导致这个问题的原因,但通过消除Proguard过程似乎会引起一些问题。

I looked at the Facebook SDK docs, and they mentioned I don't need any specific proguard rules for their Facebook SDK. 我查看了Facebook SDK文档,他们提到我不需要为他们的Facebook SDK制定任何特定的proguard规则。

Anybody know how to solve this? 谁知道怎么解决这个问题?


EDIT: Adding in the app's build.gradle 编辑:添加应用程序的build.gradle

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'

}

Proguard Rules: Proguard规则:

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

WOW. 哇。 It was NewRelic and KeepAttributes that was causing issues, adding the following proguard rules solved the issue: 导致问题的是NewRelic和KeepAttributes,添加以下proguard规则解决了这个问题:

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

Maybe this is not the best answer but I hope it will help you. 也许这不是最好的答案,但我希望它会对你有所帮助。 as far as the facebook concern when enabling the proguard, yes in the documentation there are no rules for the facebook sdk. 至于facebook关注启用proguard时,是的,在文档中没有facebook sdk的规则。 NOTE : I'm using skd version 4.7.0 'com.facebook.android:facebook-android-sdk:4.7.0' . 注意:我使用的是skd版本'com.facebook.android:facebook-android-sdk:4.7.0' :4.7.0 'com.facebook.android:facebook-android-sdk:4.7.0' and I have implement this on my project and and got no problem in it. 我已经在我的项目上实现了这个并且没有任何问题。 and please try this on your project : 请在您的项目上试试这个:

  1. use buildToolsVersion "23" or latest version 23.0.2 使用buildToolsVersion“23”或最新版本23.0.2
  2. use thid below buildToolsVersion useLibrary 'org.apache.http.legacy' 使用下面的buildToolsVersion useLibrary'org.apache.http.legacy'
  3. try to change your root gradle in the dependencies classpath 'com.android.tools.build:gradle:1.3.1' and below I show you my proguard rules and my build.gradle. 尝试在依赖关系classpath 'com.android.tools.build:gradle:1.3.1'更改你的根gradle,并在下面向我展示我的proguard规则和我的build.gradle。

hope this can fix your problem. 希望这可以解决你的问题。

this is my rules : 这是我的规则:

-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

and this is my build.gradle : 这是我的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'

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android 当 proguard 启用发布 apk 时应用程序崩溃:NoClassDefFoundError:解析失败:Lorg/koin/core/context/GlobalContextKt; - Android app crashes when proguard enabled with release apk: NoClassDefFoundError: Failed resolution of: Lorg/koin/core/context/GlobalContextKt; 启用proguard时,版本apk中出现NoSuchMethodError - NoSuchMethodError in release apk when proguard is enabled 当我尝试在启用了Proguard的android应用中导出带签名的apk文件时遇到transformClassAndResourcWithProguardForRelease错误? - transformClassAndResourcWithProguardForRelease error when I try export signed apk file in android app with proguard enabled? 使用Proguard运行签名的APK时出错 - Error when running signed APK with Proguard 启用proguard后,生成的签名APK无法正常工作 - Generated signed APK doesn't work properly when proguard is enabled 使用Joda Time时,无法生成带有proguard的签名APK - Unable to generate signed APK with proguard enabled when Joda Time is used 生成签名apk for release的错误:Proguard配置 - Errors generating signed apk for release : Proguard config 导出带有ProGuard错误的签名APK - Export signed APK with ProGuard error 生成签名APK时Proguard规则出错 - Error for Proguard Rules while Generating Signed APK ProGuard尝试生成签名的APK时出错 - ProGuard error trying to generate signed apk
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM