Android开发ProGuard使用技巧掌握

目录
  • 前言
    • 什么是 ProGuard?
    • 它对我们的应用程序有什么用处?
    • 如何在我们的项目中使用它?

前言

在构建 Android 应用程序时,我们可能在项目中使用了 ProGuard。在这篇文章中,我们将了解所有功能以及如何在 Android 中有效地使用 ProGuard。

因此,让我们将其分解为以下几点:

什么是 ProGuard?

ProGuard 是 Android 中的免费 java 工具,它可以帮助我们执行以下操作,

  • 缩小(缩小)代码:删除项目中未使用的代码。
  • 混淆代码:重命名类、字段等的名称。
  • 优化代码:做内联函数之类的事情。

简而言之,ProGuard 对我们的项目产生了以下影响,

  • 它减小了应用程序的大小。
  • 它删除了导致 Android 应用程序的 64K 方法计数限制的未使用类和方法。
  • 它通过混淆代码使应用程序难以进行逆向工程。

它对我们的应用程序有什么用处?

在 Android 中,proguard 对于制作可用于生产的应用程序非常有用。它可以帮助我们减少代码并使应用程序更快。默认情况下,Proguard 在 Android Studio 中是开箱即用的,它在很多方面都有帮助,下面提到的很少,

  • 它混淆了代码,这意味着它将名称更改为一些较小的名称,例如MainViewModel它可能会将名称更改为A。在混淆应用程序之后,您的应用程序的逆向工程现在成为一项艰巨的任务。
  • 它缩小了资源,即忽略了我们的类文件没有调用的资源,没有在我们的android应用程序中使用,比如drawables中的图像等。这将大大减少应用程序的大小。您应该始终缩小您的应用程序以使其重量轻且速度快。

如何在我们的项目中使用它?

要在您的项目中启用 Proguard,请在应用程序的 build.gradle 添加,

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

在这里,我们minfyEnabled确实如此,它激活了从文件中获取的proguard,

proguard-android.txt

它在发布块下,这意味着它只会应用于我们生成的构建的发布。

但有时当 proguard 删除太多代码时它可能太多了,它可能会破坏你的代码流。

因此,配置代码我们必须添加一些自定义规则,以确保我们从混淆中删除代码集。我们可以通过在我们的 proguard 中编写自定义规则来解决这个问题,它会在生成构建时遵守。

现在,让我们看看如何在 proguard 中编写自定义规则。

1. 保存类文件假设我们有一个数据类,某些 API 需要它来执行它,但它会生成我们对类进行混淆的构建。例如,我们有一个用户数据类,

data class User(val id: String = "")

我们不想混淆生成构建的类,然后忽略它的混淆,我们使用@Keep注释并更新代码,例如,

@Keep
data class User(val id: String = "")

此注释有助于在缩小时使用 proguard 来忽略该类。这将保留类及其成员函数,即使它们不被使用。

我们还可以使用,

-keep

在生成构建时保留类的选项。使用-keep而不是@Keep,我们可以更好地控制要保留的内容和不保留的内容。

但是,我们也可以通过使用@SerializedName(当使用 Gson 库时)来保留数据模型类中id字段的键,例如,

data class User(@SerializedName("id")
                 val id: String = "")

如果你注意到这里,我们没有使用@Keep。

2. 为班级保留成员假设我们想在收缩时只保留类成员而不是类,然后我们使用,

-keepclassmembers

在 proguard 规则文件中。这将帮助我们忽略特定类的成员。

考虑上面的 User 类,我们希望保留其中的所有公共方法。我们这样写规则,

-keepclassmembers class com.mindorks.sample.User{
    public *;
}

在这里,类 User 保留所有具有公共修饰符的成员。

3. 保留班级和成员的名字假设我们希望在代码中使用类和类成员的所有相同名称,即如果未使用该类,它将被 proguard 缩小但不会混淆,因为它已经被缩小了,所以没有需要混淆。

要完成我们使用的上述任务,

-keepnames

它的实际使用看起来像,

-keepnames class com.mindorks.sample.GlideModule

在这里,如果 GlideModule 将保留其所有的类名称和成员函数。

4.在Android中使用任何库在使用任何库时,我们可能希望为 proguard 编写一些自定义规则。库可能会在 logcat 中引发警告,或者他们甚至可能没有自己的 proguard 规则!

为了解决这个问题,我们需要在应用程序端添加自定义规则。例如,如果我们开始从任何库中收到警告,那么我们添加,

-dontwarn com.somelibrary.annotations.*

在我们的 proguard 规则中,然后我们不会在日志中看到任何警告。

要为库编写自定义规则,您可以像为自己的类编写任何其他规则一样编写它。

5. 只混淆你的代码考虑一个非常罕见的用例,您只想混淆代码而不压缩任何资源。这是一个非常罕见的用例,但可能对一些小型库有用,然后我们编写如下标志,

-dontshrink
-dontoptimize

这将帮助我们不缩小和优化代码而只是混淆。

6. 维护注解在构建应用程序时,ProGuard 会删除所有注释,它可能仍然适用于您项目中的某些代码集。但是假设我们需要不删除注释,那么我们可以选择,

-keepattributes *Annotation*

在这里,它将所有注释的属性保留在您的应用程序中。它默认出现在我们的规则中。

7.优化在 ProGuard 中编写了这么多规则之后,我们可能需要为我们的应用程序提供额外的优化层。首先,我们更新build.gradle文件,例如,

android {
  buildTypes {
    release {
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
    }
  }
}

现在,一般来说,我们不使用此选项,但这里的用例是我们必须执行额外级别的优化。

为了增加优化的周期数,例如我们想检查优化是否正确完成,如果没有完成,它将再次优化它直到我们使用一定次数,

-optimizationpasses 5

在这里,它将运行优化多达 5 次以使其更加优化。

现在,考虑一个示例,与以前相比,我们希望更细粒度地优化最终类,我们使用,

-optimizations class/marking/final

在这里,最终的类将被优化最多 5 倍,或者如果优化已经完成,它甚至可能提前结束。

现在,如果我们想优化我们现在使用的私有字段,

-optimizations field/marking/private

大多数情况下,优化是第一次完成。

如果我们根本不想优化我们使用,

-dontoptimize

这就是我们如何以不同的方式使用 proguard 使我们的应用程序更安全和更轻便的工作方式。

需要注意的重要事项:

  • 不要使用MainFragment.class.getSimpleName() 之类的东西作为片段标签。Proguard 可能会在混淆时为不同包中的两个不同片段分配相同的名称(A.class)。在这种情况下,两个片段将具有相同的 TAG。这将导致您的应用程序中的错误。
  • 保留 Proguard 的映射文件以追溯到原始代码。您可能必须将其上传到 PlayStore 控制台等不同的地方才能查看崩溃的原始堆栈跟踪。

翻译链接

https://blog.mindorks.com/applying-proguard-in-an-android-application

以上就是Android开发ProGuard使用技巧掌握的详细内容,更多关于Android开发ProGuard使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android Jetpack Compose开发实用小技巧

    目录 前言 实用小技巧 如何移除View点击阴影 Text文本如何垂直居中 如何移除Button的点击阴影 Dialog宽度如何全屏 如何提升编码效率 前言 在Compose开发的过程中,我们会经常遇到一些看起来很简单却不知道如何处理的小问题,比如去除点击阴影.Dialog全屏等问题,本文记录了这些常见小问题的处理方式.如有更好方案欢迎大佬们交流探讨- 实用小技巧 如何移除View点击阴影 这里的View指的是除了Button系列的之外,如Button.TextButton等,也就是自身没有on

  • Android MaterialAlertDialogBuilder修改按钮属性

    目录 编写按钮属性 Dialog 风格设置 效果图 编写按钮属性 首先再values/themes 或者values/style在文件下编写按钮属性 buttonBarPositiveButtonStyle对应着确认按钮 buttonBarNegativeButtonStyle对应着取消按钮 <style name="AlertDialogTheme"> <item name="buttonBarPositiveButtonStyle">@s

  • SpringBoot结合ProGuard实现代码混淆(最新版)

    前言 研究ProGuard也花了两天时间,其实最主要的时间花在前面proguard读取jar包的时候相关jar冲突的问题,但是总的来说不用拆分SpringBoot项目并且实现代码混淆已经很舒服了. ProGuard集成  1.maven的配置 具体配置如下: <build> <finalName>${artifactId}</finalName> <plugins> <plugin> <groupId>com.github.wveng

  • Android 一些常用的混淆Proguard

    一些公共的模板 ############################################# # # 对于一些基本指令的添加 # ############################################# # 代码混淆压缩比,在 0~7 之间,默认为 5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipno

  • Android Studio gradle配置packagingOptions打包so库重复

    目录 正文 pickFirst 匹配 doNotStrip 设置 merge 将匹配的文件都添加到APK中 exclude 过滤 正文 在安卓开发中,通常会使用到gradle来编译,在安卓项目的app目录下的build.gradle中是用来对编译进行配置的,packagingOptions 是其中的一个打包配置,常见的设置项有exclude.pickFirst.doNotStrip.merge. 在日常代码开发中,我们需要知其然,而知其所以然,本文章知识也是Android日常瘦身的的必备知识.

  • Android开发获取手机内网IP地址与外网IP地址的详细方法与源码实例

    在进行Android应用开发过程中,有时候会遇到获取当前Android设备所使用的网络IP地址的场景,有时候需要本地的网络IP地址,即局域网地址,更多的时候是需要当前网络的真实的对外IP地址,即真实的网络地址,如大数据分析时往往需要Android设备上传本地的外网地址.本文对各种IP地址的获取进行了总结. 首先用大家比较熟悉的电脑端局域网地址和外网地址的获取方式对比一下:(1).电脑端局域网地址获取方式,可以通过在终端命令行输入ipconfig进行查看,如下图IPv地址标识的就是本机的局域网地址

  • 解析Android开发优化之:从代码角度进行优化的技巧

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.下面我们就从几个方面来了解Android开发过程中的代码优化. 1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意.静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁.所以,一般情况下,静态变量

  • Android开发小技巧篇之集合

    1.对于过多的控件,功能类似,数量又多的,可以用include方法.在实现应用中,可以把控件放入List集合中. private void initView() { // TODO Auto-generated method stub pwd1 = (EditText) findViewById(R.id.pwd_et_6_1); pwd2 = (EditText) findViewById(R.id.pwd_et_6_2); pwd3 = (EditText) findViewById(R.i

  • Android开发中的简单设置技巧集锦

    本文实例总结了Android开发中的简单设置技巧.分享给大家供大家参考,具体如下: 1开机图片: android-logo-mask.png android-logo-shine.png 这两个图片一个在上一个在下 ./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/assets/images/android-logo-shine.png ./frameworks/base/core

  • Android开发中Flutter组件实用技巧

    目录 正文 简化 Assert 管理 更容易 imports 从按钮上移除飞溅效果 更简单的平台小工具 可见性小工具 正文 今天我将向您展示 4 个非常有用的 Flutter 技巧,您可以立即应用到您的项目.我不会向您展示任何包或扩展,就像我通常做的那样,但是非常简单,但是非常有用的提示! 简化 Assert 管理 管理 Assert 可能非常困难.如果你想在你的应用程序中多次使用一个图像,你必须一次又一次地指定路径.但是有一个简单得多的解决方案.创建一个 App Assets 类,用于存储所有

  • Android开发组件flutter的20个常用技巧示例总结

    目录 1.map遍历快速实现边距,文字自适应改变大小 2.使用SafeArea 添加边距 3.布局思路 4.获取当前屏幕的大小 5.文本溢出显示省略号 6.一个圆角带搜索icon的搜索框案例 7.修改按钮的背景色 8.tab切换实例 9.点击事件组件点击空白区域不触发点击 10.使用主题色 11.往安卓模拟器中传图片 12.控制text的最大行数显示影藏文字 13.去掉默认的抽屉图标 14.图片占满屏 15.倒计时 16.固定底部 17.添加阴影 18.隐藏键盘 19.获取父级组件大小 20.点

  • Android开发Dart Constructors构造函数使用技巧整理

    目录 参考 正文 什么是构造函数? 缺省构造函数 ー Class() 私有构造函数ー Class._() 命名构造函数ー class.Named() 私有命名构造函数ー class._Named () 工厂构造函数ー factory class Class() 参考 https://dart.dev/guides/language/language-tour#factory-constructors https://www.freecodecamp.org/news/constructors-i

  • 分享40条Android开发的优化建议

    以下是开始Android编程的好方法: 1.找一些与你想开发的功能类似的代码: 2.调整它,尝试让它变成你想要的: 3.回顾开发中遇到的问题 4.使用StackOverflow来解决遇到的问题 对每个你想实现的东西重复上述过程.采用这种方法能够激励你,因为你在保持不断迭代更新,在这个过程里面你会学到很多.当然,当你发布应用的时候你还要去做一些更深入的东西. 从一些能够正常编译的代码到成为一个应用程序,这是一个质的飞跃,比起iOS,Android则表现的更加明显.当iOS应用发布的时候,实际上只是

  • Android开发实现模仿360二维码扫描功能实例详解

    本文实例讲述了Android开发实现模仿360二维码扫描功能的方法.分享给大家供大家参考,具体如下: 一.效果图: 二.框架搭建 1.首先,下载最新zxing开源项目. 下载地址:http://code.google.com/p/zxing/ 或 点击此处本站下载. 2.分析项目结构,明确扫描框架需求.在zxing中,有很多其他的功能,项目结构比较复杂:针对二维码QRCode扫描,我们需要几个包: (1)com.google.zxing.client.android.Camera 基于Camer

  • Android开发实现图片平移、缩放、倒影及旋转功能的方法

    本文实例讲述了Android开发实现图片平移.缩放.倒影及旋转功能的方法.分享给大家供大家参考,具体如下: 解析: 1)根据原来的图片创建新的图片 Bitmap modBm = Bitmap.createBitmap(bm.getWidth()+20, bm.getHeight()+20, bm.getConfig()); 2)设置到画布 Canvas canvas = new Canvas(modBm); 3)使用矩阵进行平移- Matrix matrix = new Matrix(); ma

随机推荐

其他