Android APK体积优化指南:清理项目,打造更小的APK、更快的构建速度和更好的开发体验

Android APK体积优化指南:清理项目,打造更小的APK、更快的构建速度和更好的开发体验

在任何软件项目中,开发是一个持续的过程,随着时间的推移,代码库会变得越来越复杂。这种复杂性可能导致构建时间变慢、APK体积变大,以及开发体验变得不那么高效。在本指南中,我们将介绍一些保持您的Android项目清洁高效的实践方法。

1. 移除未使用的资源

减小APK大小的最简单方法之一就是移除未使用的资源。这些资源很容易被忽视,并且随着时间的推移会逐渐累积。如果您想从项目中移除所有未使用的资源,可以使用Android Studio菜单中的"Refactor > Remove Unused Resources"。

这将查找并删除项目中的所有未使用资源。例如,如果您有一个未使用的drawable像这样:

您可以通过使用Android Studio菜单中的"Refactor > Remove Unused Resources"来删除它。

另一种移除未使用资源的方法是在您的build.gradle文件中使用shrinkResources。这不会实际从项目中删除资源,但会在构建APK时将其移除。让我们看一个如何在build.gradle文件中使用shrinkResources的示例:

buildTypes {
    release {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }

    debug {
        isMinifyEnabled = false
        isShrinkResources = false
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }
}

然后创建一个不使用shrinkResources的APK并进行分析。

在这里,您可以看到APK大小的一大部分是由我们添加的大图像引起的。现在让我们将shrinkResources添加到我们的build.gradle文件中,再次创建一个APK:

buildTypes {
    release {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }

    debug {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }
}

在这里,您可以看到通过使用shrinkResources大幅减小了APK大小。

注意:不要忘记R8也可以帮助缩小应用程序大小。不是用于移除未使用资源,而是用于移除未使用的代码。

另一种移除、事实上查找未使用资源的方法是使用lint。请记住,lint是一个静态代码分析工具,用于检查您的Android项目中潜在的错误和优化改进。它还会找到未使用的资源并在lint报告的“未使用资源”部分显示出来。

您可以通过在终端中运行以下命令生成一个lint报告:

./gradlew lint

运行此命令后,lint将生成一个报告,您可以在“未使用资源”部分中看到未使用的资源。但请记住,是否移除它们取决于您,lint只是展示未使用的资源。

2. 移除未使用的代码

移除未使用的代码是减小APK大小的另一种方法。虽然不如移除未使用资源有效,但仍然可以帮助。至少,这将使您的代码库更加清洁且更易于维护。

为了找到未使用的代码,主要包括未使用的类、方法和字段,您可以通过Android Studio菜单中的"Analyze > Run Inspection by Name > Unused Symbol"来检测它们。

这将查找项目中的未使用代码并在弹出窗口中显示出来。在那里,您可以看到未使用的代码并将其移除。

假设我们有一个未使用的类如下:

class X {
    private val y = 0

    fun z() = Unit
}

然后您可以通过使用"Analyze > Run Inspection by Name > Unused Symbol"来检测它,并在右侧点击安全删除按钮。执行此操作后,您会看到未使用类已从项目中移除。

此外,应用程序中另一个较大的部分通常来自我们使用的库。如果未使用的库保留在项目中,它们将增加APK的大小。为了找到未使用的库,您可以使用Android Studio菜单中的"Analyze > Run Inspection by Name > Unused Library"。

这将查找项目中未使用的库并在弹出窗口中显示出来。在那里,您可以看到未使用的库并将其移除。

例如,让我们将“glide”库添加到我们的项目中。然后运行这个分析:

implementation("com.github.bumptech.glide:glide:4.16.0")

然后当您运行"Analyze > Run Inspection by Name > Unused Library"时,您会发现glide库在项目中未被使用,您可以通过点击删除按钮将其移除。

在这份全面的指南中,我们探讨了优化Android项目的基本实践方法,以实现更小的APK大小、更快的构建时间和更出色的开发体验。希望这些内容能够帮助您优化项目,使其更小、更清洁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451436.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端页面访问后台hiveserver2,阶段性报错

1、运行环境 Windows11下安装VMware,VMware下安装CentOS7 Linux系统,三台虚拟机集群部署hadoop,安装hive; 在Linux下安装Eclipse,创建maven工程,使用hive-jdbc-2.3.2访问hiveserver2 2、在windows11下&…

双环PID控制详细讲解

参考博客: (1)PID双环控制(速度环和位置环) (2)PID控制(四)(单环与双环PID) (3)内外双环pid算法 0 单环PID 目标位置→系…

git撤回代码提交commit或者修改commit提交注释

执行commit后,还没执行push时,想要撤销之前的提交commit 撤销提交 使用命令: git reset --soft HEAD^命令详解: HEAD^ 表示上一个版本,即上一次的commit,也可以写成HEAD~1 如果进行两次的commit&#xf…

【Redis】Redis 缓存重点解析

Redis 缓存重点解析 推荐文章:【Redis】Redis的特性和应用场景 数据类型 持久化 数据淘汰 事务 多机部署-CSDN博客 1. 我看你的项目都用到了 Redis,你在最近的项目的哪些场景下用到了 Redis 呢? 一定要结合业务场景来回答问题&#x…

Bitmap实现原理应用场景

Bitmap是什么? 用内存中连续的二进制位(bit),用0或1标识数据是否存在。 长度为10的bitmap,1,2,3,4 在bitmap中存在。 Bitmap实现 1、字符串 数值对应字符串的下标、二进制位0&…

【linux】冯诺依曼体系与操作系统的理解

本篇文章是进程的预备知识,但也不仅仅是进程的预备知识, 也可以更好地帮助我们理解整个计算机体系。 目录 冯诺依曼体系结构:进一步理解操作系统: 冯诺依曼体系结构: 关于这张图先进行一下必要的解释: 输…

DIY可视化整合MQTT生成UniApp源码

DIY可视化整合MQTT生成UniApp源码 MQTT协议是什么? MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,专门设计用于在低带宽、不稳定的网络环境下进行物联网设备之间的通信。具有以下特点&…

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。 追赶 Sora,成为了很多科技公司当下阶段的新目标。研究者们好奇的是:Sora 是如何被 OpenAI 发掘出来的?未来又有哪些演进和应用方向? Sora 的技术报告披露了一些技术细节&…

【yolov8和yolov5】用命令快速着手训练

文章目录 1.yolov81.1.创建conda环境1.2.下载代码和环境1.3.YOLOv8训练、自测和预测的代码及解释1.3.1. YOLOv8 训练代码:1.3.2.yolov8 自测代码:1.3.3.yolov8 推理代码:1.3.4.注意: 2.yolov52.1.创建conda环境2.2.下载代码和环境…

小白必看,靠这几步写一份简单的产品说明书!

我们都知道,无论是新产品发布,还是老产品的推广,产品说明书都扮演着至关重要的角色。产品说明书可以帮助用户正确、高效地使用产品,也是传递企业发展理念、展示企业形象的有效途径。但作为一个小白,怎样才能写一份简单…

C语言数据结构之堆排序

青衿之志 履践致远 堆排序(Heapsort) 是指利用 堆 这种数据结构所设计的一种排序算法,它是 选择排序 的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。 🎥二叉堆 🎥二叉树 🔥期待小伙伴们…

K 个一组翻转链表

题目: struct ListNode{int val;ListNode* next;ListNode(): val(0), next(nullptr) {}ListNode(int _val): val(_val), next(nullptr) {}ListNode(int _val, ListNode* _next): val(_val), next(_next) {} };class Solution { public:ListNode* reverseKGroup(Li…

代码随想录训练营Day21:● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接 https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/ 题目描述 思路 遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。…

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探

宋江等人学会了钩镰枪,大胜呼延灼。呼延灼损失了很多人马,不敢回京,一个人去青州找慕容知府。一天在路上住店,马被桃花山的人偷走了,于是到了青州,带领官兵去打莲花山。 莲花山的周通打不过呼延灼&#xf…

linux设置systemctl启动

linux设置nginx systemctl启动 生成nginx.pid文件 #验证nginx的配置,并生成nginx.pid文件 /usr/local/nginx/sbin/nginx -t #pid文件目录在 /usr/local/nginx/run/nginx.pid 设置systemctl启动nginx #添加之前需要先关闭启动状态的nginx,让nginx是未…

PXI8540高速数据采集卡

XI高速数据采集卡,PXI8540卡是一种基于PXI总线的模块化仪器,可使用PXI系统,在一个机箱内实现一个综合的测试系统,构成实验室、产品质量检测中心等各种领域的数据采集、波形分析和处理系统。也可构成工业生产过程监控系统。它的主要…

EPDM和钉钉集成审批工作—移动端直接处理审批节点,高效协同!

我们发现很多我们工业界的用户,也是有很多是使用钉钉作为日常办公的。于是他们在使用EPDM时,尤其是在日常处理很多审批工作时,希望能和移动端设备和APP一起协同处理。 原文链接:https://www.ict.com.cn/article/20/993.html 钉钉目…

LeetCode刷题---即时食物配送 II

LeetCode题解 解题思路: 1.首先先求出每个用户首次订单表,将其命名为表t (select customer_id,min(order_date) as order_datefrom Deliverygroup by customer_id)as t2.与原表连接,求出在用户首次订单表中即时订单的数量的总和…

离线强化学习Offline Reinforcement Learning

离线强化学习(Offline Reinforcement Learning,简称Offline RL)是深度强化学习的一个子领域,它不需要与模拟环境进行交互,而是直接从已有的数据中学习一套策略来完成相关任务。这种方法被认为是强化学习落地的重要技术…

论文阅读:Editing Large Language Models: Problems, Methods, and Opportunities

Editing Large Language Models: Problems, Methods, and Opportunities 论文链接 代码链接 摘要 由于大语言模型(LLM)中可能存在一些过时的、不适当的和错误的信息,所以有必要纠正模型中的相关信息。如何高效地修改模型中的相关信息而不影…