想提高应用程序的用户满意度——APK体积包优化少不了

news/2024/3/29 9:58:32/文章来源:https://blog.csdn.net/weixin_61845324/article/details/130385481

作者:子不语Any

前言

减少应用程序安装包的大小,不仅仅减少用户的网络数据流量,还减少了下载等待的时间。毋庸置疑,尽量减少程序安装包的大小是十分有必要的。

通常来说,减少程序安装包的大小有两条规律:要么减少程序资源的大小,要么就是减少程序的代码量。

一、应用APK构成

在开始优化技巧之前,先来看一下APK的组成结构。可以用 Android Studio 中的 APK Analyzer 打开 APK 查看。

可以看到 APK 由以下主要部分组成:

文件/目录描述
lib/存放 so 文件,可能会有 armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips,大多数情况下只需要支持 armabi 与 x86 的架构即可
res/存放编译后的资源文件,例如:drawable、layout 等等
assets/应用程序的资源,应用程序可以使用 AssetManager 来检索该资源
META-INF/该文件夹一般存放于已经签名的 APK 中,它包含了 APK 中所有文件的签名摘要等信息
classes(n).dexclasses 文件是 Java Class,被 DEX 编译后可供 Dalvik/ART 虚拟机所理解的文件格式
resources.arsc编译后的二进制资源文件
AndroidManifest.xmlAndroid 的清单文件,格式为 AXML,用于描述应用程序的名称、版本、所需权限、注册的四大组件

二、优化代码

1.压缩代码

通过开启 ProGuard 来实现代码压缩,可以在 build.gradle 文件相应的构建类型中添加 minifyEnabled true

打开这个编译属性之后,程序在打包的时候就不会把没有引用到的代码编译进来,以此达到减少安装包大小的目的。

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

除了 minifyEnabled 属性外,还有用于定义 ProGuard 规则的 proguardFiles 属性:

  • getDefaultProguardFile(‘proguard-android.txt') 是从Android SDK tools/proguard/ 文件夹获取默认 ProGuard 设置。
  • proguard-rules.pro 文件用于添加自定义 ProGuard 规则。默认情况下,该文件位于模块根目录(build.gradle 文件旁)。

2.减少 ENUM 的使用

官方建议:Remove Enumerations,每减少一个 ENUM 可以减少大约 1.0 到 1.4 KB大小。

3.精简类库jar

有些引入到工程中的 jar 文件可能并不是专门针对移动端 App 而设计,最开始可能是运用在 Server 上的。使用这部分类库不仅额外增加包大小,还增加了编译时间。

依靠 Proguard 可能无法完全移除那些使用不到的方法,最佳的方式是使用一些更加轻量化,专门为移动 App 设计的 jar。

4.精简 so 资源

Android系 统目前支持以下七种不同的 CPU 架构:x86、MIPS、ARMv8、MIPS64 和 x86_64。

每一个 CPU 架构对应一个 ABI:armeabi、armeabi_v7a、x86、mips、mips64、x86_64。

所有 x86、x86_64、armeabi_v7a、arm64_v8a 设备都支持 armeabi 架构的 so 文件,x86 设备能够很好的运行 ARM 类型函数库,但并不保证 100% 不发生 Crash,特别是对旧设备。

一般应用完全可以根据自己业务需求选择使用 armeabi 或者 armeabi_v7a 一种支持就行。

假设只支持了 armeabi,如果有特殊要求(比如视频应用)需要用到部分 armeabi_v7a 的 so,可以通过改名放到 armeabi 文件夹中,根据手机实际情况选择加载。

  • 动态下发

比较大的 so 可以选择动态下发的形式延迟加载,代码上需要加一些判断逻辑。

5.精简语言资源

大部分应用其实并不需要支持几十种语言的国际化支持。gradle支持语言的配置,比如国内应用只支持中文:

android {defaultConfig {resConfigs "zh"}
}

6.安装包拆分

设想一下,一个 low dpi,API<14 的用户手机下载安装的 APK 里面却包含了大量 xxhdpi 的资源文件,对于这个用户来说,这个 APK 是存在很大的资源浪费。

Android 平台提供了拆分 APK 的方法,它能够根据 API Level,屏幕大小以及 GPU 版本的不同进行拆分,使得对应平台的用户下载到最合适自己手机的安装包。

更多关于安装包拆分的信息,请查看 Configure APK Splits 。

三、优化资源文件

1.移除未使用的资源

在 build.gradle 文件中配置 shrinkResources 的属性,这个属性可以帮助移除那些在程序中使用不到的资源文件,帮助减少 App 的安装包大小。

android {buildTypes {release {shrinkResources true}}
}

有选择性的提供对应分辨率的图片资源,系统会自动匹配最合适分辨率的图片并执行拉伸或者压缩的处理。

2.压缩图片

Android 打包本身会对 PNG 进行无损压缩,Tinypng 以尽量少的失真换来图片大小的锐减,效果非常好,强烈推荐这个工具。

3.推荐使用矢量图 VectorDrawable

在符合条件的情况下,使用Vertor Drawable替代传统的PNG/JPEG图片,能够极大的减少图片资源的大小。 一般针对不同 DPI 的手机都需要提供一套 PNG/JPEG 的图片,而如果使用 Vector Drawable 的话,只需要一个 XML 文件即可。 还有一点:尽量复用已经存在的资源图片,使用代码的方式对已有的资源进行复用。


其实想提高应用程序的用户满意度,每一个性能优化环节都很重要,比如: 内存优化、网络优化、卡顿优化、存储优化……等,都是必不可少的,为了让大家一次都可以了解全,所以将其整合成名为《Android 性能优化核心知识点手册》,大家可以参考下:

《APP 性能调优进阶手册》:https://qr18.cn/FVlo89

启动优化

内存优化

UI优化

网络优化

Bitmap优化与图片压缩优化

多线程并发优化与数据传输效率优化

体积包优化

《Android 性能调优核心笔记汇总》:https://qr18.cn/FVlo89

《Android 性能监控框架》:https://qr18.cn/FVlo89

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

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

相关文章

Java_常用API

Java_常用API ​ API即Application Programming Interface&#xff0c;即应用程序接口。一般来说API就是软件组件之间信息交互的桥梁&#xff0c;通过它无需访问源码。API除了有应用程序接口的含义外&#xff0c;还特质API的说明文档&#xff0c;也称为帮助文档。 1.字符串的…

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透(1)

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自远程内网穿透的文章&#xff1a;Linux使用宝塔面板搭建网站&#xff0c;并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面板&#…

读书笔记---植物基因组学(樊龙江主编)

读书笔记---植物基因组学&#xff08;樊龙江主编&#xff09; 最近看了这本书&#xff0c;作者是樊龙江教授&#xff08;浙江大学&#xff09;&#xff0c;里面主要分为两个大部分&#xff1a; 总论&#xff1a;15章 各论&#xff1a;10章详细目录可以参看下面链接&#xff1a…

MySQL中使用批量插入,但需要校验每条数据是否重复且是否已经存在数据库中

问题 批量插入一组数据&#xff0c;数据库中name和age字段组合起来不能有重复&#xff0c;如果出现重复&#xff0c;则直接跳过不插入。 name和age字段组合起来不重复&#xff0c;要求如下&#xff1a; 解决方法 建立name和age的复合索引&#xff0c;并设置为唯一索引 场景…

数列分段 马蹄集

数列分段 难度&#xff1a;黄金 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;128M 对于给定的一个长度为N的正整数数列A,,现要将其分成连续的若干段&#xff0c; 并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足 要求。 格式 输入格式&#xff1a;第一行包含…

基于Java开发的分布式在线教育系统,支持考试、直播、问答

一、开源项目简介 知道学习平台是一个基于 Java 开发的分布式在线教育系统项目采用前后端分离的企业级微服务架构引入组件化的思想实现高内聚低耦合&#xff0c;项目代码简洁注释丰富上手容易注重代码规范&#xff0c;严格控制包依赖可以帮助个人、企业或机构快速搭建一个在线…

刷爆朋友圈!前百度总裁陆奇最新AI重磅演讲:我的大模型世界观

文 / 高扬 陆奇的演讲刷屏了&#xff0c;我认真看了他的演讲稿&#xff0c;收获颇丰。 陆奇提到&#xff0c;人类社会的发展&#xff0c;大致可分为&#xff1a;农业化、工业化和数字化三个阶段。 在三个递进的阶段中&#xff0c;人类一直在探索如何减少烦琐且消耗能量的体力和…

案例1:Java超市管理系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Java文件IO操作基础

目录 前言 java.io.File 1. 构造方法 2. 方法 get类方法 文件的创建和删除 目录的创建与删除 输入输出流 InputStream FileInputStream 概述 代码实例1 代码实例2 字符集问题? Scanner 读取 OutputStream Java输入输出流的使用案例 创作不易, 多多支持&#x1f636;‍&…

漫画 | Linux之父:财务自由以后,我失眠了!

前言&#xff1a;今年是Linux诞生的30周年&#xff01; 1991年的8月&#xff0c; Linus在新闻组中公布了他正在开发的一个免费的操作系统&#xff0c;这也是以后风靡世界的Linux操作系统的雏形。 今天翻到这篇漫画&#xff0c;看到Linux的诞生过程&#xff0c;很是感慨&#x…

Unlimited “使用GPT-4 ”!它来了!

备注本文末尾附录注册登录过程 平台介绍: 聊天机器Chat.fore人front.ai是一为款基于人主工智能的题聊天的机器人主平台,旨在帮菜助企,业提可以高客户服务质是量和一效率。该平款台利用自然语精言处理技术和机器致学习的算法,能够自牛动排回答客,户的问题,提供个性化的服…

《string的模拟实现》

本文主要介绍库里面string类的模拟实现 文章目录 前言一、string的构造函数①无参的构造函数②带参的构造函数③修改构造函数 二、析构函数三、拷贝构造四、赋值重载五、返回size 、capacity和empty六、[]的运算符重载七、迭代器① 正向迭代器。② 正向const迭代器 八、string比…

接口自动化测试数据处理:技术人员必备的一项技能

目录 前言&#xff1a; 1.定义测试数据结构 2.从文件中加载测试数据 3.使用faker库生成随机测试数据 4.在测试用例中使用测试数据 总结&#xff1a; 前言&#xff1a; 在进行接口自动化测试时&#xff0c;测试数据的准备和处理是至关重要的一环。测试数据的准确性和完整性…

SAP 已根据规则拒绝服务器触发的操作 报错处理

SAP GUI在读取和写入文件的时候&#xff0c;询问是否给与权限&#xff0c;误操作点了否&#xff0c;导致报错如下 解决步骤如下&#xff1a; 点击选项 在下面的界面中依次点击安全配置---》已定制--》打开安全配置 在下面的界面找到你拒绝的条目&#xff0c;双击 将下图下拉框…

python海龟库教学

海龟库&#xff1a; 海龟绘图 “小海龟”turtle是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始&#xff0c;它根据一组函数指令的控制&#xff0c;在这个平面坐标系中移动&…

Win11打开移动热点后电脑无法上网怎么办?

Win11打开移动热点后电脑无法上网怎么办&#xff1f;有用户将自己的电脑开启移动热点来使用的时候&#xff0c;发现自己的电脑出现了无法上网的情况。那么为什么开启热点之后&#xff0c;就会无法进行上网呢&#xff1f;来看看以下的解决方法分享吧。 Win11打开移动热点无法上网…

【Python】matplotlib画散点图,并根据目标列的类别来设置颜色区间(含源代码及参数解释)

最近在进行绘图时&#xff0c;遇到了matplotlib画散点图&#xff0c;并根据目标列的类别来设置颜色区间的问题&#xff0c;但是实现的过程较为艰辛。 文章目录 一、数据准备二、第一次尝试&#xff08;失败及其原因&#xff09;2.1 失败2.2 原因 三、第二次尝试&#xff08;成功…

算法记录lday3 LinkedList 链表移除 + 链表构建 + 链表反转reverse

今日任务 ● 链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表 链表理论基础 建议&#xff1a;了解一下链接基础&#xff0c;以及链表和数组的区别 文章链接&#xff1a;https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A…

JavaWeb搭建| Tomcat配置| Maven依赖|这一篇就够了(超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

记录自己第一次项目管理(附件:WBS计划与会议纪要模板)

记录自己第一次项目管理 前言 20**年新入职到一家公司&#xff0c;刚到就接到紧急任务&#xff0c;因为上一个后端跑路&#xff0c;现在系统上出现接口报错、假接口的问题&#xff0c;客户又着急验收&#xff0c;所以入职之后&#xff0c;一直在着急改代码。最后因为系统没有…