【问题标题】:Android obfuscating with Proguard ProblemsAndroid 混淆了 Proguard 问题
【发布时间】:2012-12-13 18:55:50
【问题描述】:

我对整个混淆 Android 的事情很陌生,但最近几天我开始尝试 Proguard。无论如何,我被困在所谓的 Proguard 地狱中。

我的应用程序的结构是我有 3 个不同的项目。一个库和两个应用程序项目。这两个应用程序项目都基于包含应用程序的所有逻辑和库的库项目。应用项目中几乎没有放置任何东西。

但是,当我尝试在启用 Proguard 的情况下导出其中一个应用程序时,我在 Jackson JSON Parsing 库中遇到了一些错误。我尝试了很多不同的东西,我什至试图忽略错误,但这只是让解析部分失败。所以忽略错误不是正确的做法。

这是我的 proguard-project.txt 文件

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}
-keep public class com.google.android.vending.licensing.ILicensingService
-keep class org.codehaus.** { *; }

这些是我得到的错误。

Warning: org.codehaus.jackson.map.ext.JodaSerializers$LocalDateTimeSerializer: 
  can't find referenced class org.joda.time.LocalDateTime
      You should check if you need to specify additional program jars.
Warning: there were 99 unresolved references to classes or interfaces.
         You may need to specify additional library jars (using '-libraryjars').

【问题讨论】:

    标签: java android jackson proguard


    【解决方案1】:

    尝试为joda时间课程添加-keep选项:

    -keep public class org.joda.time.** {public private protected *;}
    -dontwarn org.joda.time.**
    

    【讨论】:

    • 好家伙,解决了 95% 的警告,但还有 4 个警告,它们看起来都是这样的。警告:org.codehaus.jackson.map.ext.DOMSerializer:找不到引用的类 org.w3c.dom.bootstrap.DOMImplementationRegistry
    • 尝试为 org.w3c.** 和其他外部库添加 -keep 和 -dontwarn。在我的项目中,我尝试使用不同的选项,包括 -libraryjars 和 -injars 但我没有运气,所以我不得不保留来自外部库的所有包(即使我的应用程序没有直接使用它们)。此外,如果您设法导出您的应用程序,请注意,由于混淆的 DTO 类、反射调用的方法等,它仍然可能在运行时崩溃。
    【解决方案2】:

    除了 proguard 本身,要做的一件事是确保您使用 Jackson 2.x,而不是 1.x——它具有较少的动态(可选)依赖项。这会通过 PG 减少噪音。

    【讨论】:

      【解决方案3】:

      “Can't find referenced class”表示包含这些类的 JAR 文件需要使用-libraryjars 指定,其工作方式与javac 的类路径非常相似。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        相关资源
        最近更新 更多