我在我的应用程序中使用 R8,并且有几个自定义视图(在 xml 布局中引用),但它们的名称根本没有混淆。
这是因为proguard-android-optimize.txt https://android.googlesource.com/platform/sdk/+/master/files/proguard-android-optimize.txt有以下规则:
# keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
因此,默认情况下,您的自定义视图或任何视图的名称不会被混淆。
现在的问题是,您还能让 R8 重命名应用程序中的自定义视图吗?答案是并不真地.
你可以添加一个-applymapping myCustomMapping.txt
通过复制内容<root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt
并替换对未用混淆名称混淆的自定义视图的所有引用。
像这样:
- 复制内容
<root_dir>/app/build/outputs/mapping/<build_variant>/mapping.txt
到一个新文件中<root_dir>/app/myCustomMapping.txt
- 在更改任何内容之前,它看起来像这样:
my.app.package.CustomView -> my.app.package.CustomView :
13:34:void <init>(android.content.Context,android.util.AttributeSet,int) -> <init>
15:16:void <init>(android.content.Context,android.util.AttributeSet,int,int,kotlin.jvm.internal.DefaultConstructorMarker) -> <init>
43:46:void customMethod() -> c
- 您只需要更改具有顶级类映射的这一行。请注意,由于 android proguard 规则,它没有改变。将其更改为您想要的任何混淆名称,如下所示:
my.app.package.CustomView -> my.app.package.youcantseemeatall :
13:34:void <init>(android.content.Context,android.util.AttributeSet,int) -> <init>
15:16:void <init>(android.content.Context,android.util.AttributeSet,int,int,kotlin.jvm.internal.DefaultConstructorMarker) -> <init>
43:46:void customMethod() -> c
- 最后,将这些行添加到您的
proguard-rules.pro
file
-applymapping myCustomMapping.txt
-printmapping mapping.txt
上述步骤将更改您的 .class 文件以进行混淆CustomView
to youcantseemeatall
, BUT您的资源文件仍将引用原始文件CustomView
名称,您的应用程序将在运行时崩溃。
结论:
不幸的是,确实没有办法用 proguard 或 Android Studio 附带的任何工具来满足您的要求。可能有一个自定义 Gradle 插件可以在应用程序组装之前更改所有自定义视图名称,但我现在只是通过谷歌搜索找不到一个插件。