为什么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 名字。
Contenuti
是 manifest.xml
.
中提到的 Activity
mostraView
和 nascondiView
是我创建的方法,它们不在任何库中,它们不扩展任何内容,所以我希望看到它们的名称被更改。
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" 已过载,因为它也适用于混淆。
我第一次尝试使用带有 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 名字。
Contenuti
是 manifest.xml
.
mostraView
和 nascondiView
是我创建的方法,它们不在任何库中,它们不扩展任何内容,所以我希望看到它们的名称被更改。
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" 已过载,因为它也适用于混淆。