如何在 android studio 中正确实现 ProGuard?

How to implement ProGuard properly in android studio?

我很难学习混淆器,我需要帮助来删除所有 R8 警告并正确实施混淆器规则。我几乎观看了 youtube 上的所有视频,并阅读了有关混淆器/混淆器规则的博客、文档和文章,但到目前为止我仍然有很多问题,我将一一列举。这是我的问题:

  1. 到目前为止我知道当我创建模型时 类 我需要在包中添加一个 -keep class 这样它就不会被混淆,但是像这样的模型怎么样:(应该我还在 proguard-rules 上添加了 -keep?)
public class Constants {
    public static final int ERROR_DIALOG_REQUEST = 9001;
    public static final int PERMISSIONS_REQUEST_ENABLE_GPS = 9002;
    public static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 9003;
    public static final String LOG_DB = "DB_Error";
}

//Or like this:

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
    public CameraView(Context context) {
        super(context);
        getHolder().addCallback(this);
        setFocusableInTouchMode(true);
        setFocusable(true);
        requestFocus();
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) { }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) { }
}
  1. 适配器 类 像 RecyclerAdapterFirestorePagingAdapter 怎么样?我知道他们会受到混淆的影响,但我们应该让它混淆吗?还是我们也应该将其添加到规则中?

  2. 同理Activity 类需要做哪些事情?例如,如果我从数据库中检索数据,是否会影响流程?

  3. 接下来是关于图书馆的。我知道我应该在每个依赖项中添加相应的 proguard 规则,但我看到一些博客说它需要添加 OkHttp3,即使他没有将实现添加到他的依赖项中。所以我想出了一个问题,我应该如何知道是否还有其他库需要添加到规则中?

  4. 最后,我应该如何调试我的规则,或者我应该如何知道我是否在混淆器中包含或遗漏了一些规则? (如果可能的话,你能举一些调试proguard-rules的例子吗)

希望你能回答我所有的问题,因为我很确定外面的人也在为 proguard 苦苦挣扎,所以我希望如果他们看到这些问题,它将帮助他们克服这种情况而不会遇到困难分别在网上找答案。谢谢!

首先,您需要了解 ProGurad 的作用。如果我以非常简单的方式解释,它会将 class-name、变量和方法更改为其他名称(如 ),当有人试图从 apk 解码您的代码时,这些名称将很难阅读。

现在,你需要记住它不会混淆 XML 文件,Android 组件(Activity/服务等),基本上所有 classes您在 manifest.xml.

中声明

因此,除此之外,您还可以混淆所有内容 (Java/ Kotlin)。但是由于一些依赖关系,你必须告诉 ProGurad 不要混淆一些文件。


针对您的问题,下面是答案

  1. 模型 classes 是您为解析响应 JSON 或保持 UI 的状态而创建的模型。所以在response-JSON的情况下,你需要理解问题。 Parsers 用于匹配字段名,当 proguard 更改字段名时,字段与 JSON 不匹配。所以解析将不起作用。这就是人们要求保留模型 classes 的原因。 [注:在GSON的情况下,如果你使用@SerializedName] ,你不需要保留模型classes.

  2. 无需保留

  3. 您不能混淆 Activity class 名称。

  4. 因为依赖关系,需要保留一些classes。因此,请在您正在使用的库的文档中查找 proguard 规则。如果需要 Proguard 配置,大多数库过去都会包含。

  5. 首先,如果您做错了什么,您将在编译或 运行 应用程序时遇到错误。如果您想检查您的代码是否被混淆以及有多少代码被混淆,那么 you need to analyze apk.