Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用proguard后com.facebook.FacebookContentProvider的java.lang.NoClassDefFoundError应用程序崩溃_Java_Android_Proguard_Dexprotector - Fatal编程技术网

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

使用proguard后com.facebook.FacebookContentProvider的java.lang.NoClassDefFoundError应用程序崩溃,java,android,proguard,dexprotector,Java,Android,Proguard,Dexprotector,我的应用程序有facebook登录和facebook共享。我已经按照facebook android SDK文档中的规定配置了清单文件 应用程序在发布和调试模式下正常工作 在我使用“minifyEnabled true”创建发布APK后,应用程序在启动时崩溃,日志如下: java.lang.RuntimeException: Unable to get provider com.facebook.FacebookContentProvider: java.lang.ClassNotFoundEx

我的应用程序有facebook登录和facebook共享。我已经按照facebook android SDK文档中的规定配置了清单文件

应用程序在发布和调试模式下正常工作

在我使用“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机器上创建的APK以及mac在启动时崩溃。在linux环境中进行构建时,我没有更改任何代码

PS:我尝试了Dex protector和我在禁用proguard的情况下创建的模糊版本apk。dexprotector创建的APK工作正常

-keep        class com.facebook.** { *; }
在proguard配置中包含上面的行

tldr

如果只将“-ignorewarnings”作为proguard的唯一配置指令,那么不要使用它


如果你想学习proguard/android,那么就用谷歌搜索一些示例配置文件,用谷歌搜索一些关于如何在android/proguard中的库项目中保留接口def和公共类的用法

对于我来说,将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文件中找到,请确保在项目根目录的build.gradle中添加gradle插件依赖项(并使用Nikita所说的1.5),而不是在android客户端文件夹的build.gradle中。这为我解决了问题。

在我的情况下,将
proguard android optimize.txt
更改为
proguard android.txt
确实有效

尝试:


我不知道为什么,但有一次dexprotector支持人员告诉我要更改它,因为在使用r8和proguard优化文件时存在一个已知的bug,所以我尝试了一下,结果成功了。没有更多详细信息,抱歉:(

发布proguard配置文件proguard-rules.pro当前仅包含-ignorewarnings。这是gradle提供的文件。该文件尝试了上述配置,但仍然崩溃。
buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            ext.set("dexprotector.configFile", "${projectDir}/dexprotector.xml")
        }
    }