Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android studio中正确实现ProGuard?_Android_Proguard - Fatal编程技术网

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

如何在android studio中正确实现ProGuard?,android,proguard,Android,Proguard,我很难学习proguard,我需要帮助删除所有R8警告并正确执行proguard规则。我看了youtube上的大部分视频,阅读了有关proguard/proguard规则的博客、文档和文章,但到目前为止,我还有很多问题,我将一一列举。以下是我的问题: 到目前为止,我知道当我创建模型类时,我需要向包中添加一个-keep类,这样它就不会被混淆,但是像这样的模型怎么样:(我是否也应该在proguard规则中添加-keep) 像RecyclerAdapter或FirestorePagingAdapter

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

  • 到目前为止,我知道当我创建模型类时,我需要向包中添加一个
    -keep类
    ,这样它就不会被混淆,但是像这样的模型怎么样:(我是否也应该在proguard规则中添加
    -keep
  • RecyclerAdapter
    FirestorePagingAdapter
    这样的适配器类怎么样?我知道他们会受到混淆的影响,但我们应该让它混淆吗?还是我们应该把它加入规则

  • 活动课也是如此,必须做什么?例如,如果我从数据库检索数据,它会影响流程吗

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

  • 最后,我应该如何调试我的规则,或者如何知道我是否在proguard中包含或缺少一些规则?(如果可能,您能否给出一些调试proguard规则的示例)


  • 希望你能回答我所有的问题,因为我很确定有人也在proguard上苦苦挣扎,所以我希望,如果他们看到这些问题,这将帮助他们克服这种情况,而不需要在互联网上单独寻找答案。谢谢大家!

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

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

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


    关于你的问题,下面是答案

  • 模型类是您创建用来解析响应JSON或保持UI状态的类。因此,对于响应JSON,您需要了解问题所在。用于匹配字段名的解析器,当proguard更改字段名时,字段和JSON不匹配。因此解析将不起作用。这就是人们要求保留模型类的原因。[注意:对于GSON,如果您正在使用,则不需要保留模型类

  • 不需要保留

  • 不能混淆活动类名称

  • 由于依赖关系,您需要保留一些类。因此,请在您正在使用的库的文档中查找proguard规则。如果需要proguard配置,大多数库都会包含这些规则

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


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

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

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


    关于你的问题,下面是答案

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

  • 不需要保留

  • 不能混淆活动类名称

  • 由于依赖关系,您需要保留一些类。因此,请在您正在使用的库的文档中查找proguard规则。如果需要proguard配置,大多数库都会包含这些规则

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

  • 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) { }
    }