【问题标题】:App crashing with java.lang.NoClassDefFoundError for com.facebook.FacebookContentProvider after using proguard使用 proguard 后,应用程序因 com.facebook.FacebookContentProvider 的 java.lang.NoClassDefFoundError 而崩溃
【发布时间】:2015-11-28 14:42:01
【问题描述】:

我的应用有 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 类,但应用程序仍然崩溃。我是安卓新手。在google上搜索了很多,但找不到解决方案。

2015 年 12 月 1 日更新

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

PS:我尝试了在禁用 proguard 的情况下创建的 Dex 保护器和混淆发布 apk。 dexprotector 创建的 APK 运行正常。

【问题讨论】:

标签: java android proguard dexprotector


【解决方案1】:

对我来说,将 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 文件中找到

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      就我而言,将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 优化文件存在一个已知错误,所以我尝试了它并且它有效。没有更多的细节,对不起:(

      【讨论】:

        【解决方案4】:
        -keep        class com.facebook.** { *; }
        

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

        tldr;

        如果您只想将“-ignorewarnings”作为唯一的配置指令包含在 proguard 中,则不要使用它。

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

        【讨论】:

        • 试过上面的配置。但仍然崩溃。
        猜你喜欢
        • 2014-03-09
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多