整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Flutter 新功能、Dart 开发工具 及CSS

Flutter 新功能、Dart 开发工具 及CSS 代码

020 年 11 月 16 日,Google 开发者大会 (Google Developer Summit) 在线上举行。本次大会以“代码不止”为主题,全面介绍了产品更新以及一系列面向本地开发者的技术支持内容。11 月 18 日,进行了以 Flutter 为主题的演讲,本文重点关注了 Flutter 性能方面的进展以及一些新功能。

Flutter 性能进展

2019 下半年,共收到 23 个量化的性能提升;2020 上半年,共收到 27 个量化的性能提升。2020 上半年共收到来自 78 位开发者的 49 个性能改进。

工具的性能十分重要,性能测试也同样至关重要,拥有良好的性能测试可以:

  1. 快速重现问题;
  2. 迭代和验证解决方案;
  3. 提供数据,激励进一步的工作并防止倒退。

能耗与速度相关,每一帧渲染时间越长,能耗就越高,但能耗并不等于速度,因为在某些情况下,渲染速度快可能会导致能耗升高;渲染速度慢也可能不耗能。

  1. CPU 上运行时间虽然短,但由于新的算法利用了更多的 GPU 核心,所以 GPU 能耗反而增加;
  2. 有些 CPU 上的任务被别的 I/O 或 GPU 任务阻塞,进行了长时间的等待,而等待的时间内并无过多能耗。

因此,在速度之外增加的能耗测试是十分必要的。因为 Flutter 团队在 GitHub 上收到的大部分能耗问题都和 iOS 相关,所以,此次 Flutter 首先加入了 iOS 的能耗测试,Android 的能耗测试工具会于后续加入。

开发者可以使用 Flutter Gallery App 在 Timeline 中查看 CPU/GPU 的使用率,也可以用集成测试自动检测 CPU/GPU 的使用率。

Flutter 还新加入了 SkSL 着色器编译预热功能,来帮助开发者消除着色器编译卡顿。

如果一个 Flutter 程序第一次渲染某类动画时出现明显的卡顿,但是之后渲染这些动画时,卡顿完全消失,那么这就很可能是着色器编译卡顿。开发者可以使用 --trace-skia,然后检查 Timeline 来确认是否为着色器卡顿。

值得一提的是,SkSL 可以实现自动化生成与测试,这对于需要持续更新的 Flutter App 来说,可以节省很多的人力。

内存和包体积的测试工具

此次,Flutter 团队更新了 Dart 开发工具。Dart 开发工具是面向 Flutter 和 Dart 开发人员的工具套件,其中包括:

  1. 布局检查(Inspector)
  2. 性能调试(Performance)
  3. 内存调试(Memory)
  4. 网络调试(Network)
  5. 包体积调试(App Size)
  6. 调试器(Debugger)
  7. 日志(Logging)

内存调试器功能

  1. 事件窗格(Dart 和 Android 内存)
  2. 手动和自动快照(snapshot)和垃圾回收(GC)
  3. 内存分析
  4. 内存堆分配累加器(Heap Allocation Accumulators)
  5. 通过命令行界面将内存统计信息到处到 JSON 文件

内存测试

  1. 通过 ADB 交互直接进行内存测试
  2. Dart 开发工具内存测试
  3. iOS 内存测试

更多信息可以通过这篇由 Flutter 工程师撰写的文章进行了解。

包体积调试器功能

  1. 可视化了应用程序的总大小,包括功能级别的 Dart AOT 快照;
  2. 分析快照和应用包(APK,IPA 等);
  3. 分析快照或应用程序包(APK,IPA 等)的差异;
  4. 查看软件包级别的应用大小归因数据。

CSS Grid

前端开发者往往会因为一些问题而感到困扰:设置布局以及让外观以你所希望的方式呈现。现在,前端开发者不再需要头痛这些问题了,也不需要 CSS 过滤器这种复杂的解决手段。CSS Grid 可以同时用于水平和垂直布局设置,这意味着开发者现在可以通过使用 CSS Grid 实现许多强大的功能,从元素居中到创建强大的全页面布局,都只需一行代码即可完成。

Super Centered

它可以解决 CSS 中最大的问题:元素居中对齐。只需要将“display”设置为“gird”,即可进入网格模式,然后通过一行代码:

place-items:center;

即可解决元素居中上遇到的问题。

Pancake Stack

可用于创建常用的页眉页脚和主体布局,同样地,先将“display”设置为“gird”,然后通过一行代码:

grid-template-rows: auto 1fr auto;

其中“grid-template-rows”用来设置父区域布局中行的大小,而后面的“auto”的含义是,对于自动放置的行,即自动调整大小的行,我们将使用最少内容的大小,在这种情况下就是内容的最小高度,这样可以使内容刚好放入该布局的空间内;“1fr”的含义是,我们希望用父区域剩余空间的一等份单位来容纳第二行。这样的做法会使界面变得十分整洁,开发者可以利用自动值和等份单位非常方便地设置页眉页脚和主体区域。

Classic Holy Grail Layout

上面所提到的“auto 1fr auto”,既可用于行,也可以用于列。通过这一功能,我们可以将页面中除页眉和页脚的部分再分为三份,左右两边的区域依旧会根据内容自动分配空间大小。而在主体内容区添加内容时,空间大小保持不变。只需要一行代码即可创建全页面、自适应、可调整的流畅布局:

grid-template: auto 1fr auto / auto 1fr auto;

12-Span Grid

设置布局的另一种方法是使用网格,12-Span 的布局一直很受欢迎。现在,只需要一行代码即可实现这一切:

grid-template-columns: repeat ( 12 , 1fr );

其中,我们使用了 repeat 函数,这样就不需要重复写 12 次 1fr,而是用“( 12 , 1fr )”来创建一个有 12 个 span 网格,每段网格具有相同单位值,均为空间的一等份单位。

演讲者介绍

李宇骞,Google 软件工程师。

李宇骞是 Flutter 团队的一位软件工程师,主要专注于提升其性能。他毕业于清华大学计算机系本科,杜克大学计算机系博士。在加入 Flutter 前,他发明了一个新的矢量图形抗锯齿算法,显著提升了其速度和顺滑程度,并将其应用于 Flutter, Android, Chrome 等程序的2D 图像渲染引擎 Skia 中。

侯悠扬,Flutter 用户体验研究员。

侯悠扬于2017年加入 Google,并于2019年加入 Flutter 团队。她是 Flutter 团队一名用户体验研究员,关注提升 Flutter 产品和开发工具的程序员体验。加入 Flutter 团队之前她任职于 Google Cloud 团队,并在密歇根大学获得人机交互博士。

Una Kravets,Google 开发技术推广工程师。

延伸阅读:

2020年:前端开发的痛苦与快乐-InfoQ

关注我并转发此篇文章,私信我“领取资料”,即可免费获得InfoQ价值4999元迷你书,点击文末「了解更多」,即可移步InfoQ官网,获取最新资讯~

话不多说直接上干活。

  • APK代码反编译

首推工具jadx(.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab),下载地址:https://github.com/skylot/jadx,将APK直接用工具打开即可,简单省时。

另外还有dex2jar这款工具,操作步骤也比较简单,将APK更改成rar/zip文件进行解压,解压后会得到class.dex文件,用命令 d2j-dex2jar.bat classes.dex 得到Jar文件后, jar文件的代码查看可以使用jd-gui进行查看。

  • 系统代码反编译-以华为mete30-hwPartIawareService.jar为例。

系统代码仅仅指Android系统中的Java代码部分。

不同的Android版本,java代码部分大致分为jar, dex, vdex,cdex三种格式。根据不同的格式采用不同工具进行反编译。

1.Jar,dex格式

可以采用jadx, 直接pull到电脑中,用jadx打开。

2.vdex格式

需要下载vdexExtractor 进行转换。

执行./cdexExtractor/vdexExtractor -i hwPartIawareService.vdex ,生成cdex文件。

执行./cdexExtractor/compact_dex_converter hwPartIawareService_classes.cdex 生成hwPartIawareService_classes.cdex.new文件,该文件为dex格式,直接用jadx打开

工具下载:链接:https://pan.baidu.com/s/1Zt_XmLe4JMhhpKU5PthgBw

提取码:f9b9

参考来源:https://github.com/anestisb/vdexExtractor

https://blog.cofface.com/archives/2932.html

3.odex格式

执行命令java -jar baksmali-2.5.2.jar d hwPartIawareService.odex -l --di false --sl

生成对应的out目录,其中为smail文件。

执行java -jar smali-2.5.2.jar a out ,会将对应的out目录生成out.dex,直接用jadx打开

下载路径https://bitbucket.org/JesusFreke/smali/downloads/


注意:以上方式均不能很好地处理混淆后的代码,混淆后的代码比较晦涩。

代码可任意下载的重大漏洞终于大规模爆发。

2018年的第一天,微信小程序被爆出惊天BUG:任何人可以通过AppID和版本号获取任意小程序的源码文件!

该漏洞被大范围曝光起源于V2EX论坛一篇关于使用微信小游戏“跳一跳”不校验post的漏洞进行刷分技术文章,文章同时给出了获取跳一跳小游戏源码的获取方法。文章备注,此种获取源码的方法对于小程序也是通用的。

方法非常简单:只要获取到小程序的appid和版本号,即可通过构造URL直接下载该小程序的源码wxapkg文件。

理论上,小程序的appid和版本号是只有开发者本人知道的,除非小程序开发者公布,其他人员无从获取。而技术层面上,我们却可以通过对小程序和服务器的通信进行抓包获取到小程序appid和版本号。这就使得下载小程序源码变得轻松异常。

微信小程序官方称在当天修复了通过构造URL下载源码的漏洞,目前,已无法使用构造URL的方式直接下载小程序执行包。

这个锅应该由谁来背?

有开发者次日在V2EX爆料称,该漏洞是由于小程序CDN服务商没有给访问做URL鉴权导致的。服务器开发我并不熟悉,此处不站队。

实际上,通过构造URL的方式下载小程序源码只是其中被曝光了的一个方式,我们的手机里其实已经保存了所有我们使用过的小程序执行包,对于root的安卓手机,我们可以在appbrand文件中找到所有已经使用过的小程序wxapkg文件。

只是命名规则比混乱,但这比抓包和构造URL的方法降低了对技术的要求。

之所以在标题使用“终于大规模爆发”,是因为这两种获取小程序源码的方法早在2017年6月就有开发者发文给出了,而那位开发者写文更多的是对前端代码安全的讨论。

更有讨论价值的恰恰是前端代码的安全问题。

小程序大部分功能的实现都是基于前端的,很多开发者为了省掉域名备案和SSL证书部署的麻烦,将小程序的大部分功能都写在了前端。在被抓包和提取执行包不可避免的情况下,就要求小程序官方采取足够的代码安全保护措施。

而这一点,小程序开发团队做的不是很好。

使用前文的任意方法获取到小程序的执行文件,用Python版脚本(不得不佩服我们的程序员,在短短的一天时间内,出现了Python、PHP和js三个版本的解包脚本)对下载的wxapkg文件解包后得到这么几个文件:

解码后的小程序文件目录

可以发现这些文件的组成和小程序的代码已经非常相似了。与常规小程序代码不同的是,解包的文件格式仍然是HTML文件。

但这不是重点。

打开page-frame.html和app-service.js,可以发现这些代码已经非常具备可读性了:

page-frame.html代码截图

app-service.js

对于熟悉小程序开发的人来说,这样的代码已经几乎不需要再格式化了,现有文件已经可以比较清楚地看出代码的逻辑。

回到代码保护。

我们获取到的wxapkg文件其实是小程序的执行文件,可以简单理解为安装包。安卓手机的安装包(xxx.apk文件)大家非常熟悉,我们是很难通过apk文件获取到应用源代码的,因为代码压缩有非常复杂的加密过程,很难被反编译。

但为什么小程序的执行包就可以被轻松地“反编译”?(用“反编译”其实已经非常高估小程序了,你可以发现前面我都是使用了“解包”这个词,因为小程序的“反编译”过程非常简单,就像解压缩一样。)

小程序的执行文件之所以可以如此轻松地被反编译,根源在于小程序的开发团队并没有对小程序的执行文件进行有效的保护,也就是加密。使用Hex Fiend(一款Mac OS上的十六进制编辑转件)分析wxapkg文件会发现,大部分字段是没有被加密的,可以直接看到文件的路径。

实际上,小程序只是很简单的将图片、js和json文件压在一起,而压制的过程无非就是Wxml --> Html、 Wxml --> JS、Wxss --> Css,转换后文件二进制格式跟后缀名为wx二进制格式完全一致。这就使得解包过程非常简单,所以出现了一天之内涌现出Python、PHP和JS三个版本解包代码的情况。

其实,早在2017年10月份,就有开发者在简书分享了对小程序执行包的提取和解析过程,并在GitHub开源了脚本代码。

So?

开发者Rolan在文章《从微信小程序看前端代码的安全》中提到:

微信并没有在代码安全上进行过多的考虑。这导致需要在应用审核过程中花费比较多的功夫(也就是自己给代码加密),不然作品太容易被复制窜改,以至于会失去渠道先机,这对流量是致命打击。

由于历史原因,前端的代码安全技术发展的比较缓慢,相比其他被编译成二进制的应用,前端这种纯文本应用,太容易被辨识与窜改。

对前端代码进行保护的目的在于让机器容易识别相关的指令,而使人难以理解代码的逻辑,但往往在对前端代码进行保护过程中,很难既兼顾指令效率又能使可读性降低。

因此,常常需要在现有的代码中增加一些额外的验证逻辑,例如一些增加无效的代码进行混淆、采用守护代码保护业务代码不能在其他的域名下正常运行、增加一些防止调试跟踪的断点等,这些措施都是使得破解代码时人工成本增加,从而增加代码的安全性。

这篇文章是2017年6月发布的,早与小程序源码大范围泄漏前半年!半年前就已经被开发者意识到的安全问题,小程序开发团队却至今没有发现,或者像Rolan说的“并没有在代码安全上进行过多的考虑”。

近乎开源的源代码对于开发者而言,已经几乎没有任何盈利的可能性。当前互联网环境下,个人开发者(或小型开发团队)在没有足够资金和流量支持的情况下,先发优势是他们唯一可以使用的资源,而代码的安全性是对先发优势的绝对保护。

一旦代码被开源,优质小程序可能会迅速被不怀好意的资本和流量持有方抄袭取代。

作为微信生态内的新生力量,小程序不仅被官方,也被很多开发者和内容创业者寄予厚望,而此次暴露出的bug则令人心惊。希望微信官方能尽快修复漏洞,让刚刚抬头的小程序生态稳健成长。