Android 性能优化(七):APK安装包体积优化

news2024/11/28 10:40:15

包体积优化重要性

移动 App 特别关注投放转化率指标,而 App 包体积是影响用户新增的重要因素,而 App 的包体积又是影响投放转化率的重要因素。

Google 2016 年公布的研究报告显示,包体积每上升 6MB 就会带来下载转化率降低 1%, 当包体积增大到 100MB 时就会有断崖式的下跌 。对于应用商店,普遍有一个流量自动下载的最大阈值,如 应用宝,下载的app超过100M,用流量下载时,会弹窗提示用户是否继续下载,这对下载转化率影响是比较大的。某淘对新业务超过 1M 要总裁审批,一般在平台组都卡掉了。

  • 下载转化率:包体积越小,下载转化率越高;
  • 性能影响:安装时间长、占用内存大;

Android Apk结构

lib(主要是so文件)

  • 主要集中在三方SDK

依赖SDK不规范:高德地图3D->2D;图片加载库Glide、Fresco重复。

已不用的SDK及时下线:阿里短视频SDK下线获得2M优化空间; 

SDK及时升级:有些SDK会有优化so体积的版本升级,如阿里播放器升级,带来1M收益 ;

  • flutter的dart代码

原生能够提供的功能,不用三方库;

已废弃的项目及时移除项目;

dart代码混淆; 


asserts:

  • flutter资源

存在2X和3X图,仅保留一套即可 ;

图片压缩,在引入图片前进行压缩,或转换webp或SVG格式;

  • weex离线包

仅保留核心weex的场景的离线包;

  • 表情图片、Json动画

上传到服务器上动态请求下发;


res:

  • drawable

规范资源图片的位置,仅保留一套图;

对png图片转成webp,webp也可再用tinypng压缩,如果UI不通过,让UI提供压缩图片 ;

使用代码实现View的背景设置;

大图、gif放上传服务器;

  • layout

精简删除废弃的layout资源,目前有2327个layout文件;

  • 基础数据Json文件

仅保留核心基础数据,其他可做动态下发;

  • 废弃资源

定期使用Analyze检查并删除各自模块无用资源;


Dex:

三方库、工具库统一,引入新的三方库前,先确认项目中是否存在功能相同库;

无用或下线的功能及时删除;

可以被混淆的代码不要Keep掉,遵照《Android混淆开发规范》;

灰度功能关闭后及时删除相应逻辑及代码;


So 压缩

so压缩是减少so文件的单个体积。

gradle打包时会对工程中的so库进行压缩,最终生成apk包的体积会减小。

android:extractNativeLibs="true"

缺点:在apk安装时,系统会再次对压缩后的so文件解压,从而造成安装apk的时间变长。

minSdkVersion >= 23 默认 android:extractNativeLibs= false。

大so动态下发

针对有些so文件压缩后,体积仍然很大,比如占比超过10%的情况,可以选择动态下发。

主要有下面四个步骤:

  1. 下载so库
  2. 解压so库
  3. 校验so库
  4. 加载so库

另外,当动态下发的so没有下载、解压、校验、加载完成之前,如果用户进入到了相关的业务场景,需要做好对应的兜底机制。比如在某场景中,使用了 opencv 库来做图片的二维码识别,当so没下载下来时,要识别二维码就会被兜底到 zxing。


优化的成绩

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

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

相关文章

获取公募基金净值【数据分析系列博文】

摘要 从指定网址获取公募基金净值数据,快速解析并存储数据。 (该博文针对自由学习者获取数据;而在投顾、基金、证券等公司,通常有Wind、聚源、通联等厂商采购的数据) 导入所需的库:代码导入了一些常用的库…

CSS3 伪元素与伪类选择器区别、详解与应用实例

伪元素与伪类两者都是通过在选择器后附加一个特定的关键字来定义,遵循相似的语法规则,并在 CSS 规则块中设置相应的样式。伪元素 能够通过 content 属性添加或替换内容。例如,:before 和 :after 可以插入文本、图像或其他生成的内容。伪类 仅…

Go 单元测试之Mysql数据库集成测试

文章目录 一、 sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm 初始化注意点 一、 sqlmock介绍 sqlmock 是一个用于测试数据库交互的 Go 模拟库。它可以模拟 SQL 查询、插入、更新等操作,并且可以验证 SQL 语句的执行情况,非常适合用于单元测试…

数据赋能(58)——要求:数据赋能实施部门能力

“要求:数据赋能实施部门能力”是作为标准的参考内容编写的。 在实施数据赋能中,数据赋能实施部门的能力体现在多个方面,关键能力如下图所示。 在实施数据赋能的过程中,数据赋能实施部门应具备的关键能力如下。 理性思维与逻辑分…

ES源码四:网络通信层流程

听说ES网络层很难?今天来卷它😄 前言 ES网络层比较复杂,分为两个部分: 基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块(NetworkModule) 入口还是上一章的创建Node构造方法的地方…

如何爬出 Kotlin 协程死锁的坑?

作者:悬衡 一、前言 在 Java 中有一个非常经典的死锁问题, 就是明明自己已经占用了线程池, 却还继续去申请它, 自己等自己, 就死锁了, 如下图和代码: // 这段代码将死锁到天荒地老final ExecutorService executorService Executors.newSingleThreadExecutor();exe…

4月27日复旦大学-华盛顿大学EMBA项目教授分享暨招生说明会

复旦大学-华盛顿大学EMBA项目2024年4月27日精彩看点:      国际视野助推商业价值,“她力量”赋能管理      数字营销浪潮中,如何重新定义价值创造      主讲嘉宾    复旦大学-华盛顿大学EMBA项目教授分享暨招生说明会     …

Redmi Turbo 3新品发布,天星金融(原小米金融)优惠加持护航新机体验

Redmi新十年使命不变,挑战不断升级。Redmi Turbo 3,作为Turbo系列的开篇之作,将自身定位为新生代性能旗舰,决心重塑中端性能新格局。据悉,Redmi Turbo 3于4月10日已正式发布。预售期间更是连续数日,蝉联小米…

C++:文件内容完全读入

在上一篇文章中我留下了一点小坑:使用>> 运算符,这个运算符默认将空格作为分隔符,所以在文件内容读取的时候发现在读到空格时就会停止读取,导致读取内容不完整,这显然不符合日常的使用用能,那么今天就…

科学突破可能开创6G通信新时代

格拉斯哥大学开发的火柴盒大小的天线可以为全息通话、改进自动驾驶和更好的医疗保健的世界铺平道路。 格拉斯哥大学表示,这种创新的无线通信天线将超材料的独特特性与复杂的信号处理相结合,有助于构建未来的 6G 网络。 数字编码动态超表面天线&#xf…

python-flask结合bootstrap实现网页小工具实例-半小时速通版

参考: Python之flask结合Bootstrap框架快速搭建Web应用_支持bootstrap的python软件-CSDN博客 https://blog.csdn.net/lovedingd/article/details/106696832 Bootstrap 警告框 | 菜鸟教程 https://www.runoob.com/bootstrap/bootstrap-alert-plugin.html flask框架…

机器学习实验二-----决策树构建

决策树是机器学习中一种基本的分类和回归算法,是依托于策略抉择而建立起来的树。本文学习的是决策树的分类 1. 构建决策树流程 选择算法:常用的算法包括ID3、C4.5、CART等。 划分节点:根据数据特征和算法选择,递归地划分节点&…

C++算法题 - 矩阵

目录 36. 有效的数独54. 螺旋矩阵48. 旋转图像73. 矩阵置零289. 生命游戏 36. 有效的数独 LeetCode_link 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…

Linux安装和使用Android Debug Bridge(ADB)

目录 1、开发环境和工具 2、ADB是什么? 3、安装ADB 3.1、使用包管理器安装 ADB 3.2、手动安装 ADB 4、使用ADB 4.1、连接设备 4.2、执行shell命令 4.3、安装应用程序 4.4、截取屏幕截图 4.5、模拟按键和手势 4.6、上传文件到Android设备 4.7、从Android设备下载文件…

el-table 表格列里添加 树

<el-table-column label"部门名称" align"center"><template slot-scope"scope"><el-cascader filterable :disabled"type 3 ? true : false" :show-all-levels"false":ref"provinceTree scope.row.…

【机器学习300问】72、神经网络的隐藏层数量和各层神经元节点数如何影响模型的表现?

评估深度学习的模型的性能依旧可以用偏差和方差来衡量。它们反映了模型在预测过程中与理想情况的偏离程度&#xff0c;以及模型对数据扰动的敏感性。我们简单回顾一下什么是模型的偏差和方差&#xff1f; 一、深度学习模型的偏差和方差 偏差&#xff1a;衡量模型预测结果的期望…

[Meachines][Easy] Usage

Main # nmap -sV -sC 10.10.11.18 --min-rate 1000 # echo 10.10.11.18 usage.htb admin.usage.htb >> /etc/hosts 在/forget-password发现存在SQL注入 emailmaptnh%40log.comAND5212%3dBENCHMARK(5000000,MD5(0x62434473))--NKGG $ sqlmap -r request.txt --level 5 -…

js: UrlDecode解码、UUID和GUID、阿拉伯数字转为中文数字

UrlDecode解码&#xff1a; UrlDecode 是一个 JavaScript 函数&#xff0c;用于将经过 URL 编码的字符串转换为普通字符串。 URL 编码是将特殊字符转换为它们的百分比编码表示形式的过程。这些特殊字符包括空格、斜线、井号&#xff08;#&#xff09;等。UrlDecode 函数将这些…

【C++杂货铺】继承

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 继承的概念和定义 &#x1f4c2; 概念 &#x1f4c2; 定义 &#x1f4c1; 基类和派生类对象赋值转换 &#x1f4c1; 继承中的作用域 &#x1f4c1; 派生类的默认成员函数 构造函数 析构函数 拷贝构造函数 赋值重载…

html select 支持内容过滤列表 -bootstrap实现

实现使用bootstrap-select插件 http://silviomoreto.github.io/bootstrap-select <!DOCTYPE html> <html> <meta charset"UTF-8"> <head><title>jQuery bootstrap-select可搜索多选下拉列表插件-www.daimajiayuan.com</title>&…