为什么 R8 不重命名所有方法和类?

use*_*558 1 obfuscation android build android-studio android-r8

我第一次尝试使用 R8 的 Android Studio 版本来执行混淆和代码优化。

\n

正如官方文档所说:

\n
\n

混淆你的代码

\n

混淆的目的是通过缩短应用程序\xe2\x80\x99s 类、方法和\n字段的名称来减小应用程序的大小。

\n
\n

我认为R8会重命名所有方法和类名,但是如果我通过“Build -> Analytics APK...”分析APK,我可以读取大部分原始方法和类名。

\n

在此输入图像描述\n在此输入图像描述

\n

Contenuti是 中提到的一个 Activity manifest.xml

\n

mostraViewnascondiView是我创建的方法,它们不在任何库中,它们不扩展任何内容,所以我希望看到它们的名称发生变化。

\n
void mostraView(View v)\n{\n     v.setVisibility(View.VISIBLE);\n}\nvoid nascondiView(View v)\n{\n     v.setVisibility(View.GONE);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

R8 的行为正确吗?

\n

如何设置 R8 来混淆所有这些,或者至少这两个?

\n

多谢!

\n

小智 5

原因可能是这个默认规则:

# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
}
Run Code Online (Sandbox Code Playgroud)

我通过使用诊断开关-printseeds和获得了这一点-printconfiguration

匹配的方法将 (a) 在扩展 Activity 的类中定义,并且 (b) 具有与模式匹配的方法签名(本质上是任何名称和视图参数)。

但是,我可以重现您的问题的唯一方法是修改访问修饰符以包含public如下内容:

public void mostraView(View v)
{
    v.setVisibility(View.VISIBLE);
}
Run Code Online (Sandbox Code Playgroud)

注意添加关键字public。因此,假设您发布的代码是逐字的,那么默认的访问修饰符是包朋友,它与模式不匹配。

无论如何,据我所知,能够通过注释的修改重现问题,并根据默认保留提供可能的解释。

请注意,术语“保留”被过度使用,因为它也适用于混淆。