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

server/2024/9/17 19:46:39/ 标签: 性能优化

包体积优化重要性

移动 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.ppmy.cn/server/4878.html

相关文章

Linux中断——嵌入式Linux驱动开发

参考正点原子I.MX6U嵌入式Linux驱动开发指南 一、简介 先来简单了解一般中断的处理方法: ①、使能中断,初始化相应的寄存器。 ②、注册中断服务函数,也就是向 irqTable 数组的指定标号处写入中断服务函数 ③、中断发生以后进入 IRQ 中…

idm线程越多越好吗 idm线程数多少合适 IDM百度云下载 IDM下载器如何修改线程数

IDM(Internet Download Manager)是一款流行的网络下载器,它支持多线程下载,这意味着它可以同时建立多个连接来下载文件的不同部分,从而提高下载速度。我们在使用IDM的时候总是有很多疑问,今天我们学习IDM线…

启动 UE4编辑器报 加载 Plugin 失败

启动 UE4编辑器报 加载 Plugin 失败,报如下错误: Plugin ‘SteamVR’ failer to load because module ‘SteamVR’ could not be found. Please ensure the plugin is properly installed, otherwise consider disabling the plugin for this project. …

SpringMVC(三)【REST 风格】

1、REST 风格 1.1、REST 简介 REST(Representational State Transfer),表现形式状态转换 在开发中,它其实指的就是访问网络资源的格式 1.1.1、传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user…

移植speexdsp到OpenHarmony标准系统③

speexdsp移植后已提交至openhamrony sig仓库:https://gitee.com/openharmony-sig/contest/tree/master/2022_OpenHarmony_thirdparty/speexdsp 四、将三方库加入到OpenHarmony的编译体系 根据上一步分析结果,编写gn文件,将三方库加入到OpenH…

Python 中整洁的并行输出

原文:https://bernsteinbear.com/blog/python-parallel-output/ 代码:https://gist.github.com/tekknolagi/4bee494a6e4483e4d849559ba53d067b Python 并行输出 使用进程和锁并行输出多个任务的状态。 注:以下代码在linux下可用&#xff0c…

网安DOS命令(基础)

一、DOS命令基础 提示符 根目录:进入大到分区后,最外层的目录就是根目录 工作目录:当前的所在位置/所在文件夹 切换工作目录:cd。 二、cd命令 2.1 作用 切换工作目录 2.2 格式 1 | cd 目标 2.3 案例 cd \ 进入根目录 cd…

基于机器学习的车辆状态异常检测

基于马氏距离的车辆状态异常检测(单一传感器) 基于多元自动编码器的车辆状态异常检测 基于单传感器平滑马氏距离的车辆状态异常检测 工学博士,担任《Mechanical System and Signal Processing》等期刊审稿专家,擅长领域&#xff1…

泛型的初步认识(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

14_SpringMVC

文章目录 MVCSpringMVC与JavaEE对比SpringMVCSpringMVC的核心流程SpringMVC入门案例RequestMapping注解的使用Handler方法的返回值Handler方法的形参keyvalue形式的请求参数Json请求参数 RESTful风格接口静态资源处理FilterHandlerInterceptor异常处理SpringMVC核心流程流程图 …

Cmake编译 Qt5 Demo

环境: Linux szdpu13 3.10.0-693.el7.x86_64, Qt 5.9.2 文件: //main.cc mainwindow.cc/.h CMakeLists.txt CMakeLists: cmake_minimum_required(VERSION 3.1)project(qt5Test)# Find Qt5 find_package(Qt5 COMPONENTS Core …

python应用

划分数据集 将数据集划分为训练集和测试集 import os import shutil import random # 数据集路径 images_dir ./images targets_dir ./gt # 划分后的路径 train_images_dir ./train/images test_images_dir ./test/images train_targets_dir ./train/gt test_ta…

漆包线行业你了解多少?专业漆包线行业MES生产管理系统

今天就说说漆包线行业,漆包线是工业电机(包括电动机和发电机)、变压器、电工仪表、电力及电子元器件、电动工具、家用电器、汽车电器等用来绕制电磁线圈的主要材料。 漆包线上游是铜杆行业,下游是各种消费终端,主要是电…

docker灵活部署mysql

博客简要 用docker部署mysql,并将数据库映射到主机上,并增加远端访问mysql数据库 当你使用Docker运行MySQL时,并且希望将MySQL数据库的数据存储在宿主机(也就是运行Docker的主机)上的特定路径,你需要在启动容器时通过…

【MATLAB源码-第47期】基于matlab的GMSK调制解调仿真,输出误码率曲线,采用相干解调。

操作环境: MATLAB 2022a 1、算法描述 GMSK(高斯最小移相键控)是数字调制技术的一种。下面是关于GMSK调制解调、应用场景以及其优缺点的详细描述: 1. 调制解调: - 调制:GMSK是一种连续相位调制技术&a…

46.基于SpringBoot + Vue实现的前后端分离-地方美食分享网站系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的地方美食分享网站系统设计与实现管理…

使用Python实现超参数调优

超参数调优是机器学习模型调优过程中的重要步骤,它可以帮助我们找到最佳的超参数组合,从而提高模型的性能和泛化能力。在本文中,我们将介绍超参数调优的基本原理和常见的调优方法,并使用Python来实现这些方法。 什么是超参数&…

机器学习实验------决策树

第1关:什么是决策树 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 第2关:信息熵与信息增益 任务描述 本关任务:掌握什么是信息增益,完成计算信息增益的程序设计。 import numpy as npdef calcIn…

【刷题】 二分查找进阶

送给大家一句话&#xff1a; 你向神求助是因为相信神&#xff0c;神没有回应你是因为神相信你 ε≡٩(๑>₃<)۶ &#xfeff;ε≡٩(๑>₃<)۶ &#xfeff;ε≡٩(๑>₃<)۶ 一心向学 二分查找进阶 1 前言Leetcode 852. 山脉数组的峰顶索引题目描述算法思…

【系统分析师】系统安全分析与设计

文章目录 1、安全基础技术1.1 密码相关1.1.1对称加密1.1.2非对称加密1.1.3信息摘要1.1.4数字签名1.1.5数字信封 1.2 PKI公钥体系 2、信息系统安全2.1 保障层次2.2 网络安全2.2.1WIFI2.2.2 网络威胁与攻击2.2.3 安全保护等级 2.3计算机病毒与木马2.4安全防范体系 【写在前面】 记…