GVKun编程网logo

11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?(为什么微信变小了怎么回事)

21

想了解11年膨胀575倍,微信为何从“小而美”变成了“大而肥”?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于为什么微信变小了怎么回事的相关问题,此外,我们还将为您介绍关于6个小而美的es

想了解11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于为什么微信变小了怎么回事的相关问题,此外,我们还将为您介绍关于6个小而美的es6新特性、8个小而美的前端库、AIoT是什么?为何突然变成了智能制造的主流趋势?、asp.net – NavigateUrl =“#”变成href =“SubFolder /#”?的新知识。

本文目录一览:

11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?(为什么微信变小了怎么回事)

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行业创新创造!

6个小而美的es6新特性

6个小而美的es6新特性

译者:动静若参商
译文:http://www.zcfy.cc/article/1795
原文:https://davidwalsh.name/es6-f...
 
JavaScript社区中的每个人都喜欢新API、新语法和新特性——可以更优雅,更智能,更有效的完成重要任务。ES6带来了很多好东西,并且在过去的一年里,浏览器厂商们全力以赴的升级浏览器来使它们可用。尽管ES6中有一些大的更新,但是一些小升级也给了我巨大的惊喜。下面这些就是我最喜欢的六个JavaScript新特性。

  1. 设置对象变量键值的语法 JavaScript开发者的烦恼之一是不能在对象字面量里设置变量键值——必须要在初始化后对象后增加变量键/值:
 // *Very* reduced example
 let myKey = ''key3'';
 let obj = {
     key1: ''One'',
     key2: ''Two''
 };
 obj[myKey] = ''Three'';

这个烦恼说好一点是不方便,说差一点是难以阅读以及丑陋无比。ES6给开发者们提供了一个解决方法:

 let myKey = ''variableKey'';
 let obj = {
     key1: ''One'',
     key2: ''Two'',
     [myKey]: ''Three'' /* yay! */
 };

加上一层 

 []

,程序员们就可以在一条对象字面量定义语句就做完所有的事情。

  1. 箭头函数 不用了解ES6带来的改变,你也早就知道箭头函数了——它已经是许多话题的中心,给JavaScript程序员造成了一些困扰(至少在开始的时候是这样的)。我可以写出好几篇博客来解释箭头函数的方方面面,但是我最想告诉大家的是,箭头函数是如何压缩简单函数的代码量的:
 // Adds a 10% tax to total
 let calculateTotal = total => total * 1.1;
 calculateTotal(10) // 11

 

 // Cancel an event -- another tiny task
 let brickEvent = e => e.preventDefault();
 document.querySelector(''div'').addEventListener(''click'', brickEvent);

不用写 

 function

和 

 return

这两个关键词,有时候甚至不需要写 

 ()

,箭头函数是简单函数非常好的一个快捷写法。

  1. find/findIndex JavaScript提供了 
 Array.prototype.indexOf

方法,用来获取一个元素在数组中的索引,但是 

 indexOf

方法不能计算目标元素的查找条件。有时候你还会想获取满足查找条件的那个元素本身。输入 

 find

和 

 findIndex

吧——这两个方法可以在一个数组搜索出第一个满足条件的值。

 let ages = [12, 19, 6, 4];

 

 let firstAdult = ages.find(age => age >= 18); // 19
 let firstAdultIndex = ages.findIndex(age => age >= 18); // 1
 find

和 

 findIndex

允许搜索一个计算后的值,也防止了一些不必要的副作用和循环产生的不确定值。

  1. 扩展运算符: 
 ...

扩展运算符表示一个数组或者一个可迭代的对象可以在一次调用中将它们的内容分割为独立的参数。比如:

 // Pass to function that expects separate multiple arguments
 // Much like Function.prototype.apply() does
 let numbers = [9, 4, 7, 1];
 Math.min(...numbers); // 1

 

 // Convert NodeList to Array
 let divsArray = [...document.querySelectorAll(''div'')];

 

 // Convert Arguments to Array
 let argsArray = [...arguments];

这个神奇的运算符带来的附加好处是能够把可迭代对象( 

 NodeList

 arguments

等等)转化为真正的数组——一直以来我们都用 

 Array.from

 或其它的hack方法。

  1. 模板字符串 在JavaScript中,我们用连接符或者在一行字符的末尾增加 

来创建多行字符串 ,这两种方法都难以维护。许多开发者和框架都开始滥用标签来封装多行字符串模板,其它的则通过DOM和 

 outerHTML

来获取元素的HTML作为一个字符串。
ES6给我们提供了模板字符串,你可以用它和重音符一起轻松的写多行字符串。

 // Multiline String
 let myString = `Hello

 

 I''m a new line`; // No error!

 

 // Basic interpolation
 let obj = { x: 1, y: 2 };
 console.log(`Your total is: ${obj.x + obj.y}`); // Your total is: 3

当然,除了多行字符串,模板字符串还有其它的能力,比如说简单或者高级的插值。不过,仅仅是优雅的写多行字符串这件事情,已经让我十分欣慰了。

  1. 默认参数值 许多服务端语言可以在函数声明中定义默认参数值,比如python和PHP,现在JavaScript也可以了。
 // Basic usage
 function greet(name = ''Anon'') {
   console.log(`Hello ${name}!`);
 }
 greet(); // Hello Anon!

 

 // You can have a function too!
 function greet(name = ''Anon'', callback = function(){}) {
   console.log(`Hello ${name}!`);

 

   // No more "callback && callback()" (no conditional)
   callback();
 }

 

 // Only set a default for one parameter
 function greet(name, callback = function(){}) {}

如果没有传递无默认值的参数,其它的语言可能会报错,但是JavaScript会将它们设为 

 undefined


这六个特性只是ES6中的沧海一粟,却是我们会不假思索的、频繁使用的特性。这些微小的新特性往往得不到人们的关注,却是代码中的核心部分。
转载于猿2048:➤《6个小而美的es6新特性》

8个小而美的前端库

8个小而美的前端库

作者:晓得迷路了

前端有很多小而美的库,接入成本很低又能满足日常开发需求,同时无论是 npm 方式引入还是直接复制到本地使用都可以。

2024 年推荐以下小而美的库。

radash
实用的工具库,相比与 lodash,更加面向现代,提供更多新功能(tryit,retry 等函数),源码可读性高,如果不想安装它,大部分函数可以直接复制到本地使用。
图片

use-debounce
React Hook Debouce 库,让你不再为使用防抖烦恼。库的特点:体积小 < 1 Kb、与 underscore / lodash impl 兼容 - 一次学习,随处使用、服务器渲染友好。
图片

timeago.js
格式化日期时间库,比如:“3 hours ago”,支持多语言,仅 2Kb 大小。同时提供了 React 版本 timeago-react。
图片

react-use
实用 Hook 大合集 - 内容丰富,从跟踪电池状态和地理位置,到设置收藏夹、防抖和播放视频,无所不包。
图片

dayjsDay.js
是一个简约的 JavaScript 库,仅 2 Kb 大小。它可以使用基本兼容 Moment.js,为你提供日期的解析、处理和显示,支持多语言能力。
图片

filesizefilesize.js
提供了一种简单方法,便于从数字(浮点数或整数)或字符串转换成可读性高的文件大小。
图片

driver.jsdriver.js
是一款用原生 js 实现的页面引导库,上手非常简单,体积在 gzip 压缩下仅仅 5kb。
图片

@formkit/drag-and-drop
FormKit DnD 是一个小型拖拽库,它简单、灵活、与框架无关,压缩后只有 4Kb 左右,设计理念为数据优先。
图片

小结
前端小而美的库使用起来一般都比较顺手,欢迎在评论区推荐你们开发中的使用小而美的库。
如果你从事前后端/测试,技术大厂,也欢迎你们一起来共事。

AIoT是什么?为何突然变成了智能制造的主流趋势?

AIoT是什么?为何突然变成了智能制造的主流趋势?

人工智能(ai)和物联网(iot)的结合创造了智能设备,这些设备能够自主学习、分析和做出决策,为人类带来更便利的生活。例如,自动驾驶和智能穿戴设备等,可以广泛应用于各个行业

本文将简要介绍什么是AIoT。AIoT所需的关键技术有哪些?以及AIoT能带来哪些好处?

AIoT是什么?为何突然变成了智能制造的主流趋势?

AIoT 是什么?

AIoT是「人工智能物联网」的英文全称,顾名思义就是将人工智能(AI)和物联网(IoT)这两种技术相互结合

在AIoT技术中,人工智能(AI)和物联网(IoT)之间的关系就像人体的大脑和感官一样,利用感官收集周围的信息并传达给大脑作出反应。因此,将人工智能(AI)和物联网(IoT)结合起来可以实现更高的效率,加强数据管理和分析,同时改善人类与机器之间的互动

AIoT 常见的技术与设备

需要重写的内容是:(1) 嵌入式系统与感测器

传统IoT 的数据搜集方式大多都是利用搭载嵌入式系统的感测器,在搜集到数据后通过网络上传至云端进行运算。

目前,嵌入式系统正逐渐向微型化和智能化发展,并引入感测器。当嵌入式设备具备人工智能能力时,可以交由感测器进行即时处理。感测器接收到的数据不一定需要传回云端进行计算,而是可以在边缘节点进行即时处理,这就是所谓的“边缘计算”。即使在没有网络的地方也可以正常运行

(2) 云端运算与分析

云端服务在传统的物联网中扮演着不可或缺的角色,可以分为三种服务模式,即「基础设施」、「平台」和「软件」

随着传感器数量的增加,所搜集到的数据量也越来越大。原先使用的数据分析工具已经无法应对数据增长的速度,而且人力资源有限。因此,与人工智能的整合需求变得非常迫切。借助人工智能的力量,可以充分利用和分析不断积累的大数据,并实现最大的收益转化

而要在大数据中快速获得运算结果,通常需要使用工作站或伺服器这类专门处理高工作负载的电脑,才能够支援高速运算所需的效能。

(3) 5G 通讯技术

「高速率」、「大连接」与「低延迟」是5G 的三大特性,其中的「低延迟」更是促成AIoT 普及的关键之一,指的是数据的接收端能够立即收到传输端的请求并即时做出反应。

AIoT 可为企业带来的好处

(1) 提高运营效率

AIoT可以分析出人眼无法发现的即时运作模式,并将其设定为运作条件,从而协助优化生产流程并提高工作效率

需要进行改善的是风险管理

AIoT技术可以通过预测性分析,主动安排设备维护计划,避免设备异常或故障,从而提高安全性并减少因设备停机而造成的损失

(3) 提升顾客体验

AIoT 具备从数据中学习、分析并做出决策的能力,而且能够根据数据量的累积不断进化,以便更全面地分析出客户的需求,能够提供个人化、客制化的服务,大幅提升客户满意度。 重写后:AIoT具备从数据中学习、分析并做出决策的能力,同时能够根据数据量的累积不断进化,以更全面地分析客户的需求,提供个性化、定制化的服务,大幅提高客户满意度

降低营运成本

随着AIoT 将数据分析、运算逐渐带往边缘处理,能够减少传输到云端的数据量,也减轻了网络负载,能够降低与云端服务或云端连接的相关成本。

目前AIoT 所面临的两大考验

(1) 完善的通信安全机制

随着万物皆可联网的时代来临,通信安全的挑战也日益升高。AIoT的数据处理流程可以大致分为搜集、传输、运算和决策等几个步骤。无论是在感测端、装置端还是应用端,一旦数据通过网络传输,都会面临通信安全的风险。因此,保护数据安全是IT的首要目标,确保数据始终保持机密性、完整性和可用性

需要被重写的内容是:(2) 稳定的网络连接

随着万物互联的发展,人们对网络的依赖性也越来越强。虽然AIoT可以在边缘进行计算,而不必将所有数据上传到云端,但在数据存储和云端计算等方面仍然需要依赖网络。因此,如何保持网络的稳定性,避免停电导致整个系统停止运行,也是在执行AIoT时需要重视的问题

AIoT 常见问题

AIoT与IoT有何区别?

近年来IoT已经广为人知,后来又衍伸出AIOT与IIOT 等字词,它们有什么差别呢?

过往IoT技术扮演了重要的基础感测角色,透过将搜集到的数据上传至云端进行分析、运算或共享,并提供可靠的洞察通信来协助制定行动与决策。

AIoT并非一种全新的技术,而是将AI与IoT这两种成熟的技术相结合,属于一种新的IoT 应用型态,透过AI的机器学习、深度学习及认知能力来强化IoT,也能执行边缘运算,让数据无须上云也能即时响应,让设备从「自动化」逐渐转变为「智能化」。

(2) AIoT与IIoT有什么差别?

我们可以将工业物联网(IIoT)视为物联网(IoT)的一个子类,用于在工业领域中应用。它涵盖了生产制造和能源管理等范围。通过在生产机械上安装传感器,并通过网络连接到计算机的工业应用程序,这种技术是实现工业4.0的基础,有助于提高生产力和加快生产效率的下一阶段

重写后的内容:人工智能物联网(AIoT)是工业4.0的核心技术之一,它在物联网(IoT)的基础上增加了人工智能(AI)技术,以增强物联网设备的功能。例如,通过机器学习(Machine learning),可以对收集到的数据进行进一步分析,以改善生产流程或进行预防性维修

以上就是AIoT是什么?为何突然变成了智能制造的主流趋势?的详细内容,更多请关注php中文网其它相关文章!

asp.net – NavigateUrl =“#”变成href =“SubFolder /#”?

这不是费马的最后一个定理,但它不断回到烦恼我,就像一个无薪的大学电话费.有时我想创建一个不会导致回发的HyperLink,所以我希望目标网址为#.当标记恰好来自子文件夹中的UserControl时,
/
|- Home.aspx (uses UC.ascx)
|- Sub
   |- UC.ascx

URL用相对路径重写,例如

<asp:HyperLink runat="server" NavigateUrl="#" >Click Me!</asp:HyperLink>

<a href="SubFolder/#">Click Me!</a>

不幸的是,这是错的.显然,我可以通过不使用服务器控件来解决这个问题,但是它似乎很愚蠢.这可以避免吗?

这里的要点是我将添加一个jQuery或代码隐藏的点击事件,我从来不希望它导致回发,但我希望它成为超链接为CSS的原因.

解决方法

简单的方法:
<asp:HyperLink ID="HyperLink1" 
                navigateUrl="#" 
                onclick="javascript:return false;"                   
                runat="server">HyperLink</asp:HyperLink>

要么

<asp:HyperLink ID="HyperLink1" 
                href="#" 
                runat="server">HyperLink</asp:HyperLink>

或者jquery添加一个类到你不想拥有回发的链接(nopostback):

$("a.nopostback").bind('click',function () {
     return false;
})

关于11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?为什么微信变小了怎么回事的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于6个小而美的es6新特性、8个小而美的前端库、AIoT是什么?为何突然变成了智能制造的主流趋势?、asp.net – NavigateUrl =“#”变成href =“SubFolder /#”?等相关知识的信息别忘了在本站进行查找喔。

本文标签: