使用proguard后,应用程序崩溃了java.lang.NoClassDefFoundError for com.facebook.FacebookContentProvider

时间:2015-11-28 14:42:01

标签: java android proguard android-proguard

我的应用有facebook登录和facebook分享。我已经按照facebook android SDK文档中的说明配置了我的清单文件。

App在发布和调试模式下正常运行。

使用'minifyEnabled true'创建发布APK后,应用程序在启动时崩溃并显示以下日志:

java.lang.RuntimeException: Unable to get provider com.facebook.FacebookContentProvider: java.lang.ClassNotFoundException: Didn't find class "com.facebook.FacebookContentProvider" on path: DexPathList[[zip file "/data/app/com.pocketium.trollmonkey-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at android.app.ActivityThread.installProvider(ActivityThread.java:5087)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4679)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4619)
at android.app.ActivityThread.access$1500(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1378)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
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:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.facebook.FacebookContentProvider" on path: DexPathList[[zip file "/data/app/com.pocketium.trollmonkey-1/base.apk"],nativeLibraryDirectories=[/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 android.app.ActivityThread.installProvider(ActivityThread.java:5072)
... 11 more
Suppressed: java.lang.ClassNotFoundException: com.facebook.FacebookContentProvider
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)
... 13 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

我尝试禁用收缩和优化,并添加了保留选项来保持Facebook类,但应用程序仍然崩溃。我是android的新手。在谷歌搜索了很多,但找不到解决方案。

更新2015年12月1日

我尝试在linux中启用proguard创建发布APK。在我的linux机器上创建apk时没有问题。但是我在Windows机器上创建的apks以及mac在启动时崩溃了。在linux环境中构建时我没有更改任何代码。

PS:我尝试过使用proguard禁用创建的Dex protector和模糊释放apk。 APK由dexprotector创建,工作正常。

4 个答案:

答案 0 :(得分:2)

我将gradle插件更新为1.5.0并重建修复问题:

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        ...
    }
}

我的facebook-sdk版本为4.8.1

Gradle版本为2.7。可以在 gradle-wrapper.properties 文件

中找到

答案 1 :(得分:1)

确保在项目根目录中的build.gradle中添加gradle插件依赖项(并使用像Nikita所说的1.5),而不是在android-client文件夹中的build.gradle中。这解决了我的问题。

答案 2 :(得分:0)

-keep        class com.facebook.** { *; }

在proguard配置中包含上面的行。

tldr;

如果你只想包括" -ignorewarnings"作为proguard唯一的config指令,然后不要使用它。

如果你想学习proguard / android然后谷歌一些示例配置文件和谷歌一些关于如何保留android / proguard中的库项目的界面defs和公共类的用法。

答案 3 :(得分:0)

就我而言,将proguard-android-optimize.txt更改为proguard-android.txt确实可行。

尝试:

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            ext.set("dexprotector.configFile", "${projectDir}/dexprotector.xml")
        }
    }

我不确定为什么,但是很久以前dexprotector支持告诉我更改它,因为使用r8和proguard优化文件存在一个已知的错误,因此我尝试并成功了。没有更多详细信息,对不起:(