1. 引言
可能很多朋友都会有一个疑问,是否有必要为了简单的需求,而引入第三方库?这个问题的痛点在于:你担心只是想要库中的一个小功能,引入的三方库会使应用变大。就像本想喝一杯水,我却给你一条河流。
但,真的是这样吗?你有没有想过,也许又那么一种可能性,代码中没有被使用的类
,根本不会
被打包到应用中。所以这个担心本就是你的 一厢情愿
呢?会,或不会,不能仅靠个人的感觉,本文将进行测试,让你亲眼见证。
另外,本文有对应的视频版,可在 哔哩哔哩
进行观看:
【Flutter 极限测试 – 未使用的 dart 类会被打包吗? 】
这是一个初始项目,仅打包 arm64
打大小,为 5.7 MB
:
flutter build apk --target-platform android-arm64 --split-per-abi
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
,这时再打包看一下大小,如果没有体积 没有增加
,则说明 注释不会被打包
。
其结果确实也在意料之内,打包结果体积没有增加,所以可以断定:注释不会被打包
。
3. 在代码中,没有引入的文件测试
同样,这里通过个小脚本创建一个大的文件,如下的 Useless0
类通过脚本创建,大小为 1.8 MB
。现在它在项目之中,但没有引入到 main.dart
里,现在看看它是否会增加打包文件大小。
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 MB
的 useless0.dart
,但没有使用,会被打包到应用中吗?
如下测试结果和前面一样,所以,即便是引入了文件,没有使用,也 不会
被打包到应用中,对体积产生影响。
5.引入且使用,创建无用对象测试
下面来一个更极限的测试,通过 Useless0
创建了 u0
对象,说明在 mian.dart
中使用了 1.8 MB
文件中定义的类,但此时 u0
是一个无用的对象。那么编译器会聪明到对这种情况进行判断吗?
答案是,编译器牛 * 。这种情况下,打包的应用大小依然纹丝不动。所以不要凭自己的感觉,要靠实践去测试,要亲眼去见证。只要不是在代码中真正产生作用,编译器
在编译期间都会忽略这些文件。
5.引入且使用,创建无用对象测试
也就是说,只要真正被实际使用到的文件才会被编译到应用中。如下,当 u0#useless
触发,才标志着 useless
文件在代码中真正发挥了价值。
如下,此时的应用增加了 0.2 MB
,所以也并不是说 1.8 MB
的源代码就会增加 1.8 MB
的应用大小。编译器会对文本进行压缩。优化等处理,尽一切可能在保证功能的情况下减少应用的体积。
那本文就到这里,谢谢观看 ~