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

时间:2019-11-03 12:10:51

标签: android android-studio build obfuscation r8

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

正如official documentation所说:

  

混淆代码

     

混淆的目的是通过缩短应用程序的类,方法和名称来减小应用程序的大小   字段。

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

enter image description here enter image description here

Contenutimanifest.xml中提到的活动。

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

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

此R8的行为正确吗?

如何设置R8来混淆它们,或者至少混淆这两个?

非常感谢!

1 个答案:

答案 0 :(得分:3)

此默认规则可能是原因:

# 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的类中定义的,并且(b)具有与模式匹配的方法签名(基本上是任何名称和View参数)。

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

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

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

无论如何,我都可以进行-经过重述的修改可以重现该问题,并提供了基于默认-keeps的可能解释。

请注意,术语“保持”被重载,因为它也适用于混淆。