使用proguard后com.facebook.FacebookContentProvider的java.lang.NoClassDefFoundError应用程序崩溃
我的应用程序有facebook登录和facebook共享。我已经按照facebook android SDK文档中的规定配置了清单文件 应用程序在发布和调试模式下正常工作 在我使用“minifyEnabled true”创建发布APK后,应用程序在启动时崩溃,日志如下:使用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
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")
}
}