全文干货——关于Android包体积优化的深入探索(一)

APK 瘦身优化在实际的项目中优先级是比较低的,因为做了之后它的好处不是那么明显,尤其是那些还没有到 稳定期 的项目,我们都知道,App 的发展历程是从 项目初期 => 成长期 => 稳定期,对于处于 发展初期与成长期 的项目而言,可能会做 启动优化、卡顿优化,但是一般不会做 瘦身优化瘦身优化最主要的好处是对应用 下载转化率 的影响,它是 App 业务运营的重要指标之一,在项目精细化运营的阶段是非常重要的。因为如果你的 App 与其它同类型的 App 相比 Apk 体积要更小的话,那么你的 App下载率就可能要高一些。而且,包体积越小,用户下载等待的时间也会越短,所以下载转换成功率也就越高。所以,安装包大小与下载转化率的关系 大致是成反比 的,即安装包越大,下载转换率就越小。一个 80MB 的应用,用户即使点了下载,也可能因为网络速度慢、突然反悔导致下载失败。而对于一个 20MB 的应用,用户点了下载之后,在犹豫要不要下的时候可能就已经下载完了。

而且,现在很多大型的 App 一般都会有一个 Lite 版本的 App,这个也是出于下载转化率方面的考虑。

2、应用市场

Google Play 应用市场强制要求超过 100MB 的应用只能使用 APK 扩展文件方式 上传。当使用 APK 扩展文件方式 上传时,Google Play 会为我们的应用 托管 扩展文件,并将其 免费提供 给设备。扩展文件将保存到设备的共享存储位置(SD 卡或可安装 USB 的分区;也称为“外部”存储),应用可以在其中访问它们。在大多数设备上,Google Play 会在下载 APK 的同时下载扩展文件,因此应用在用户首次打开时便拥有了所需的一切。但是,在某些情况下,我们的应用必须在应用启动时从 Google Play 下载文件。如果您想避免使用扩展文件,并且想要应用程序的下载大小大于100 MB,则应该使用 Android App Bundles 上传应用程序,此时应用程序最多可提供150 MB的压缩下载大小Android App Bundles 就是 Android 应用程序捆绑包,它能够让 App 以 添加动态功能模块的方式 去解决 APK 大小较大的问题。如下,就是由一个基本模块和两个动态功能模块组成的 Android App Bundle APK 的组成结构图:

3、渠道合作商的要求

此外,还有一个原因,当我们的 App 做大之后,可能需要跟各个手机厂商合作预装,这些 渠道合作商会对你的 App 做详细的要求,只有达到相应的要求后才允许你的 App 预装到手机上。而且,越大的 App 其单价成本也会越高。所以,瘦身也是我们项目做大之后一定会遇到的一个问题。

体积过大对 App 性能的影响

此外,包体积除了会影响 应用的下载转化率 之外,主要还会对 App 三个方面 的性能有一定的影响,如下所示:

  • 1)、安装时间:比如 文件拷贝、Library 解压,并且,在编译 ODEX 的时候,特别是对于 Android 5.0 和 6.0 系统来说,耗费的时间比较久,而 Android 7.0 之后有了 混合编译,所以还可以接受。最后,App 变大后,其 签名校验 的时间也会变长
  • 2)、运行时内存:Resource 资源、Library 以及 Dex 类加载都会占用应用的一部分内存
  • 3)、ROM 空间:如果应用的安装包大小为 50MB,那么启动解压之后很可能就已经超过 100MB了。并且,如果 闪存空间不足,很可能出现“写入放大”的情况,它是闪存和固态硬盘(SSD)中一种不良的现象,闪存在可重新写入数据前必须先擦除,而擦除操作的粒度与写入操作相比低得多,执行这些操作就会多次移动(或改写)用户数据和元数据。因此,要改写数据,就需要读取闪存某些已使用的部分,更新它们,并写入到新的位置,如果新位置在之前已被使用过,还需连同先擦除;由于闪存的这种工作方式,必须擦除改写的闪存部分比新数据实际需要的大得多。即最终可能导致实际写入的物理资料量是写入资料量的多倍

2、APK 组成

我们都知道,Android 项目最终会编译成一个 .apk 后缀的文件,实际上它就是一个 压缩包。因此,它内部还有很多不同类型的文件,这些文件,按照大小,共分为如下四类:

  • 1)、代码相关classes.dex,我们在项目中所编写的 java 文件,经过编译之后会生成一个 .class文件,而这些所有的 .class 文件呢,它最终会经过 dx 工具编译生成一个 classes.dex
  • 2)、资源相关resassets、编译后的二进制资源文件 resources.arsc 和 清单文件 等等。res 和 assets 的不同在于 res 目录下的文件会在 .R 文件中生成对应的资源 ID,而 assets 不会自动生成对应的 ID,而是通过 AssetManager 类的接口来获取。此外,每当在 res 文件夹下放一个文件时,aapt 就会自动生成对应的 id 并保存在 .R 文件中,但 .R 文件仅仅只是保证编译程序不会报错,实际上在应用运行时,系统会根据 ID 寻找对应的资源路径,而 resources.arsc 文件就是用来记录这些 ID 和 资源文件位置对应关系 的文件
  • 3)、So 相关lib 目录下的文件,这块文件的优化空间其实非常大。

此外,还有 META-INF,它存放了应用的 签名信息,其中主要有 3个文件,如下所示:

  • 1)、MANIFEST.MF:其中每一个资源文件都有一个对应的 SHA-256-Digest(SHA1) 签名,MANIFEST.MF 文件的 SHA256(SHA1) 经过 base64 编码的结果即为 CERT.SF 中的 SHA256(SHA1)-Digest-Manifest 值。
  • 2)、CERT.SF:除了开头处定义的 SHA256(SHA1)-Digest-Manifest 值,后面几项的值是对 MANIFEST.MF 文件中的每项再次 SHA256(SHA1) 经过 base64 编码后的值。
  • 3)、CERT.RSA:其中包含了公钥、加密算法等信息。首先,对前一步生成的 CERT.SF 使用了 SHA256(SHA1)生成了数字摘要并使用了 RSA 加密,接着,利用了开发者私钥进行签名。然后,在安装时使用公钥解密。最后,将其与未加密的摘要信息(MANIFEST.MF文件)进行对比,如果相符,则表明内容没有被修改。

3、APK分析

下面,我们就来学习 APK 分析的 四种常用方式

1、使用 ApkTool 反编译工具分析 APK

第一种方式,就是使用 ApkTool 这个反编译工具,它的官网地址如下:

ApkTool 官方网站

其具体的 反编译命令 如下所示:

apktool d xxx.apk

下面,我们就来使用 ApkTool 来对应用进行反编译。

ApkTool反编译实战
1、下载并配置apktool

apktool 下载配置官方文档

我这里仅介绍 Mac OS X 平台上的下载配置,其它平台请点击上方链接查看。

  • 1)、下载脚本,保存为 apktool 文件。

  • 2)、下载最新版 apktool.jar(需要翻墙)

  • 3)、将下载的 jar 包重命名为 apktool.jar

  • 4)、配置环境变量,这里有两种方案,如下所示:

  • 第一种是直接将 apktool 和 apktool.jar 移到 /usr/local/bin 目录,但是这里需要 root 权限,命令前加 sudo,回车后输入密码即可。

  • 第二种是在 ~/.bash_profile 文件下配置,首先新建 apktool 文件夹,将两个文件放到这个文件下,打开终端,使用 vim 加上环境配置,其命令如下所示:

// 1、使用vim命令在命令行打开.bash_profile文件,并可以在命令行
// 上编辑,当然,你也可以直接打开.bash_profile文件
vim ~/.bash_profile
// 2、在.bash_profile最后加上这一行即可
export PATH=前面路径/apktool:$PATH
// 3、使编辑后的配置生效
source ~/.bash_profile

  • 5)、最后,使用以下命令将两个文件权限设置为 可执行 即可:

sudo chmod a+x file

2、使用ApkTool分析APK

我们在命令行下输入以下命令对 APK 进行反编译,如下所示:

java -jar apktool_2.3.4.jar apktool d app-release.apk

反编译完成之后,它就会在当前的文件夹下面生成 app-release 的目录,目录结构如下所示:

这样我们就可以看到当前 App的具体组成 了。下面,我们介绍下第二种 APK 分析 的方式。

2、使用AS 2.2之后提供的Analyze APK

Analyze APK 具有如下功能:

  • 1)、可以直观地查看到 APK 的组成,比如大小、占比等等
  • 2)、查看 dex 文件的组成
  • 3)、对不同的 APK 进行对比分析

下面,我们就来具体实战一下,需要注意的是,我们可以 直接将电脑上的 apk 拖进 AS 中就可以自动使用 Analyze APK 打开 apk。然后,我们就可以看到 APK 文件的绝对大小以及各组成文件的百分占比,如下图所示:

可以看到,Awesome-WanAndroid 应用的 classes.dex 的大小为 3.3MB,总占比为 42.2%。并且,lib和 res 目录也有 1.9MB,总占比大概为 25%,因此,对于 Awesome-WanAndroid App的优化方向就应该是 dex 为主、so 和 res 为辅 了。此外,我们还可以查看 classes.dex 中还包含有哪些类,如下图所示:

我们平时在做 竞品分析 的时候,就能够很方便地来 看一下我们 App 的竞品用到了哪些第三方 SDK。同时,我们也可以从清单文件中很方便地查看 APK 文件的最终版本,因为 Analyze APK 能够直接对清单文件进行解析。

此外,在应用右上角还有一个 Compare with previos APK 的按钮,我们点击它之后,就可以 将当前的 APK 与别的版本的 APK 进行对比,这样就可以对新旧两个版本的 APK 文件大小进行对比。

接下来,我们再介绍下第三种 APK 分析的方式。

3、使用 nimbledroid 进行 APK 性能分析

nimbledroid官网

nibledroid 是美国哥伦比亚大学的博士创业团队研发出来的分析 Android App 性能指标的系统,分析的方式有静态和动态两种方式,如下所示:

  • 1)、静态分析:可以分析出APK安装包中大文件排行榜,Dex 方法数和知名第三方 SDK 的方法数及占代码整体的比例
  • 2)、动态分析:可以给出 冷启动时间, 列出 Block UI 的具体方法, 内存占用, 以及 Hot Methods, 从这些分析报告中, 可以 定位出具体的优化点

它的使用方式其实非常简单,只需要直接上传APK 即可。然后,nimbledroid 网站的后台就会自动对 APK 进行分析,并最终给出一份 全面的 APK 分析报告

下面,我们再来介绍最后一种 APK 分析工具,即二进制检查工具 android-classshark

4、使用 android-classshark 进行 APK 分析

android-classshark项目地址

android-classshark 是一个 面向 Android 开发人员的独立二进制检查工具,它可以 浏览任何的 Android 可执行文件,并且检查出信息,比如类的接口、成员变量等等,此外,它还可以支持多种格式,比如说 APK、Jar、Class、So 以及所有的 Android 二进制文件如清单文件等等。下面,我们就来使用 android-classshark 来进行一下实战。

android-classshark 实战

首先,我们从它的 Github 地址上下载对应的 ClassyShark.jar,地址如下所示:

ClassyShark.jar-下载地址

然后,我们双击打开 ClassShark.jar拖动我们的 APK 到它的工作空间即可。接下来,我们就可以看到 Apk 的分析界面了,这里我们点击 classes 下的 classes.dex,在分析界面 左边 可以看到该 dex 的方法数和文件大小,并且,最下面还显示出了该 dex 中包含有 Native Call 的类。如下图所示:

此外,我们点击左上角的 Methods count 还可以切换到 方法数环形图标统计界面,我们不仅可以 直观地看到各个包下的方法数和相对大小,还可以看到各个子包下的方法数和相对大小。如下图所示:

小结

本篇主要阐述了APK瘦身优势与分析,下一篇将深入探究代码瘦身方案。

最后这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

上述【高清技术脑图】以及【配套的架构技术PDF】可以 关注我 【主页简介】 或者+vx免费获取

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
oid开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值