Flutter之Android包大小分析

一、背景

空的flutter项目编译生成Android apk包其体积约50MB左右,而空的原生Android项目编译生成的Android apk包其体积仅3.6MB左右,二者相差巨大!什么原因导致这一结果呢?

基本猜测:flutter生成的Android安装包apk中包含了大量flutter基础库代码。这些基础代码以什么样的形式存在apk中的呢?

为了解决以上疑惑故对flutter的Android包进行分析对比。

二、Android包结构

Android apk包本质是一个zip压缩包,可以将apk后缀改为zip并通过解压工具得到内部文件,一般包含如下文件:

  • assets目录 存放需要打包到APK中的静态文件
  • lib目录 程序依赖的Native库
  • res目录 存放应用程序的资源
  • META-INF目录 存放应用程序签名和证书的目录
  • AndroidManifest.xml 应用程序的配置文件
  • classes.dex dex可执行文件
  • resources.arsc 资源配置文件

如原生apk包文件:


2.png

apk反编译工具

通过反编译工具可以进一步分析apk包内容,常用工具如下:

  • apktool:编译和反编译apk,从apk中提取图片和布局资源。
  • dex2jar:将可运行文件classes.dex反编译为jar源码文件。
  • jdex-gui:查看aar源码文件 。
  • apkanalyzer :Android Studio自带的apk分析工具。

三、原生APK与Flutter对比

一般apk分debug和release版本,故分别对这两种情况对比!

3.1 Debug包对比

flutter的debug apk包:
1.png
原生Android的debug apk包:
2.png
二者Debug包对比
对比.png

总体体积(下载体积为apk应用商店内包实际大小):

名称 压缩包 解压文件 下载体积
Android-app.apk 3.6MB 8.10 MB 3MB
flutter-app.apk 49.5MB 125 MB 49.2MB
diff(flutter-android) 45.9MB 116.9MB 46.2MB

通过对比发现,造成debug包体积差异过大的主要原因(解压文件对比):

  • lib下面添加了三种ABI的动态库,体积约94MB

  • assets目录下添加了一个kernel_blob.bin的二进制文件,体积约38MB

3.2 Release包对比

flutter的release apk包:包含三种ABI的.so库
release-flutter-app.png
Android的release apk包:
release-android-app.png
二者Release包对比
release-apk-对比.png

总体体积(下载体积为apk应用商店内包实际大小):

名称 压缩包 解压文件 下载体积
android-release-app.apk 3.2MB 7.4 MB 2.6MB
flutter-release-app.apk 15.7MB 35.5 MB 15.6MB
diff(flutter-android) 12.5MB 28.1MB 13.0MB

通过对比发现,造成release包体积差异过大的主要原因(解压文件对比):

  • lib下面添加了三种ABI的动态库,体积约34.1MB

  • assets目录下文件,体积约1MB

四、flutter生成不同ABI动态库的apk包

通过剔除不必要的ABI动态库.so包,从而减少apk包体积大小。

4.1 ABI简介

不同的 Android 设备使用不同的 CPU,而不同的 CPU 支持不同的指令集。CPU 与指令集的每种组合都有专属的应用二进制接口 (ABI)。 android支持的 ABI如下:

cpu架构.png
ABI 适用设备 市场占有率 适配厂家
armeabi-v7a 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它。 一些老旧的手机 淘宝
arm64-v8a 第8代、64位ARM处理器 目前主流版本 微信
armeabi 第5代、第6代的ARM处理器,早期的手机用的比较多 较少 支付宝、手Q、旧版微信
x86 平板、模拟器用得比较多 很少
x86_64 64位的平板 很少

高版本的arm架构会兼容低版本的arm架构,一般厂商只会选定一个cpu架构进行适配,为了减少apk包大小我们可以选定armeabi-v7a或者arm64-v8a即可。

4.2 flutter打不同ABI的apk包

通过下面的命令,可以生成不同ABI的apk包,该命令默认release并开启压缩:

flutter build apk --split-per-abi

flutter-so-apk.png

包大小列表:

flutter-arm64.png
flutter-armeabi-v7a.png
flutter-x86-64.png

打包含单独ABI的release apk包平均大小6MB左右,可以有效的降低包体大小。

五、总结

初始项目的flutter打apk包情况如下:

  • debug环境:包体较大,因为没有压缩且包含多个ABI的so文件以及资源文件,包大小为50MB左右。
  • release环境:包体较小,因为开启了压缩且仅打单个CPU架构的so文件,包大小可以降低到6MB左右。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 参考文章 如何缩减接近50%的Flutter包体积 Flutter-Apk 大小优化探索 简单知识回顾 relea...
    尖叫_阅读 14,641评论 0 9
  • While there is life,there is hope.一息若存,希望不灭。 前言 基于flutter...
    sun_argc阅读 1,133评论 0 3
  • 一、Flutter异常与Crash Flutter异常指的是Flutter程序在运行时所抛出的异常分为: Dart...
    AlanGe阅读 2,526评论 0 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,162评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,033评论 0 4