版权声明

1.本文版权归原作者所有,转载需注明作者信息及原文出处。

2.本文作者:赵裕(vimerzhao),永久链接:https://github.com/vimerzhao/vimerzhao.github.io/blob/master/android/2020-02-11-apk-size-opt.md

3.作者公众号:V大师在一号线 。联系邮箱:vimerzhao@foxmail.com


背景

安装包膨胀的原因

业务的增加、产品的演进是安装包大小增加的本质原因。但是在演进之路上,由于一些所谓的技术债务,如:

  • 使用的资源未经裁剪(如全量字体文件、分辨率过大的图片)
  • 不合理的大资源(如大的视频、音频可以在线拉取)
  • 已下线业务没有及时清理相关代码、资源
  • 等等

正是由于这些疏忽,安装包有了不必要的增加,这也是我们需要优化的部分。

安装包优化的价值

可能有的人觉得,现在基本是4G、WiFi的网络环境,手机设备的性能和存储空间也非常充足,所以用户对安装包大小应该不是十分敏感。但是,这其实是一种错觉,更多的时候应该看自己的目标市场,如果是一二线城市当然没问题,但如果是三四线城市、农村等下沉市场或者印度、巴西等海外市场,上述假设显然不成立了。

一般来说,安装包大小会影响以下指标:

  • 下载转化率
  • 安装成功率
  • 推广成本
  • 运行内存、空间占用

综上,对于一个“有余力”的团队,安装包大小的优化还是很有必要的。

安装包优化的套路

由前面的原因可知,从业务层面来看,安装包大小的优化是“解铃还须系铃人”,即:

  • 压缩资源
  • 大资源转成在线拉取
  • 排查无用业务并下线

这些方法都比较常规,更像是对症下药,下面梳理一些技术上普适的方法,独立于业务,在上面那些方法都尝试后,还可以使安装包大小“更下一层楼”。

安装包的主要构成就是代码和资源,所以优化也是从这两个方面着手。

代码

混淆

一般是通过ProGuard,但很多用不好,且存在管理问题。最后一看项目,很多类被Keep住了,也不知道历史背景是啥。

Dex优化

  1. 通过工具移除行号信息,带来的问题是无法回溯Crash位置,但可以解决
  2. 多Dex时,通过重排Dex避免交叉索引,实现起来比较复杂
  3. Dex压缩,把实际的Dex压缩,首次启动通过一个壳去加载,会影响启动速度,但是可以解决,也比较复杂

so优化

so的优化手段和Java代码其实比较类似,核心还是通过机制化的手段去裁剪、压缩。

资源

资源本身

  • 通过工具扫描无用资源,有些由于项目自身原因,可能没有显式引用,但外置的编译脚本会修改项目自身脚本,这就很坑了
  • 资源格式的优化,如PNG转JPG(除去alpha通道),转webp格式等
  • 字体文件只保留使用的,资源自身的二次优化

资源索引

通过AndResGuard工具压缩资源名称,进而降低索引文件的大小。

感悟

核心思想

  • 删除不用的(显而易见)
  • 压缩/转移有用的(如图片、字体文件,如大资源的转移,混淆信息的map表也是一种转移)
  • 精简系统产生的(dex重排)

常规的手段很容易到达瓶颈,高深的手段又有复杂、兼容性等诸多问题,但综合来看,还是两点:

  • 深刻理解底层:apk编译流程、dex格式、资源引用、启动流程、加载流程原理等
  • 深刻理解工具:ProGuard(很多人的ProGuard配置都是Copy修改),ReDex,AndResGuard等

权衡之道

很多时候,优化就是权衡,重要的是取舍:

  • 压缩了Dex,就增加了启动速度
  • 拿掉了行号,就增加了恢复Crash堆栈的难度
  • 混淆了代码,就增加了编译脚本的复杂度
  • 等等

根本出路

  • 建立监控:团队每年都会优化一次安装包大小,尤其是删除、压缩资源的时候,总是一头雾水,不明白这个资源引入的目的,也不敢轻举妄动。最后有一套系统,让增量时有记录,让下线时有提醒,及时解决,而不是每到年底还一次技术债。
  • 制定标准:某种意义上上,安装包大小的优化不是某个人的事情,而是团队的事情,最好有相关的实践指南或CodeReview标准。当有人不合理地引入资源,又或者业务下线后对无效逻辑置之不顾时,能有规则来约束这种行为。

参考

以上


欢迎扫码关注作者公众号,及时获取最新信息。

技术|Android安装包优化的更多相关文章

  1. 技术|Android安装包极限优化

    版权声明 1.本文版权归原作者所有,转载需注明作者信息及原文出处. 2.本文作者:赵裕(vimerzhao),永久链接:https://github.com/vimerzhao/vimerzhao.g ...

  2. Android安装包相关知识汇总 (编译过程图给力)

    转自: https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=208008519&idx=1&sn=278b7793699 ...

  3. android 安装包签名问题探究

    1.首先先科普一下,android为什么需要给安装包签名: 所有的Android应用程序在发布之前都要求开发人员用一个证书进行数字签名,anroid系统不会安装没有进行签名的由于程序.    平时我们 ...

  4. Android安装包apk文件在某些版本操作系统上安装解析包出错问题的解决办法

    当我们将Android升级功能的中的下载新版本apk文件存放在data/data/xxx.apk位置时,在有的些版本的手机中安装可能会出现安装包解析出错的问题,对于该问题的解决方案是提升该文件的权限. ...

  5. unity 导出 android安装包配置方案

    原地址:http://blog.csdn.net/u012085988/article/details/17393111 1.jdk本人安装的是win32版的(虽然系统是64位的.但听说装64位的导出 ...

  6. JFrame实现批量获取Android安装包安全证书MD5

    今天遇到一个需求.获取全部apk的签名的MD5.以下是我使用Java SE实现的一个工具.贴出核心源码.希望给有须要的朋友有所帮助. 界面例如以下: 仅仅须要制定.apk文件所在的文件夹就可以,核心代 ...

  7. 专项测试——移动app安装包检测

    一.背景和现状 安装包的重要性无需多提,针对安装包质量控制越来越严格和规范,包括证书.文件大小.安装成功率等,APP的证书及混淆是影响APP的安装成功率及代码安全性的很大因素,随着功能迭代,安装包也会 ...

  8. 减少iOS应用程序安装包大小

    安装包优化大小方法: <资源优化> 1.去除无用资源 通过几次项目的升级后,项目中会出现一些没有用到的图片.这些图片在我们导入到项目中后,之后项目升级过程后并没有再次用到. 那这些图片我们 ...

  9. 爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结

    本文由爱奇艺技术团队原创分享,原题<爱奇艺Android客户端启动优化与分析>. 1.引言 互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Andro ...

随机推荐

  1. C++ 动态数组与链表

    动态数组与链表 动态数组的大小不定,内存连续的,可以根据自己的需要,增加或删除元素.知道第一个元素的,那么就可以知道第二个元素,通过下标访问.如果中间插入一个元素,那么中间后面的元素的下标全部都要改变 ...

  2. 深入理解vue的watch

    深入理解vue的watch vue中的wactch可以监听到data的变化,执行定义的回调,在某些场景是很有用的,本文将深入源码揭开watch额面纱 前言 watch的使用 watch的多种使用方式 ...

  3. TensorFlow——MNIST手写数据集

    MNIST数据集介绍 MNIST数据集中包含了各种各样的手写数字图片,数据集的官网是:http://yann.lecun.com/exdb/mnist/index.html,我们可以从这里下载数据集. ...

  4. ipynb 文件转 py

    前言 好多机器学习的文件都是ipynb的格式,如果想用其他编辑器的需要转为py的格式 命令: jupyter nbconvert --to script *.ipynb jupyter: pip3 i ...

  5. 简单易学的Linux 命令整理

    Linux 是目前应用最广泛的服务器操作系统,基于 Unix,开源免费,由于系统的稳定性和安全性,市场占有率很高,几乎成为程序代码运行的最佳系统环境.linux 不仅可以长时间的运行我们编写的程序代码 ...

  6. 贪心 park

    来总结一道非常经典的好题 这一道题是通过贪心实现的 首先看到这一题的时间复杂度 n<=100000 需要一个比较玄学的做法 我们先假设把题干改成这个样子 一圈n个车位 停在每个车位都有一定的代价 ...

  7. SpringBoot项目配置Date类型数据自动格式转换

    application.yml加入配置 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8

  8. HTTP图解笔记(一)—— 第1章 了解Web及网络基础

    TCP/IP协议族 网络是在TCP/IP协议族的基础上运作的,HTTP是一个子集 OSI四层: 应用层:通用的应用服务协议,FTP.DNS.HTTP ↓ 传输层:提供计算机之间的数据传输,TCP.UD ...

  9. lisp学习总结(二)-----lisp应该探索发展的方向

    现在流行一种语言叫做Clojure,他是lisp直接嫁接到java的结果,但是我就感觉这却成为lisp的失败. 因为lisp最强大最有优势的能力是构造抽象,构造设计思想,而不是运行期以确定的方式运行, ...

  10. [LOJ#2743][DP]「JOI Open 2016」摩天大楼

    题目传送门 DP 经典题 考虑从小到大把数加入排列内 如下图(\(A\) 已经经过排序): 我们考虑如上,在 \(i\) ( \(A_i\) )不断增大的过程中,维护上面直线 \(y=A_i\) 之下 ...