如何让私有成员保持在 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