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

Why does R8 not rename all methods and classes?

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

正如 official documentation 所说:

Obfuscate your code

The purpose of obfuscation is to reduce your app size by shortening the names of your app’s classes, methods, and fields.

我认为 R8 会重命名所有方法和 class 名称,但如果我通过“构建 -> 分析 APK...”分析 APK,我可以阅读大部分原始方法和 class 名字。

Contenutimanifest.xml.

中提到的 Activity

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

void mostraView(View v)
{
     v.setVisibility(View.VISIBLE);
}
void nascondiView(View v)
{
     v.setVisibility(View.GONE);
}

这个 R8 的行为是否正确?

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

非常感谢!

此默认规则可能是原因:

# 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);
}

我是通过使用诊断开关 -printseeds-printconfiguration 获得的。

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

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

public void mostraView(View v)
{
    v.setVisibility(View.VISIBLE);
}

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

无论如何,这是我所能接受的 - 能够通过注意到的修改重现问题并提供基于默认 -keeps 的可能解释。

请注意术语 "keep" 已过载,因为它也适用于混淆。