【问题标题】:Android - How to check Proguard obfuscation has worked?Android - 如何检查 Proguard 混淆是否有效?
【发布时间】:2015-02-27 04:14:29
【问题描述】:

我混淆了我的 apk,但文件大小仅从 12MB 减少到 10.5MB。

它只是相对较小的减少的原因可能是因为我的应用程序使用了几个大型库,但是有什么方法可以检查已执行的混淆级别?

以防万一,这是我的 proguard-project.txt 文件...

# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

-dontwarn twitter4j.**

...我使用的库是android-support-v4.jaracra-4.5.0.jartwitter4j-core-4.0.2.jar

【问题讨论】:

    标签: android proguard obfuscation


    【解决方案1】:

    这可能是一种更直观的检查方式。 在较新版本的 Android Studio 中,它带有 APK Analyzer,让用户可以探索 APK 文件中的内容,并且可以方便地检查您的类是否被混淆了。

    下图显示包名和方法名都被混淆了

    【讨论】:

    • 感谢您的回答。您可以在 Android Studio -> Buld -> 分析 APK 中找到此工具...
    【解决方案2】:

    在您的项目目录中,您将找到一个Proguard 文件夹,您将在其中看到四个文本文件:

    dump.txt

    描述.apk文件中所有类文件的内部结构

    ma​​pping.txt

    列出原始和混淆的类、方法和字段名称之间的映射。当您收到来自的错误报告时,此文件很重要 发布版本,因为它将混淆的堆栈跟踪转换回 原始类、方法和成员名称。请参阅解码混淆的堆栈跟踪 了解更多信息。

    seeds.txt

    列出未被混淆的类和成员

    usage.txt

    列出从 .apk 中剥离的代码

    Source: Proguard

    希望这会有所帮助!

    【讨论】:

    • 这些文件保存在 /build/outputs/mapping/release/
    【解决方案3】:

    Proguard 工作流:

    • seeds.txt - Proguard 保留的列表。这些是入口点,它们是节点。例如对于裸 Java,它是一个 main 函数和其他依赖项
    • usage.txt - Proguard 不保留的列表
    • mapping.txt - old_name -> new_name 格式的新旧命名信息。它可用于通过retraceproguardui 解码stacktrace
    • dump.txt - 描述 Proguard 放入结果存档的所有内容

    你可以找到输出

    <module_name>/build/outputs/mapping/<buildType>/
    

    您可以使用Analyze APK 工具。您可以在哪里查看 .class 文件、添加 Proguard 映射文件、显示已删除的节点、显示去混淆的名称

    【讨论】:

      【解决方案4】:

      我可以通过什么方式检查已执行的混淆级别?

      您也许可以使用标志-optimizationpasses N

      指定要执行的优化遍数。默认情况下,执行单遍。多次通过可能会导致进一步的改进。如果优化通过后没有发现改进,则结束优化。仅在优化时适用。

      【讨论】:

        【解决方案5】:

        ProGuard 只会缩小/优化您没有为其创建 -keep 选项的部分。当使用广泛的 -keep 规则(以.** { *; } 结尾)时,收缩/优化结果会迅速下降。

        我可以从 sn-p 看到您自己没有创建如此广泛的 -keep 选项,但它们可能是 ProGuard 消费者规则的一部分,这些规则是某些依赖项的一部分。您可以通过在 ProGuard 配置文件中添加以下内容来打印所有这些 -keep 选项: -printconfiguration fullconfig.txt。这将创建文件 fullconfig.txt,其中列出了所有 -keep 选项,包括依赖项。

        如果您的某个依赖项包含过于宽泛的 -keep 选项,您可以选择通过创建使用者规则过滤器来忽略这些选项。这将要求您自己为依赖项创建 -keep 选项。

        最近发布了一个工具来检查 jar/apk 的哪些部分被保留,因此没有缩小/优化。您需要提供 -keep 选项并上传 jar/apk,然后您可以直观地查看项目的哪些部分未使用 ProGuard 处理。此工具称为ProGuard Playground。我建议复制/粘贴 fullconfig.txt 文件的内容,这样您就可以轻松查看 ProGuard 未触及哪些部分。

        【讨论】:

          猜你喜欢
          • 2011-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-14
          • 2017-10-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多