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

包体积优化重要性

移动 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。


优化的成绩

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

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

相关文章

114 接口中幂等性的保证

前言 同样是 面试问题 如何确保接口的 幂等性 幂等是一个 较为抽象的概念, 多次重复访问, 不会导致业务逻辑的异常 这里从增删改查, 几个方面列一下 一般来说, 我们核心需要关注的就是 新增 和 更新 对于 增加元素, 首先针对唯一约束进行校验, 然后再处理新增的相关业…

二刷大数据(三)- Flink1.17

目录 Flink概念与SparkStreaming区别分层API 工作流程部署模式**Local Mode****Standalone Mode****YARN Mode****Kubernetes Mode****Application Mode** 运行架构stand alone 核心概念算子链任务槽 窗口窗口**窗口的目的与作用****时间窗口(Time Windows&#xff…

vue3中web前端JS动画案例(一)

上述案例主要使用定时器&#xff0c;和绝对定位产生动画 <script setup> import { ref, onMounted, watch } from vue // ----------------------- 01 js 动画介绍--------------------- // 1、匀速运动 // 2、缓动运动&#xff08;常见&#xff09; // 3、透明度运动 //…

抖店底层逻辑,关于5个“为什么”的答案~

我是王路飞。 很多人对抖店的底层逻辑有一种抗拒心态&#xff0c;不想学习和了解。 认为做抖店不就是开店卖货嘛&#xff0c;什么火、什么有热度卖什么就好了&#xff0c;了解那么多“理论知识”有什么用呢&#xff1f; 但往往正是这些基础理论&#xff0c;底层逻辑&#xf…

Linux系统一键安装DataEase结合内网穿透实现公网访问本地WebUI界面

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

PMM2 MySQL监控管理工具

目录 1. PMM介绍 2. 安装PMM服务端 2.1 安装docker 2.1.1 下载docker 2.1.2 上传docker包 2.1.3 启动守护进程 2.1.4 查看docker状态 2.2 安装PMM 2.2.1 下载镜像 2.2.2 load镜像 2.2.3 查看镜像 2.2.4 创建容器 2.2.5 运行镜像 2.2.6 验证PMM服务器 2.2.7 删除…

MySQL行格式(row format)

MySQL行格式&#xff08;row format&#xff09; 表的行格式决定了其行的物理存储方式&#xff0c;这反过来又会影响查询和 DML 操作的性能。随着单个磁盘页面容纳更多行&#xff0c;查询和索引查找可以更快地工作&#xff0c;缓冲池中需要的高速缓存内存更少&#xff0c;写出…

【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)

基于python语言&#xff0c;采用经典离散粒子群算法&#xff08;DPSO&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRPTW&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. …

.netcore+vue新生分班系统的设计与实现

.netcore vue新生分班系统的设计与实现说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于.net core架构和mysql数据库vue 东北石油大学新生分班系统的设计与实现 功能模块&#xff1a; 登录 注册学生 忘记密码 系统首顶 个…

fatal error C1001: An internal error has occurred in the compiler

VS2008驱动项目A&#xff0c;集成一个Wzarid生成的驱动LIB项目B&#xff0c;在编译64位驱动时,出现以下错误&#xff1a; 1>------ Build started: Project: xxxx, Configuration: Release x64 ------ 1>Linking... 1>fatal error C1001: An internal error has occu…

AI时代下,普通人能怎么做?

AI玩法千千万&#xff0c;你已经知道了多少呢&#xff1f;是否已经实践起来&#xff1f; 大家好&#xff0c;我是程序员影子 | 全网同名 一名致力于帮助更多朋友快速入门编程的程序猿 今天&#xff0c;我将以小白入门的视角带着大家了解一下目前火热的AI实践玩法&#xff1b…

SQL --索引

索引 INDEX 伪列 伪装起来的列&#xff0c;不容易被看见&#xff0c;要特意查询才能看见 ROWNUM&#xff1a; 是对查询结果自动生成的一组连续的自然数序号。 SELECT emp.*,ROWNUM FROM emp例题&#xff1a;查询emp表中&#xff0c;前三个员工 SELECT * FROM * from emp w…

工业控制(ICS)---MMS

MMS 工控领域的TCP协议&#xff0c;有时wireshark会将response包解析为tcp协议&#xff0c;影响做题&#xff0c;如果筛选mms时出现连续request包&#xff0c;考虑wireshark解析错误&#xff0c;将筛选条件删除手动看一下 initiate&#xff08;可以理解为握手&#xff09; i…

QQ浏览器模仿Arc,推垂直工作栏引领新体验潮流|TodayAI

之前在硅谷大受欢迎的AI浏览器Arc一经推出就立即引起了广泛关注&#xff0c;Arc自称不仅仅是一款浏览器&#xff0c;而且还是一个“与互联网同规模的平台”。如今&#xff0c;中国的QQ浏览器也想借Arc的热潮之势&#xff0c;同样采用了类似Arc的垂直工作栏&#xff0c;声称能够…

【总结】jdk安装配置后,执行报错java: error while loading shared libraries: libjli.so

目录 问题现象排查分析解决方法 问题现象 安装jdk后&#xff0c;配置好了环境变量&#xff0c;但执行java -vesion命令时&#xff0c;报错。 java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory 看起来这个…

就业分析丨云计算数通双认证学员,入职海外年薪50W

扫码联系誉天猎头部&#xff0c;可享高薪岗位内推、职业规划岗前测评等服务 誉天&#xff0c;我的职业启航之地 大家好&#xff0c;我是誉天学员万*,回想起那段为梦想而奋斗的日子&#xff0c;我的心中充满了感慨。誉天在行业内一直深受好评&#xff0c;在我心中播下了技能的种…

14.多态(多态的构成条件、虚函数的重写、抽象类也就是纯虚函数的类、虚函数表、单继承和多继承的虚函数表)

1.多态的概念 ​ 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;…

java动态代理--JDK代理

1.概述 JDK动态代理&#xff1a;只能代理实现了接口的类&#xff0c;代理对象是实现了目标对象所有接口的代理类 使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来创建代理对象&#xff0c;工作通过反射机制完成。 2.实现接口InvocationHandler …

目标检测——防护装备数据集

一、重要性及意义 防护装备中的头盔和背心检测具有至关重要的重要性和深远的意义&#xff0c;主要体现在以下几个方面&#xff1a; 首先&#xff0c;它们对于保护工作人员的人身安全起着至关重要的作用。在各类工作环境中&#xff0c;尤其是那些涉及高空作业、机械操作或交通…

windows10 VS2017 grpc1.48.0环境配置

本文介绍在Windows10 下使用Visual Studio 2017编译gRPC 1.48.0并配置开发环境&#xff0c;以及开发、配置一个简单的c服务端以及客户端。&#xff08;过程令人头疼&#xff0c;参阅了大量博客&#xff0c;实际操作都存在问题&#xff0c;整理一下&#xff0c;希望对后来者有帮…