Android - 如何检查Proguard混淆有效?

时间:2014-12-31 01:14:24

标签: android proguard obfuscation

我对我的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

6 个答案:

答案 0 :(得分:33)

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

<强> dump.txt

  

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

<强>的mapping.txt

  

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

<强> seeds.txt

  

列出未混淆的类和成员

<强> usage.txt

  

列出从.apk

中删除的代码

Source: Proguard

希望这有帮助!

答案 1 :(得分:32)

这可能是一种更直观的检查方式。 在Android Studio的较新版本中,它附带了APK分析器,可让用户浏览APK文件中的内容,并且检查您的类是否已经过混淆是很方便的。

下图显示包名称和方法名称已被混淆

You can see the package name and method name is obfuscated

答案 2 :(得分:2)

ProGuard处理Android应用程序时,会生成一些输出文件以显示每个步骤中发生的情况。这些文件位于构建目录中

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

您可以找到:

  • seeds.txt-ProGuard遍历类池,并将与您的seeds.txt中的任何一个匹配的每个类和成员的列表打印到keep rules。如果您编写的keep规则实际上与您要保留的类匹配,这对于调试很有用。
  • usage.txt-这是缩小阶段,其中ProGuard从应用程序中删除未使用的代码。执行此操作时,它会将unused code(已删除的代码)打印到usage.txt。如果您想弄清楚为什么在运行时不存在类,这将很有用。
  • mapping.txt-ProGuard要做的第二件事是尽可能多地混淆代码-也就是说,它将类和成员重命名为无意义的名称,例如“ a”,“ b”等。为此,ProGuard将每个班级和成员的旧名称和新名称打印到mapping.txt。并非所有代码都被重命名,但是所有代码都在mapping.txt中列出。如果您想对堆栈跟踪进行模糊处理,则需要此文件。它使您可以从混淆的名称向后转换为代码的原始名称。
  • dump.txt-处理后的所有代码的完整列表。也就是说,所有遗留在类文件中的文件,但格式未经过优化,因此是一个很大的文件。不过,如果您想查看类文件中的内容,但又不想反编译.class或.dex文件,这可能会非常有用。

这是我制作的图表,其中包含了非常详尽的步骤概述

enter image description here

了解更多here

答案 3 :(得分:0)

  

我可以用任何方式检查已执行的混淆程度吗?

您可以使用标记-optimizationpasses N

  

指定要执行的优化传递的数量。默认情况下,执行单次传递。多次通过可能会导致进一步的改进。如果在优化过程后未找到任何改进,则优化结束。仅适用于优化。

答案 4 :(得分:0)

Proguard工作流程:

enter image description here

  • seeds.txt-Proguard 保留
  • 的列表
  • usage.txt-Proguard 不保留的内容
  • 的列表
  • mapping.txt-有关old_name -> new_name格式的旧命名和新命名的信息
  • dump.txt-描述Proguard放入结果档案的所有内容

答案 5 :(得分:0)

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

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

如果您的依赖项之一包含太广泛的 -keep 选项,您可以通过创建消费者规则过滤器来选择忽略这些选项。这将需要您自己为依赖项创建 -keep 选项。

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