前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutter 极限测试 | 未用类是否会被打包

Flutter 极限测试 | 未用类是否会被打包

作者头像
张风捷特烈
发布2022-05-09 13:41:05
5641
发布2022-05-09 13:41:05
举报
1. 引言

可能很多朋友都会有一个疑问,是否有必要为了简单的需求,而引入第三方库?这个问题的痛点在于:你担心只是想要库中的一个小功能,引入的三方库会使应用变大。就像本想喝一杯水,我却给你一条河流。

但,真的是这样吗?你有没有想过,也许又那么一种可能性,代码中没有被使用的类,根本不会被打包到应用中。所以这个担心本就是你的 一厢情愿 呢?会,或不会,不能仅靠个人的感觉,本文将进行测试,让你亲眼见证。

另外,本文有对应的视频版,可在 哔哩哔哩 进行观看:

Flutter 极限测试 - 未使用的 dart 类会被打包吗?

这是一个初始项目,仅打包 arm64 打大小,为 5.7 MB :

代码语言:javascript
复制
flutter build apk --target-platform android-arm64 --split-per-abi
复制代码
2. 注释会被打包到应用中吗?

直觉和常理上来说,注释肯定不会被打包到应用中,否则这个编译器就垃圾到了极点。为了保险起见,还是验证一下。这里通过一个简单的脚本方法,在 main.dart 的末尾加上 100000 行注释:

代码语言:javascript
复制
import 'dart:io';
import 'package:path/path.dart' as path;
main(){
  File file = File(path.join(Directory.current.path,'lib','main.dart'));
  String str = '';
  for(int i =0;i<100000;i++){
    str += "///useless comment by comment_builder.dart;\n";
  }
  file.writeAsString(str,mode:FileMode.append);
}
复制代码

此时 main.dart 足足有 4.4 MB ,这时再打包看一下大小,如果没有体积 没有增加,则说明 注释不会被打包

其结果确实也在意料之内,打包结果体积没有增加,所以可以断定:注释不会被打包

3. 在代码中,没有引入的文件测试

同样,这里通过个小脚本创建一个大的文件,如下的 Useless0 类通过脚本创建,大小为 1.8 MB。现在它在项目之中,但没有引入到 main.dart 里,现在看看它是否会增加打包文件大小。

代码语言:javascript
复制
main(){
  Directory dir = Directory(path.join(Directory.current.path,'lib','useless'));
  if(!dir.existsSync()){
    dir.createSync(recursive: true);
  }
  writeFile(0,dir.path);
}


void writeFile(int index,String dirPath ){
  String str = '';
  for(int i =0;i<100000;i++){
    str += "print('useless');\n";
  }

  String content = """
  class Useless$index{
  final String name;

  Useless$index({this.name=''});
  
  void useless(){
   $str
  }
}
  """;

  File file =File(path.join(dirPath,'useless$index.dart'));
  file.writeAsStringSync(content);
}
复制代码

如下可以看出,它并不会引起打包文件的变化。通过这个测试,就能打消一开始的疑虑:即使文件在代码里,没有使用到,也是 不会 被打包而影响应用的大小。

4. 引入了文件但未使用测试

接下来继续测试,在 main.dart 中引入了 1.8 MBuseless0.dart ,但没有使用,会被打包到应用中吗?

如下测试结果和前面一样,所以,即便是引入了文件,没有使用,也 不会 被打包到应用中,对体积产生影响。

5.引入且使用,创建无用对象测试

下面来一个更极限的测试,通过 Useless0 创建了 u0 对象,说明在 mian.dart 中使用了 1.8 MB 文件中定义的类,但此时 u0 是一个无用的对象。那么编译器会聪明到对这种情况进行判断吗?

答案是,编译器牛 * 。这种情况下,打包的应用大小依然纹丝不动。所以不要凭自己的感觉,要靠实践去测试,要亲眼去见证。只要不是在代码中真正产生作用,编译器 在编译期间都会忽略这些文件。

5.引入且使用,创建无用对象测试

也就是说,只要真正被实际使用到的文件才会被编译到应用中。如下,当 u0#useless 触发,才标志着 useless 文件在代码中真正发挥了价值。

如下,此时的应用增加了 0.2 MB ,所以也并不是说 1.8 MB 的源代码就会增加 1.8 MB 的应用大小。编译器会对文本进行压缩。优化等处理,尽一切可能在保证功能的情况下减少应用的体积。

那本文就到这里,谢谢观看 ~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 引言
  • 2. 注释会被打包到应用中吗?
  • 3. 在代码中,没有引入的文件测试
  • 4. 引入了文件但未使用测试
  • 5.引入且使用,创建无用对象测试
  • 5.引入且使用,创建无用对象测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档