• 超能网 >> 
  • 课堂 >> 
  • 手机 >> 
  • 超能课堂(97):为什么iOS的APP比安卓大好几倍?

超能课堂(97):为什么iOS的APP比安卓大好几倍?

2017-7-13 19:57  |  作者:alexallen   |  关键字:超能课堂,iOS,Android

分享到:

同样的一个APP,iOS版标注的所需容量大小要远比Android大好几倍,这使得不少用户以为iOS浪费存储空间,那么为什么会出现这种情况呢?

本文约1932字,需3分钟阅读

大家如果细心的话,可能会发现在Android的应用商店和iOS的App Store上,同一个APP,iOS版标注的APP所需容量大小要远比Android大好几倍,比如一个QQ,在Google Play Store上只有34MB,但在App Store上居然有231MB之巨,这使得不少用户以为iOS浪费存储空间,甚至一些阴谋论都出来了。那么为什么会出现这种情况呢?


iOS的APP比Android大这么多?

这问题放在过去,有个流行的说法是,由于苹果的iPhone、iPad有好几种不同的屏幕分辨率,所以iOS的APP里面包含了几套图像资源,导致了App占用巨大,而Android系统中对图像的处理要求不高,所以不同设备用了通用的资源,APP自然就小了。这个解释虽然有一定的道理,但放在今时今日就不大成立了。所以下面要讲讲两个系统的APP文件大小有什么不一样。

安装文件分析

我们都知道,在Android中的安装文件类型为apk,iOS为ipa,其实简单来讲,这两个安装文件都是个压缩包。以微信APP的apk(版本为6.5.10)为例,原文件大小在Windows上(NTFS文件系统)显示为44.1MB,经过WinRAR解压缩后占用空间为93.7MB。 而微信APP的ipa(版本为6.5.11)原文件大小为145MB,解压缩后占用186MB。

咋一看,ipa无论解压缩都确实要比apk大上不少,那来看看两个系统的安装文件里面包含了什么。


微信apk对比ipa文件大小

一个apk文件解压缩后,主要有assets、lib、META-INF、r、AndroidManifest.xml、classes.dex、resources.arsc这几个文件和文件夹。


微信apk内含文件和文件夹

当然这里不是编程课堂,所以只讲下这些文件中占容量最大的一般是assets目录、lib目录、res目录和classes.dex文件。

- assets目录存放静态文件,app需要用到一些音效、字体、表情包等都在此。
- lib目录为依赖库文件,现在的apk大多都是包含armeabi的lib库,如果apk兼容x86,还会有x86的依赖库,这样这个目录就会更大一点了。
- r即res、resource目录,主要存放资源文件,如图片、影像文件。
- classes.dex文件则是Android中Dalvik虚拟机的可执行文件,由JAVA下的class文件编译而来。

iOS的ipa安装包则相对简单一些,主要文件夹为Payload,在Windows上会显示里面有一个APP名字命名的文件夹,如微信为WeChat.app,包括了APP所有需要的执行和资源文件。


微信ipa主要文件夹为WeChat.app

对比两个安装文件,微信APP的主执行文件为WeChat,文件大小为132MB,其它文件其实只有54MB。Android的主执行文件包括classes.dex文件和lib目录,微信APP里面这些文件大小为52.6MB,而其它文件为41.7MB。


iOS版微信主执行文件大小


Android版微信主执行文件大小

由此可见,两个系统的同样一个APP,安装包里面除开主要的执行文件,其它资源文件占用空间大小相差不多,并非是文章开头所说的不同苹果设备需要不同的套图,导致安装文件巨大。但仅从安装文件来看,iOS的APP确实要比Android版的大好几倍,那下面还要讲到两个系统的APP安装机制。

APP安装机制

以前Android主要采用Dalvik虚拟机,执行apk中的classes.dex文件,但后来为了提高APP启动和运行速度,从4.4.4版本开始,Android换用了ART虚拟机,apk安装到系统的过程中会进行预编译,把apk中的dex文件编译成oat文件,把字节码经过JIT即时编译器转换为机器识别码,所以apk安装包中有关程序部分的文件更像是一堆代码,占用空间较小。


Android 4.4开始引入的ART虚拟机

iOS则不一样,由于iOS最早是基于mac电脑上的OS X同源开发,所以在APP的安装方式上也相似,简单来说iOS的APP本身就是一个大文件夹,类似Windows上解压即用的绿色软件,当你从App Store中下载安装到iPhone上,更像是一个复制文件的过程。

Android的安装机制,使得APP安装文件的大小,不代表安装到手机上之后的大小,而在iOS上则是安装文件有多大,安装完后基本上也是多大。那么实际情况如何呢?

实测APP安装后占用空间

这里在基于Android 7.1.2的Lineage 14.1和iOS 10.3.2系统上,对比微信和网易云音乐两个APP在应用商店上文件大小和安装后文件大小。

在应用商店上,微信APP的标注大小仅为44.1MB,但事实上APP安装完成后,查看大小却增大到104MB。网易云音乐APP标注大小为29.8MB,安装后为54.33MB。


Android上微信


Android上网易云音乐

App Store上微信APP的标注大小为123MB,下载安装完后为121.3MB,应用大小却变小了,网易云音乐APP同样更是标注103MB,安装完成后为89.8MB,这是由于测试使用的是iPhone SE,App Store上标注的大小应该是以iPhone 7 Plus作标准的。这也说明在App下载安装过程中,App Store会根据设备型号来适配必要的文件。


iOS上微信


iOS上网易云音乐

可以明显看到,Android在安装APP后大小出现翻倍的情况,因为前面提到,现在Android系统安装APP过程中会进行编译,所以装完后APP真正的占用空间大小就出来了,这也解答了不少网友向小超哥(微信9501417)询问,在Android上安装一个才十几MB的APP,装完后存储空间不见了上百MB的疑问。

Android应用商店上只是显示APK安装文件的大小,而在App Store上显示的APP大小是安装到手机后的占用空间大小。这样的好处是,用户们会很直观地知道自己手机还够不够容量安装新的APP,而不会出现明明手机设置里面显示还有几十MB空余存储,却连个十几MB的APP都安装不进的困惑。

当然Android更小的安装文件方便下载到手机上,现在最新Android 7.1.2已经大幅提升安装APP速度,只是在安装之前,大家要注意预留2-3倍于安装文件的存储空间

总结来看,本期课堂提出的“为什么iOS上APP比Android大几倍”其实是个伪问题,真实的情况是:

- App Store上标注的APP大小是安装之后的大小,Android应用商店大多只是显示安装文件的大小

- Android安装APP后,占用空间其实和iOS版相差不大

    
  • 游客  9天之前

    IOS和android都在用,抛开应用体验不说,android有个好处就是清理软件能很清楚地标识出“垃圾”与缓存,还有微信专请,大文件扫描等等。。 但是IOS只能一个一个区应用内清除了。。。64G也不够用啊。

    支持(3)  |   反对(0)  |   举报  |   回复

    43#

  • 
  • yjhercules一代宗师 9天之前

    那是不可能的ARK虚拟机产生的大量文件都在rom上
    而DALVIK虚拟机产生的文件都在ram中
    同样的软件 肯定安卓占用rom多,
    因为java产生的大量半成品码都是占用空间的

    支持(0)  |   反对(0)  |   举报  |   回复

    42#

  • 
  • wuhansen博士 9天之前

    Android 7那个安装机制不过是用到才编译 虽然安装快但是第一次打开有时候会卡到怀疑人生啊 好在空闲好像还是会编译 但是每次刚刷完系统那酸爽

    支持(0)  |   反对(1)  |   举报  |   回复

    41#

  • 
  • 游客  07-16 02:42

    安卓QQ安装后第一次打开,首屏会明确显示正在下载资源文件,我觉得需要下载完成后再来比较一次

    支持(0)  |   反对(0)  |   举报  |   回复

    40#

  • 
  • 游客  07-15 17:43

    IOS下载一个QQ运营商能收2块钱流量费.安卓用户下一个QQ运营商只能收到3毛.

    支持(1)  |   反对(0)  |   举报  |   回复

    39#

  • 
  • 游客  07-14 23:31

    好文章 涨知识

    支持(2)  |   反对(0)  |   举报  |   回复

    38#

  • 
  • 游客  07-14 16:43

    游客:

    本来是想进来看看最终是谁占的空间更大,结果小编木有进行总结性陈词,囧
    07-14 07:55
  • 支持(0)  |   反对(1)  |   举报  |   回复
  • 游客:

    最后一句话不是总结吗
    07-14 11:14
  • 支持(0)  |   反对(0)  |   举报  |   回复
  • 不是还有一个55跟89吗?

    支持(0)  |   反对(0)  |   举报  |   回复

    37#

  • 
  • alexallen编辑 07-14 15:36

    游客:

    专业解答来了:
    IOS的可执行文件其实包含了对多个不同CPU架构的编译结果,一般包括:arm64、armv7、armv7s当然有些特别大的APP还包含了其他架构的编译结果,ios为了优化运行速度所以在使用xcode会为不同的CPU架构单独编译一份二进制文件最后组装在一起,这个技术在苹果称作“胖二进制”,所以添加的架构支持越多安装包越大。虽然IOS也有了类似于java的bitcode的技术可以在安装时再编译,但是目前开发者都不太愿意支持这个技术(需要所有的类库都支持,有些东西需要重新开发)

    Android的所谓可执行文件其实并不是二进制文件而是字节码文件(一种经过编译的但不对应最终CPU架构的文件),在运行的时候相当于还需要再编译一次成为二进制文件才能真正运行(新的虚拟机技术是在安装时编译,或者闲置时编译)。

    所以IOS文件大是因为包含了多个CPU架构的的可执行文件,Android小是因为其实安装包还没编译成最终的可执行文件。
    07-14 12:40
  • 支持(7)  |   反对(0)  |   举报  |   回复
  • 很感谢有这样的解答。

    支持(0)  |   反对(0)  |   举报  |   回复

    36#

  • 
  • 游客  07-14 14:36

    戾气这么重,赶紧扛着键盘去边境守卫边疆吧

    支持(6)  |   反对(3)  |   举报  |   回复

    35#

  • 
  • 游客  07-14 14:10

    好TMD鸡冻(手动眼斜)

    支持(0)  |   反对(0)  |   举报  |   回复

    34#

  • 
  • holy00angel小学生 07-14 12:43

    专业解答来了:
    IOS的可执行文件其实包含了对多个不同CPU架构的编译结果,一般包括:arm64、armv7、armv7s当然有些特别大的APP还包含了其他架构的编译结果,ios为了优化运行速度所以在使用xcode会为不同的CPU架构单独编译一份二进制文件最后组装在一起,这个技术在苹果称作“胖二进制”,所以添加的架构支持越多安装包越大。虽然IOS也有了类似于java的bitcode的技术可以在安装时再编译,但是目前开发者都不太愿意支持这个技术(需要所有的类库都支持,有些东西需要重新开发)

    Android的所谓可执行文件其实并不是二进制文件而是字节码文件(一种经过编译的但不对应最终CPU架构的文件),在运行的时候相当于还需要再编译一次成为二进制文件才能真正运行(新的虚拟机技术是在安装时编译,或者闲置时编译)。

    所以IOS文件大是因为包含了多个CPU架构的的可执行文件,Android小是因为其实安装包还没编译成最终的可执行文件。

    支持(7)  |   反对(0)  |   举报  |   回复

    33#

  • 
  • 游客  07-14 12:40

    专业解答来了:
    IOS的可执行文件其实包含了对多个不同CPU架构的编译结果,一般包括:arm64、armv7、armv7s当然有些特别大的APP还包含了其他架构的编译结果,ios为了优化运行速度所以在使用xcode会为不同的CPU架构单独编译一份二进制文件最后组装在一起,这个技术在苹果称作“胖二进制”,所以添加的架构支持越多安装包越大。虽然IOS也有了类似于java的bitcode的技术可以在安装时再编译,但是目前开发者都不太愿意支持这个技术(需要所有的类库都支持,有些东西需要重新开发)

    Android的所谓可执行文件其实并不是二进制文件而是字节码文件(一种经过编译的但不对应最终CPU架构的文件),在运行的时候相当于还需要再编译一次成为二进制文件才能真正运行(新的虚拟机技术是在安装时编译,或者闲置时编译)。

    所以IOS文件大是因为包含了多个CPU架构的的可执行文件,Android小是因为其实安装包还没编译成最终的可执行文件。

    支持(7)  |   反对(0)  |   举报  |   回复

    32#

  • 
  • yjhercules一代宗师 07-14 12:30

    安卓硬件倒是次要,毕竟现在跑分弱吧,一部分是java这种结构和效率造成。fps慢呀,加载慢呀,java虚拟机关系大,毕竟java效率不如c
    c又不是汇编。像wps这种软件,看一本几百万字的小说,用户数据文件可以达到1g 多, 16g rom一下就占了1g 而且wps 或者word
    打开百万文字的txt 文档速度是很慢的,原因多,这一点不如苹果

    支持(0)  |   反对(1)  |   举报  |   回复

    31#

  • 
  • 游客  07-14 11:14

    游客:

    本来是想进来看看最终是谁占的空间更大,结果小编木有进行总结性陈词,囧
    07-14 07:55
  • 支持(0)  |   反对(1)  |   举报  |   回复
  • 最后一句话不是总结吗

    支持(0)  |   反对(0)  |   举报  |   回复

    30#

  • 
  • 游客  07-14 10:25

    apk安装过程是将源代码编译成机器码的过程,所以体积会增加;ipa安装过程是直接将机器码复制在手机上的过程,所以体积不变;但就本人而言,体积小的安装包下载方便一点。

    支持(4)  |   反对(0)  |   举报  |   回复

    29#

  • 
  • alexallen编辑 07-14 09:50

    游客:

    到最后还是没讲清楚为什么ios比安卓大,超能的小编也开始学uc标题党了
    07-14 09:43
  • 支持(1)  |   反对(1)  |   举报  |   回复
  • 这里是解释为什么“大几倍”,不是为什么“大”。
    两个系统的开发不一样,iOS的APP不一定就比Android的大。

    支持(0)  |   反对(0)  |   举报  |   回复

    28#

  • 
  • 游客  07-14 09:43

    到最后还是没讲清楚为什么ios比安卓大,超能的小编也开始学uc标题党了

    支持(1)  |   反对(1)  |   举报  |   回复

    27#

  • 
  • tnt1983大学生 07-14 09:38

    一个通讯工具而已,引得到你这个心态和智商,哥们,有病得治。

    支持(5)  |   反对(0)  |   举报  |   回复

    26#

  • 
  • 游客  07-14 09:26

    可以扩展的安卓手机趋向越来越少,你要头撞墙不?

    支持(0)  |   反对(0)  |   举报  |   回复

    25#

  • 
  • 游客  07-14 08:53

    这种科普非常赞!

    支持(4)  |   反对(0)  |   举报  |   回复

    24#

查看全部评论(38)

回复