我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android开发ProGuard使用技巧掌握

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android开发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使用的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android开发ProGuard使用技巧掌握

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android开发ProGuard使用技巧掌握

这篇文章主要为大家介绍了Android开发ProGuard使用技巧的掌握,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-21

掌握Golang包的使用技巧

深入理解Golang包的使用方法,需要具体代码示例在Go语言中,包(package)是组织和管理代码的基本单元。一个包可以包含多个Go源文件(以.go为扩展名),这些文件共同构成了一个功能单元。包的使用方式可以让我们更好地组织代码、提高代
掌握Golang包的使用技巧
2024-01-16

Vue.js入门到精通:掌握WebSocket开发技巧

本文将引导初学者进入Vue.js的世界,分享WebSocket开发技巧,帮助您轻松构建实时数据通信应用程序。
Vue.js入门到精通:掌握WebSocket开发技巧
2024-02-12

Node.js Native Addons:深入浅出,掌握高级开发技巧

了解了Node.js Native Addons的概念后,我们就可以将其理解为一种能够扩展Node.js功能的工具,它允许我们在Node.js中使用C或C++代码来编写本地模块,从而实现更高性能和更底层的操作。
Node.js Native Addons:深入浅出,掌握高级开发技巧
2024-02-25

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录