【问题标题】:How to implement ProGuard properly in android studio?如何在 android studio 中正确实现 ProGuard?
【发布时间】:2020-09-07 02:52:48
【问题描述】:

我很难学习 proguard,我需要帮助来删除所有 R8 警告并正确实施 proguard 规则。我大部分时间都在 youtube 上观看了所有视频,并阅读了有关 proguard / proguard-rules 的博客、文档和文章,但到目前为止我仍然有很多问题,我将一一列举。以下是我的问题:

  1. 到目前为止,我知道当我创建模型类时,我需要在包中添加-keep class,这样它就不会被混淆,但是像这样的模型怎么样:(我是否还要在保护规则?)
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. 活动类也是如此,有什么必要做的?例如,如果我从数据库中检索数据,它会影响过程吗?

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

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

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

【问题讨论】:

    标签: android proguard


    【解决方案1】:

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

    现在,您需要记住它不会混淆 XML 文件和 Android 组件(Activity/Service 等),基本上是您在 manifest.xml 中声明的所有类。

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


    来到你的问题,下面是答案

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

    2. 无需保留。

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

    4. 由于依赖关系,你需要保留一些类。因此,在您正在使用的库的文档中查找 proguard 规则。如果他们需要一个 proguard 配置,大多数库曾经包含。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多