11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?

整理 | 郑丽媛

出品 | CSDN(ID:CSDNnews)

前一阵,马斯克“狂吹”微信,赞其功能强大,中国人就像“住在微信里面一样”,是一个很好的 App。结果27日一早,微信就因功能太多上了热搜:

据了解,最初在 2011 年 1 月发布的微信 1.0,其安卓 APK 安装包的体积仅有 457KB,可谓是名副其实的“小而美”;而到了 11 年后的如今,微信 8.0.24 版本的安装包已经达到了 257MB——11 年来,微信安装包膨胀了 575 倍

突然之间,觉得自己好像掌握了手机内存越来越大、空间却越来越小的答案……不过,膨胀了几百倍的微信到底加了些啥呢?

近日,B 站 UP 主“科技老男孩”就通过逆向工程,揭秘了这些年来微信 APK 安装包膨胀的 575 倍到底用来做什么了,即他所说的:“微信在这 11 年是怎么从小而美变成大而肥的。”

(图片来自 B 站 UP 主“科技老男孩”视频截图)

微信从“小而美”到“大而肥”

由于 575 倍这一数字来自微信 1.0 和微信 8.0.24 之间的差距,因此这位 UP 主逆向工程和对比的也正是这两个微信版本。

首先需要明确的是,APK 安装包本质上只是一种 zip 压缩包,这也就意味着安装好的 App 往往会比其 APK 文件要大得多。

以微信 8.0.24 为例,其 APK 安装包 257MB,但解压后大小为 617MB,占用空间 634MB,包含 12639 个文件,是解压前的 2.4 倍。与之相比,微信 1.0 解压后只有 737KB,占用空间 1.03MB,文件数也只有 199 个——也就是说,当初微信 1.0 仅用 199 个文件就实现了“聊天”这个核心功能

随后,该 UP 主便分别查看这两个微信版本解压后的文件夹,对比其中差距所在。

(1)assets 文件夹

在微信 8.0.24 中,该文件夹大小 78.4MB,占用空间 80.1MB,包含 1137 个文件,主要装着微信的各类资源素材,如自带的 emoji 表情、不同页面下的字体、音频文件、图片资源、微信电话铃声等。

而在微信 1.0 中,可能因为当时微信用的都是系统自带的资源,所以并没有 assets 文件夹。

值得一提的是,在解析微信 8.0.24 的 assets 文件夹时,UP 主吐槽了两点:

编程最忌讳的就是拼音命名,因为这会使代码很难维护,而腾讯程序员却将“收款到账”的音频文件直接命名为“skdz”

“收款到账”的音频放在 assetssound 路径下,而同为音频文件的“微信电话铃声”却直接放在了 assets 路径下,可见“新版微信的开发非常混乱”。

(2)lib 文件夹

在微信 8.0.24 中,该文件夹大小为 337MB,占用了该微信版本空间的 54%,里面装的是各种第三方动态库,如解压文件所用到的 7-Zip 库,实时解码播放 ape、flac、mp3、ogg 音频文件用到的库,编解码视频用到的 ffmepg 库等等,一共有 157 个库。

据 UP 主分析,这些库的由来大多是因为“面向复制粘贴编程”:很多情况下,编程并不是从 0 开始硬写,而是缺少什么功能就去网上找实现这种功能的“轮子”再缝合进 App 里,这就导致了往 App 塞入的功能越多,其安装包体积也会因为各种动态库的加入变得越臃肿

反观微信 1.0,其 lib 文件夹下只有 1 个动态库,大小也仅有 127KB,即可实现“聊天”这个最重要的功能。

(3)META-INF 文件夹

该文件夹用于存储开发者的数字签名,微信 8.0.24 中的大小为 2.1MB,微信 1.0 中则为 34.4KB。

(4)r/res 文件夹

在微信 8.0.24 中,r 文件夹大小 29.9MB,它在微信 1.0 中对应的是 res 文件夹,大小为 250KB,主要存放 App 的资源库,如各种图形化界面的框架素材、图标素材等。

(5)resdec 文件夹

不论在微信 1.0 还是在微信 8.0.24 中,该文件夹都是空的,因此不再赘言。

(6)其他文件

除此之外,在微信 8.0.24 的根目录下还有 17 个文件:配置文件 AndroidManifest.xml,记录 classes.dex 文件 MD5 值的 baseInfo.dat,记录文件之间对应关系的 resources.arsc,以及 14 个 classes.dex 文件,也就是 Java 经过源码编译后生成的 Java 字节码文件,即微信编译后的程序本体。

在微信 8.0.24 中,14 个 classes.dex 文件共占 161 MB,对应微信 1.0 中仅有 1 个,且仅占 256KB

(7)源代码组成

分析完解压文件后,UP 主称还通过逆向工程查看了编译前的微信源代码,结果令其震惊。

先看微信 1.0 源代码所包含的内容,其组成源代码的基本单元如下:

再看微信 8.0.24 的源代码组成单元:

通过对比可轻易看出微信 8.0.24 中各种单元都增加了 500 倍以上,尤其是 string 字符串,从最初的 1845 个到新版中暴涨近 150 万个。UP 主对此调侃道:“可见新版微信中有 99.9% 的内容都是垃圾,真正实现聊天部分的代码可能只占 0.1%。”

在视频尾声,这名 UP 主总结道:“微信把自己当操作系统来做 App,什么打车、快递、外卖、游戏,不管你用不用得上都给你塞进去,然后淘宝、支付宝、美团等各种 App 又来占一遍你的手机空间,导致手机提升的性能和增加的内存都用来运行这些垃圾功能的代码,而用户丝毫没有选择权。”

网友:“电脑一个浏览器,手机塞满 App”

“科技老男孩”的这则视频在 B 站引起大量讨论的同时,也登上了微博热搜,众多网友对他的解析发表了自己的看法。

有许多人认可 UP 主的结论

“电脑一个浏览器,手机塞满 App。”

“微信占我十个多 G,手机已经快爆了。”

部分人指出,这名 UP 主的分析并不专业,且过于主观

“作为一名 Android 开发,这个视频是篇爽文,但毫无技术价值,没几个正确的点。”

“虽然微信垃圾是事实,但你这个逆向明显说不通。”

“主观意识太强烈了。”

同时也有部分网友借此说出了一些理想化建议

“如果可以自己下载模块化就好了,在基础聊天功能上,短视频和看点自己选择性下载。”

“希望软件都出个纯净版,不要整些花里胡哨、不需要的功能增加内存。”

一个个超级 App 的诞生,是福还是祸?

还记得在去年的微信之夜上,微信创始人张小龙曾说:“微信一开始就是奔着小而美的产品去做的,现在也依然还是一款小而美的产品。”可当我们看着手机里即便经常清缓存也几乎稳居 App 内存占用第一名的微信,不免有些茫然。

最初,微信作为“方便快捷简便”的“轻聊天工具”走红,而如今,承载了支付、短视频、搜索、购物等多项功能的微信俨然已成长为一个超级 App。

除却微信,目前许多企业做 App 也是一副“我全都要”的态度,为了吸引并稳固更多流量,不管相不相关、好不好用,只要火的功能就都往里塞,一个个都想成为全能浏览器、超级 App。

但实际上对于很多用户来说,这些功能往往并不会被用到,App 体积的增加对他们而言也并不必要——这就引发了一个思考:一个又一个超级 App 的诞生,对消费者而言究竟是便利的狂欢还是福利的悲哀?

最后,可否分享你手机中的微信占据多少内存?你对微信又有什么建议或看法?

参考链接:

https://www.bilibili.com/video/BV1cB4y1b77n?spm_id_from=333.337.search-card.all.click

https://s.weibo.com/weibo?q=%E5%BE%AE%E4%BF%A1%E5%AE%89%E8%A3%85%E5%8C%8511%E5%B9%B4%E8%86%A8%E8%83%80575%E5%80%8D&Refer=realtime_weibo

《新程序员001-004》全面上市,对话世界级大师,报道中国IT行业创新创造!

原文地址:https://www.toutiao.com/article/7125619528154743330/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340