Android Studio 0.5.0 重建不适用于 Proguard

Posted

技术标签:

【中文标题】Android Studio 0.5.0 重建不适用于 Proguard【英文标题】:Android Studio 0.5.0 rebuild not working with Proguard 【发布时间】:2014-04-10 09:00:36 【问题描述】:

最近我按照 IDE 的建议将 android Studio 从 0.4.2 更新到 0.5.0,并将 Android Gradle Plug-In 从 0.7.2 更新到 0.9.0。该项目运行并安装良好,但是当我按下 Build->Rebuild Project 时,它会引发错误,从而停止重建。 这是消息选项卡中的错误:

Information:See complete output in console
Error:Execution failed for task ':projectName:proguardDebug'.
> java.io.IOException: Please correct the above warnings first.

这是控制台中描述的问题:

:projectName:proguardDebug
Note: there were 2345 duplicate class definitions.
Warning: com.facebook.Settings: can't find referenced class com.facebook.android.BuildConfig
Warning: com.facebook.Settings: can't find referenced class com.facebook.android.BuildConfig
Warning: com.facebook.internal.Utility: can't find referenced class com.facebook.android.BuildConfig
Warning: com.facebook.internal.Utility: can't find referenced class com.facebook.android.BuildConfig
Warning: there were 4 unresolved references to classes or interfaces.
         You may need to add missing library jars or update their versions.
         If your code works fine without the missing classes, you can suppress
         the warnings with '-dontwarn' options.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
:projectName:proguardDebug FAILED

FAILURE: Build failed with an exception.

据我了解,问题是缺少 BuildConfig.java,它在我从 Eclipse 迁移之前位于 /gen 文件夹中。但是现在没有 /gen 文件夹,并且 BuildConfig.java 在 /build/source/buildConfig/debug/ forlder 中。

我找到了唯一真正对此有所帮助的解决方案,它是添加行

-dontwarn com.facebook.** 

到 proguard 配置文件,但这并不是真正的解决方案。

【问题讨论】:

【参考方案1】:

问题是我们的库没有打包 BuildConfig。这是因为我们允许(目前)库具有相同的包名。我们将改变这一点。

这应该不是问题,因为 BuildConfig 只是应该在代码中内联的常量。您可以通过仅排除 BuildConfig 来进行临时修复:

-dontwarn com.facebook.android.BuildConfig

我们可能很快就会解决这个问题。

【讨论】:

【参考方案2】:

来自link in the warning:

如果缺少的类是从预编译的第三方库中引用的,并且您的原始代码在没有它的情况下运行良好,那么缺少的依赖项似乎不会受到伤害。最干净的解决方案是从输入中过滤掉一个或多个引用类,使用像“-libraryjars mylibrary.jar(!somepackage/SomeUnusedReferencingClass.class)”这样的过滤器。然后 ProGuard 将在输入中完全跳过这个类,并且不会遇到缺少引用的问题。但是,您可能必须过滤掉反过来引用已删除类的其他类。实际上,如果您可以使用通配符过滤器(如“-libraryjars mylibrary.jar(!someunusedpackage/**)”)一次过滤掉整个未使用的包,则此方法效果最佳。 如果您不想过滤掉有问题的类,可以使用 -ignorewarnings 选项,甚至 -dontwarn 选项来试试运气。仅当您确实知道自己在做什么时才使用这些选项。

【讨论】:

以上是关于Android Studio 0.5.0 重建不适用于 Proguard的主要内容,如果未能解决你的问题,请参考以下文章

在不重建项目的情况下无法在 Android Studio 中找到符号

Android Studio 代码建议不适用于 Flutter

单元测试不适用于 Android Studio 北极狐

Android Studio:从 G​​ithub 导入项目并使用 gradle 文件重建/清理/同步后“无法解析符号 R”

Android Studio 项目适用于 Lollipop,但不适用于 Kitkat

Kapt 不适用于 Android Studio 3.0 中的 AutoValue