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

news2024/12/29 10:49:12

作者:子不语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 true
      proguardFiles 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.coloradmin.cn/o/463893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+vue.js高校教材教学资源平台设计与实现

基本事件流&#xff1a; 1&#xff09;用户进入用户注册界面&#xff0c;本用例开始&#xff1b; 2&#xff09;系统显示需要填写的注册信息表单&#xff1b; 3&#xff09;用户填入所有注册信息&#xff0c;点击提交后发送并审核&#xff1b; 4&#xff09;系统处理相应操作&a…

centos配置nacos集群

nacos配置集群 1.官方文档地址 https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 2.环境准备 1.64 bit OS&#xff0c;支持 Linux/Unix/Mac/Windows。&#xff08;至少3台&#xff0c;或者通过修改端口在一台服务器 启动多个nacos进行测试&#xff09;。 2.64 bit …

*2.5 迭代法的收敛阶与加速收敛方法

学习目标&#xff1a; 了解迭代法的基本概念和原理。学习者需要理解迭代法的基本概念和原理&#xff0c;包括迭代过程、迭代格式、收敛性等基本概念。 熟练掌握迭代法的收敛阶和收敛速度。学习者需要了解迭代法的收敛阶和收敛速度&#xff0c;掌握如何计算迭代法的收敛阶和收敛…

linux系统防火墙开启放行其他端口

linux系统防火墙开启放行其他端口 弹性云主机防火墙放行对应端口 1、WDCP 系统端口放行&#xff1a; &#xff08;1&#xff09;3.2版本 登录wdcp面板后点击“安全管理”——“防火墙设置”——“快速添加”&#xff0c;如图填写端口&#xff08;协议默认都使用tcp&#xf…

Stable Diffusion-生成性AI的新范式

! 扩散模型&#xff08;Stable Diffusion)现在是生成图像的首选模型。由于扩散模型允许我们以提示( prompts)为条件生成图像&#xff0c;我们可以生成我们所选择的图像。在这些文本条件的扩散模型中&#xff0c;稳定扩散模型由于其开源性而最为著名。 在这篇文章中&#xff0…

LSTM//循环神经网络的个人理解

[TOP] LSTM/循环神经网络的理解 前言自省&#xff1a; 作为一名已经研究深度学习网络多年的研究员&#xff0c;虽曾多次浅尝LSTM这种网络&#xff0c;但是都没有花时间对其进行深刻解读。本文只谈对LSTM在逻辑思想上的理解&#xff0c;不进行技术解析。 1. 经典LSTM原理图 这…

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

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

TensorFlow高阶API和低阶API

TensorFlow提供了众多的API&#xff0c;简单地可以分类为高阶API和低阶API. API太多太乱也是TensorFlow被诟病的重点之一&#xff0c;可能因为Google的工程师太多了&#xff0c;社区太活跃了~当然后来Google也意识到这个问题&#xff0c;在TensorFlow 2.0中有了很大的改善。本文…

Markdown常用数学公式

1 行内公式 在两个美元符号中输入公式即可。 如$Em\times c^2$ 效果&#xff1a; E m c 2 Em\times c^2 Emc2&#xff08;注&#xff1a;\times是乘的意思&#xff09; 2 整行公式 在四个美元符号中输入公式&#xff0c;如果想要给公式后面添加编号&#xff0c;那么在公式…

windows安装mongodb6.x并设置用户名密码

安装教程 下载安装设置账号密码利用连接工具设置配置文件重新连接 下载 官网下载地址&#xff1a;点击去下载 安装 这工具很好用的&#xff0c;页面美观&#xff0c;设置账号密码也必不可少&#xff0c;推荐勾选。 设置账号密码 利用连接工具设置 必须选择一个库 use adm…

史上最全Maven教程(三)

文章目录 &#x1f525;Maven工程测试_Junit使用步骤&#x1f525;Maven工程测试_Junit结果判定&#x1f525;Maven工程测试_Before、After&#x1f525;依赖冲突调解_最短路径优先原则&#x1f525;依赖冲突调解_最先声明原则&#x1f525;依赖冲突调解_排除依赖、锁定版本 &a…

onnx手动操作001:onnx.helper

使用onnx.helper可以进行onnx的制造组装操作&#xff1a; 对象描述ValueInfoProto 对象张量名、张量的基本数据类型、张量形状算子节点信息 NodeProto算子名称(可选)、算子类型、输入和输出列表(列表元素为数值元素)GraphProto对象用张量节点和算子节点组成的计算图对象ModelP…

2023年测试岗,自动化测试我该如何进阶?卷出方向...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 先编程语言打好基…

BPMN2.0 网关

网关(gateway)用于控制执行的流向(或者按BPMN 2.0的用词:执行的“标志(token)”)。网关可以消费(consuming)与生成(generating)标志。 网关用其中带有图标的菱形表示。 排他网关 排他网关(exclusive gateway)(也叫异或网关 XOR gateway,或者更专业的,基于数据…

怎么把pdf压缩的小一点 这3种方式都很简单

在日常工作中&#xff0c;我们常常会遇到PDF文件太大无法上传的情况。这种情况在通过聊天工具传输工作PDF文件资料或在发送附件邮件时尤为常见。如果你也遇到过类似的问题&#xff0c;那么怎么把pdf压缩的小一点&#xff1f;网上的方法虽然很多但是查找起来也是非常费心费力的。…

【正点原子Linux连载】第三章 RKMedia编译和使用 摘自【正点原子】ATK-DLRV1126系统开发手册

第三章 RKMedia编译和使用 5.1 RKMedia编译 Rkmedia是RK官方封装一层简易的API&#xff0c;把RGA、MPP、RKNN等等这些接口封装成高级的接口。在SDK官方的源码目录下&#xff0c;运行以下命令进行跳转&#xff1a; cd external/rkmedia/examples/ ls 运行命令结果如下所示&…

激光雷达“进阶战”:谁在引领新风向?

激光雷达正进入新的发展阶段。 高工智能汽车注意到&#xff0c;伴随激光雷达在2022年第一波小规模前装导入&#xff0c;市场正尝试向中端车型渗透&#xff0c;以逐步迈向快速增长期。在这一阶段&#xff0c;谁能解决成本可控、性能提升的难题&#xff0c;同时帮车企用好激光雷…

鸟哥的Linux私房菜——基础学习篇(第三版) (6-10章)

基础学习篇 第六章 &#xff1a;Linux 的档案权限与目录配置第七章 &#xff1a;档案与目录管理第八章 &#xff1a;Linux 磁盘与文件系统管理第九章 &#xff1a;文件与文件系统的压缩与打包第十章 &#xff1a;Vim程序编辑器 第六章 &#xff1a;Linux 的档案权限与目录配置 …

浅述 国产仪器仪表 6121A 音频分析仪

6121A是具有音频信号产生和音频信号分析功能的测试仪器&#xff0c;适用于语音性能测试和音频功放测试等领域&#xff0c;满足电台、移动通信、音响设备和水声通信设备对频响、谐波失真和信噪比等指标的测试需求&#xff0c;是音频信号性能测试的常备仪器。 6121A音频分析仪具…

Hadoop2.x集群搭建(centos7、VMware、finalshell)

第一章 Hadoop集群安装 1.1 集群规划 集群规划规划操作系统Mac、Windows虚拟软件Parallels Desktop(Mac)、VMWare(Windows)虚拟机主机名: c1, IP地址: 192.168.10.101主机名: c2, IP地址: 192.168.10.102主机名: c3, IP地址: 192.168.10.103软件包上传路径/root/softwares软件…