如何让私有成员保持在 pro-guard 规则中
how to keep private members in pro-guard rules
我正在尝试使用 Proguard 来保留我的私有字段,但它不起作用。
我从 Proguard keep classmembers 那里偷走了大部分内容,因为这个问题与我要问的问题类似,并且还遵循了这个 link How to tell ProGuard to keep private fields without specifying each field
但是还是不行
我想为另一家公司创建一个库,并且仍然保留我的访问级别修饰符字段和方法。
混淆器:
-keepclassmembers class com.example.mylibrary.Bedika {
private <fields>;
}
-keep class com.example.mylibrary.Bedika {
*;
}
我的 AAR 库
public class Bedika {
private String stam;
public Bedika(String stam) {
this.stam = stam;
}
public void print() {
System.out.println(stam);
}
}
Proguard 后的输出:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.example.mylibrary;
public class Bedika {
public String stam;
public Bedika(String var1) {
this.stam = var1;
}
public void print() {
System.out.println(this.stam);
}
}
您通常可以在 class 或对象上方添加 @Keep
注释(在 Java 或 Kotlin 中)。这是不言自明的,并且会起作用。
似乎是 R8 而不是 Proguard
导致了这个问题。
进入gradle.properties
,设置android.enableR8=false
。下次构建时,它将使用 Proguard
。
R8 是 Google 对 Proguard 的回答,在 Android Gradle 插件 (3.4.0+) 的最新版本中,它默认为 R8 的代码 shrinker/obfuscator.使用 Google 的版本而不是 Guardsquare 的技术有一些优点和缺点。
有关详细信息,请查看 documentation
我正在尝试使用 Proguard 来保留我的私有字段,但它不起作用。 我从 Proguard keep classmembers 那里偷走了大部分内容,因为这个问题与我要问的问题类似,并且还遵循了这个 link How to tell ProGuard to keep private fields without specifying each field
但是还是不行
我想为另一家公司创建一个库,并且仍然保留我的访问级别修饰符字段和方法。
混淆器:
-keepclassmembers class com.example.mylibrary.Bedika {
private <fields>;
}
-keep class com.example.mylibrary.Bedika {
*;
}
我的 AAR 库
public class Bedika {
private String stam;
public Bedika(String stam) {
this.stam = stam;
}
public void print() {
System.out.println(stam);
}
}
Proguard 后的输出:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.example.mylibrary;
public class Bedika {
public String stam;
public Bedika(String var1) {
this.stam = var1;
}
public void print() {
System.out.println(this.stam);
}
}
您通常可以在 class 或对象上方添加 @Keep
注释(在 Java 或 Kotlin 中)。这是不言自明的,并且会起作用。
似乎是 R8 而不是 Proguard
导致了这个问题。
进入gradle.properties
,设置android.enableR8=false
。下次构建时,它将使用 Proguard
。
R8 是 Google 对 Proguard 的回答,在 Android Gradle 插件 (3.4.0+) 的最新版本中,它默认为 R8 的代码 shrinker/obfuscator.使用 Google 的版本而不是 Guardsquare 的技术有一些优点和缺点。
有关详细信息,请查看 documentation