1. 引言

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

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

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

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


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


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

flutter build apk --target-platform android-arm64 --split-per-abi

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


2. 注释会被打包到应用中吗?

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

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 ,这时再打包看一下大小,如果没有体积 没有增加,则说明 注释不会被打包

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


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

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


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

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

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

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);
}

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

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


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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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