在使用 ProGuard 对代码进行混淆后,在 APK 分析器中我应该在哪里找到我的 BuildConfig?

8
请看来自Android Studio的Analyze APK的以下两张图片。
  • 第一张是minifyEnabled = false,而
  • 另一张是minifyEnabled = true(当然是在解码mapping.txt之后)

enter image description here
minifyEnabled = false. BuildConfig在此处。

enter image description here
minifyEnabled = true(已使用mapping.txt进行解码)。 BuildConfig不在此处。

在缩小代码之前,我可以在classes.dex中找到BuildConfig,但在缩小代码之后找不到。 我找不到任何有关此事的文档/讨论,但是否有某些规则可以从classes.dex中删除BuildConfig? 这是否意味着将敏感信息放入BuildConfig相对安全? 或者,它可能只是隐藏在其他地方?

如果有影响的话,我的ProGuard版本是4.7。

2个回答

17

最小化步骤的另一个功能是常量内联。这就解释了为什么BuildConfig会消失,但是值仍然存在于需要它们的地方。一旦值被内联,就不再有对BuildConfig类的引用,这样压缩器就可以完全删除它。


嗨@David Liu:这是否意味着我们可以将诸如网络连接凭据之类的敏感数据放在build.gradle中。它会100%安全免受反向工程吗?您能否详细说明上述答案。 - SVK
@SVK 不行。敏感数据仍将存在,直接嵌入到代码中而不是引用BuildConfig。只需通过扫描应用程序的字符串即可查看该敏感数据。 - David Liu

0

如果您在BuildConfig上使用了一些变量,那么Proguard将不会删除它。根据他们的手册:

缩小步骤检测和删除未使用的类、字段、方法和属性。优化步骤分析和优化方法的字节码。混淆步骤使用短而无意义的名称重命名剩余的类、字段和方法。

此外,我一直在使用这些选项,我从未遇到过Proguard剥离我的BuildConfig信息。

shrinkResources true
minifyEnabled true

我回答你的问题,即是否相对安全将敏感信息放在BuildConfig中。但是从Proguard所说的来看,它使用短而无意义的名称重命名类字段和方法,我猜测 BuildConfig 也被重命名了以及它的变量。我在经过Proguard处理后的classes.dex文件中也找不到我的BuildConfig - Tenten Ponce
太棒了!至少我松了一口气,知道自己不是疯了 :) 我会等待一天,除非我找到更好的答案,否则将选择您的回答为最佳答案。 - barley
1
现在,我也很好奇哈哈。我在我的mapping.txt上发现,即使是我自己声明的静态变量也不存在。尽管我发现了一个变量,它从BuildConfig映射,那就是boolean DEBUG变量。 - Tenten Ponce
嗨@TentenPonce和@barley:(1)如果我们的BuildConfig被重命名,但仍然包含敏感数据怎么办?(2)从上面的讨论中,我无法得出最终结论。在build.gradle文件中存储诸如网络连接凭据之类的敏感信息,然后在我们的“生产”应用程序中使用它们是否安全?请确认一下。 - SVK
根据@barley的第一条评论:“我并不是说在我的构建中失去了BuildConfig访问权限。我的构建可以很好地使用存储在BuildConfig中的信息”。即使启用了“minifyEnabled”,信息仍然存在,尽管它已经丢失。接受的答案还解释了为什么缺少BuildConfig。 - Tenten Ponce
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接