为啥 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,我可以读取大部分原始方法和类名。
Contenuti
是manifest.xml
中提到的一个Activity。
mostraView
和 nascondiView
是我创建的方法,它们不在任何库中,它们不扩展任何内容,所以我希望看到它们的名称被更改。
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 不重命名所有方法和类?的主要内容,如果未能解决你的问题,请参考以下文章
C#中类和命名空间是啥?为啥要用?啥时候用到?请高手详细说明
apache_conf 如何在.NET MVC4中创建自定义BundleTransform,特别是为了不重命名变量。因为我找不到这个