对代码混淆有何期待(proguard,android)

What to expect from code obfuscation (proguard, android)

有一个 APK 被 Proguard 混淆了。我用APK工具反编译了它。它为每个 class 创建了 *.smali 文件。我可以看到 classes 的真实姓名甚至代码流:

.locals 2

new-instance v0, Lcom/acme/model/Receipt;

invoke-direct {v0}, Lcom/acme/model/Receipt;-><init>()V

iget-object v1, p1, Lcom/acme/bus/Receipt;->a:Ljava/lang/String;

invoke-virtual {v0, v1}, Lcom/acme/model/Receipt;->setText(Ljava/lang/String;)V

iget v1, p1, Lcom/acme/bus/event/device/Receipt;->b:I

invoke-virtual {v0, v1}, Lcom/acme/Receipt;->setType(I)V

return-object v0

可以看看这个方法的作用。我预计所有包、classes、属性、方法都将更改,源代码乍一看毫无意义。混淆可以在 Android 上做什么?

据我所知,proguard 会默认混淆 android 个项目,当为项目启用 proguard 时。

来自此类应用程序的可能堆栈跟踪看起来有点像这样:

Caused by: java.lang.NullPointerException
at net.simplyadvanced.ltediscovery.be.u(Unknown Source)
at net.simplyadvanced.ltediscovery.at.v(Unknown Source)
at net.simplyadvanced.ltediscovery.at.d(Unknown Source)
at net.simplyadvanced.ltediscovery.av.onReceive(Unknown Source)

--> 没有关于 class 的信息,也没有方法名称

所以我假设,构建 apk 的开发人员出于某种原因禁用了 class 重命名。另见 Using Proguard with Android without obfuscation

堆栈跟踪来源:http://simplyadvanced.net/blog/android-how-to-decode-proguards-obfuscated-code-from-stack-trace/

据我所知,它将重命名所有 类 和方法,例如A、AA、AAA、B、BB 等这样就不会那么容易阅读和理解。就那么多,删除所有 类,未引用或使用的垃圾也被删除,APK 被压缩到一个明显的小尺寸。