如何在 android studio 中正确实现 ProGuard?
How to implement ProGuard properly in android studio?
我很难学习混淆器,我需要帮助来删除所有 R8 警告并正确实施混淆器规则。我几乎观看了 youtube 上的所有视频,并阅读了有关混淆器/混淆器规则的博客、文档和文章,但到目前为止我仍然有很多问题,我将一一列举。这是我的问题:
- 到目前为止我知道当我创建模型时 类 我需要在包中添加一个
-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) { }
}
适配器 类 像 RecyclerAdapter
或 FirestorePagingAdapter
怎么样?我知道他们会受到混淆的影响,但我们应该让它混淆吗?还是我们也应该将其添加到规则中?
同理Activity 类需要做哪些事情?例如,如果我从数据库中检索数据,是否会影响流程?
接下来是关于图书馆的。我知道我应该在每个依赖项中添加相应的 proguard 规则,但我看到一些博客说它需要添加 OkHttp3,即使他没有将实现添加到他的依赖项中。所以我想出了一个问题,我应该如何知道是否还有其他库需要添加到规则中?
最后,我应该如何调试我的规则,或者我应该如何知道我是否在混淆器中包含或遗漏了一些规则? (如果可能的话,你能举一些调试proguard-rules的例子吗)
希望你能回答我所有的问题,因为我很确定外面的人也在为 proguard 苦苦挣扎,所以我希望如果他们看到这些问题,它将帮助他们克服这种情况而不会遇到困难分别在网上找答案。谢谢!
首先,您需要了解 ProGurad 的作用。如果我以非常简单的方式解释,它会将 class-name、变量和方法更改为其他名称(如 ),当有人试图从 apk 解码您的代码时,这些名称将很难阅读。
现在,你需要记住它不会混淆 XML 文件,Android 组件(Activity/服务等),基本上所有 classes您在 manifest.xml.
中声明
因此,除此之外,您还可以混淆所有内容 (Java/ Kotlin)。但是由于一些依赖关系,你必须告诉 ProGurad 不要混淆一些文件。
针对您的问题,下面是答案
模型 classes 是您为解析响应 JSON 或保持 UI 的状态而创建的模型。所以在response-JSON的情况下,你需要理解问题。 Parsers 用于匹配字段名,当 proguard 更改字段名时,字段与 JSON 不匹配。所以解析将不起作用。这就是人们要求保留模型 classes 的原因。 [注:在GSON的情况下,如果你使用@SerializedName] ,你不需要保留模型classes.
无需保留
您不能混淆 Activity class 名称。
因为依赖关系,需要保留一些classes。因此,请在您正在使用的库的文档中查找 proguard 规则。如果需要 Proguard 配置,大多数库过去都会包含。
首先,如果您做错了什么,您将在编译或 运行 应用程序时遇到错误。如果您想检查您的代码是否被混淆以及有多少代码被混淆,那么 you need to analyze apk.
我很难学习混淆器,我需要帮助来删除所有 R8 警告并正确实施混淆器规则。我几乎观看了 youtube 上的所有视频,并阅读了有关混淆器/混淆器规则的博客、文档和文章,但到目前为止我仍然有很多问题,我将一一列举。这是我的问题:
- 到目前为止我知道当我创建模型时 类 我需要在包中添加一个
-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) { }
}
适配器 类 像
RecyclerAdapter
或FirestorePagingAdapter
怎么样?我知道他们会受到混淆的影响,但我们应该让它混淆吗?还是我们也应该将其添加到规则中?同理Activity 类需要做哪些事情?例如,如果我从数据库中检索数据,是否会影响流程?
接下来是关于图书馆的。我知道我应该在每个依赖项中添加相应的 proguard 规则,但我看到一些博客说它需要添加 OkHttp3,即使他没有将实现添加到他的依赖项中。所以我想出了一个问题,我应该如何知道是否还有其他库需要添加到规则中?
最后,我应该如何调试我的规则,或者我应该如何知道我是否在混淆器中包含或遗漏了一些规则? (如果可能的话,你能举一些调试proguard-rules的例子吗)
希望你能回答我所有的问题,因为我很确定外面的人也在为 proguard 苦苦挣扎,所以我希望如果他们看到这些问题,它将帮助他们克服这种情况而不会遇到困难分别在网上找答案。谢谢!
首先,您需要了解 ProGurad 的作用。如果我以非常简单的方式解释,它会将 class-name、变量和方法更改为其他名称(如 ),当有人试图从 apk 解码您的代码时,这些名称将很难阅读。
现在,你需要记住它不会混淆 XML 文件,Android 组件(Activity/服务等),基本上所有 classes您在 manifest.xml.
中声明因此,除此之外,您还可以混淆所有内容 (Java/ Kotlin)。但是由于一些依赖关系,你必须告诉 ProGurad 不要混淆一些文件。
针对您的问题,下面是答案
模型 classes 是您为解析响应 JSON 或保持 UI 的状态而创建的模型。所以在response-JSON的情况下,你需要理解问题。 Parsers 用于匹配字段名,当 proguard 更改字段名时,字段与 JSON 不匹配。所以解析将不起作用。这就是人们要求保留模型 classes 的原因。 [注:在GSON的情况下,如果你使用@SerializedName] ,你不需要保留模型classes.
无需保留
您不能混淆 Activity class 名称。
因为依赖关系,需要保留一些classes。因此,请在您正在使用的库的文档中查找 proguard 规则。如果需要 Proguard 配置,大多数库过去都会包含。
首先,如果您做错了什么,您将在编译或 运行 应用程序时遇到错误。如果您想检查您的代码是否被混淆以及有多少代码被混淆,那么 you need to analyze apk.