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

Posted

技术标签:

【中文标题】为啥 R8 不重命名所有方法和类?【英文标题】:Why does R8 not rename all methods and classes?为什么 R8 不重命名所有方法和类? 【发布时间】:2020-02-28 23:28:35 【问题描述】:

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

正如official documentation 所说:

混淆您的代码

混淆的目的是通过缩短应用的类、方法和 字段。

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

Contenutimanifest.xml中提到的一个Activity。

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

void mostraView(View v)

     v.setVisibility(View.VISIBLE);

void nascondiView(View v)

     v.setVisibility(View.GONE);

这个 R8 的行为正确吗?

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

非常感谢!

【问题讨论】:

@Andy mostraView 和 nascondiView 是我创建的方法,它们不在任何库中。 @Andy 并非如此。他们没有扩展任何东西 可以添加you can add the -whyareyoukeeping option to the ProGuard configuration file(此处引用:medium.com/androiddevelopers/…) @Andy 我阅读了您的链接,但似乎没有解释如何发现该方法未重命名的原因,而只是解释了未删除该方法的原因。 【参考方案1】:

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

# 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) 具有与模式匹配的方法签名(基本上是任何名称和视图参数)。

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

public void mostraView(View v)

    v.setVisibility(View.VISIBLE);

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

尽我所能 - 能够通过注意修改重现问题并提供基于默认 -keeps 的可能解释。

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

【讨论】:

谢谢,从它们被 R8 重命名的两种方法中删除 public 修饰符

以上是关于为啥 R8 不重命名所有方法和类?的主要内容,如果未能解决你的问题,请参考以下文章

jquery文件上传 - 如何覆盖文件不重命名

C#中类和命名空间是啥?为啥要用?啥时候用到?请高手详细说明

apache_conf 如何在.NET MVC4中创建自定义BundleTransform,特别是为了不重命名变量。因为我找不到这个

为啥方法重命名在 PHP 特征中不起作用?

将非 bat 扩展文件作为批处理文件运行

为啥linux无法重命名文件