Flutter应用混淆优化及跨平台框架对比分析

2 阅读6分钟

分析flutter应用很依赖反编译工具转储的dart文件中的信息,可以在开发flutter的过程中开启混淆,能有效防止静态分析。

重命名变量、函数和类名。

删除不必要的空白字符、注释和换行符。

优化代码结构,例如内联函数、删除未使用的代码和资源等。

对控制流进行混淆,例如添加冗余代码、修改循环结构等。

二、实现混淆

2.1.混淆Dart代码

要对Dart代码进行混淆,请使用以下命令构建Release版本:

其中<output_directory>是用于存储混淆映射文件的目录。这些文件可用于还原混淆后的堆栈跟踪。

Flutter应用混淆

Flutter应用的混淆非常简单,只需要在构建release版应用时结合使用--obfuscate 和--split-debug-info这两个参数即可。

–obfuscate --split-debug-info用来指定输出调试文件的位置,该命令会生成一个符号映射表。目前支持apk,appbundle,ios和ios-framework等目标平台(macOS和aar在master和dev分支中支持),如下所示:

混淆成功后,需要保存符号映射表,以便以后需要去混淆跟踪代码堆栈。

相关命令的其他信息,可以运行flutter build apk -h查看,如果不支持该命令,核实Flutter版本,执行flutter upgrade更新。

Flutter分析包的大小

2.2.混淆An droid原生代码

要对Android原生代码进行混淆,请在android/app/build.gradle文件中启用ProGuard或R8。在buildTypes配置中,为release类型添加

此外,确保在proguard-rules.pro文件中添加必要的混淆规则,例如保留与MethodChannel相关的原生代码:

三、优化应用程序包体积

3.1.移除未使用的资源

移除项目中未使用的资源(如图片、字体和动画),以减小应用程序的包体积。在Android项目中,可以使用shrinkResources选项来移除未使用的资源:

3.2.压缩图片资源

压缩项目中的图片资源,以降低它们的文件大小。可以使用像TinyPNG或ImageOptim这样的工具来压缩图片资源。

四、提高反编译难度

4.1.混淆字符串

为了提高反编译的难度,可以在编译阶段处理掉明文字符串。一个方法是使用字符串混淆库,如string_obfuscator。在编译阶段,此库会自动混淆字符串,并在运行时解混淆。

要使用string_obfuscator库,请在pubspec.yaml文件中添加依赖,然后在需要混淆字符串的Dart文件中引入string_obfuscator库。使用obfuscate()函数混淆字符串。

五、常见问题与解决方案

以下是一些在混淆和优化Flutter应用程序过程中可能遇到的常见问题及其解决方案:

Flutter与原生平台通信失效:请确保在proguard-rules.pro文件中添加与MethodChannel相关的原生代码保留规则。

保留JSON对应的Java Bean对象:在proguard-rules.pro文件中保留与JSON相关的Java Bean对象,使用-keep指令来保留这些类。

隐藏明文字符串:使用字符串混淆库,如string_obfuscator,在编译阶段对字符串进行混淆,并在运行时解混淆。

六、总结

保护Flutter应用程序的代码和数据安全是移动应用程序开发中的一个重要方面。通过混淆、优化和保护应用程序,您可以提高应用程序的安全性和隐私。请记住,在实施这些技术时始终关注可能遇到的问题,并及时寻找解决方案。

在Flutter刚出来的这几年,经常会在各种跨平台框架对比的文章下,看到将其与uni-app进行比较。当时我也没有在意太多,以为uni-app也是个差不多的“正经”跨平台框架,但当我打开uni-app官网的时候,我震惊了,因为我看到了这样一句话:一套代码编到 15个平台,这不是梦想。我瞬间就傻眼了,这么nb?Flutter不也才横跨 六大平台 ?在仔细一想,不对啊,这哪来的15个平台?再仔细一看,然后我的心中只剩下一万个省略号了,横跨一堆小程序平台是吧...

1. 开发语言的不同

Flutter,要求开发者学习dart,了解dart和flutter的API,最好还会写点原生。而uni-app只需要学Vue.js,没有附加专有技术。所以从学习一个框架来看,很明显uni-app的学习成本很低。而从我个人的角度去分析,当年我只是一个刚入编程世界的菜鸡中的菜鸡,只学了半年的html+css+js和半年的java。抛开学了1个月的SpringBoot,Flutter可以算是我学习的第一个框架,当时我是直接上手学的Flutter,没有去单独学习dart,因为和java很相似。个人觉得学习成本也还好,如果你喜欢这个框架的话~而最近两个月学习uni-app,我也确实是感受到了学习成本很低,基本上看了看文档,就直接上手了,很多组件的名字也是和flutter大差不差。就是写css有点难受

2. 第三方插件&社区氛围

截至目前2023.7,flutter在github上有155K的star,uni-app有着38.4K的star。从star的数量也可以看出一个框架的热度,很明显,flutter是远高于uni-app的(毕竟uni-app的主要使用场景还是在国内小程序中)。对于第三方插件呢Flutter有着pub.dev[1],uni-app有插件市场[2],但相比Flutter呢可能略显不足。

3. 开发工具的使用

Flutter可以选择 vscode 或者 android studio 等来进行开发,uni-app可以选择 HBuilderX,当然也可以使用 vscode,用什么开发工具其实大差不差,如果你一直使用 vscode,那么你对工具的使用会更加的熟悉,而如果你和我一样,用的是 android studio,再去使用 HBuilderX,说实话,有点点难受...例如我最常用的Alt+回车(提示),crtl+alt+l(代码格式化)。当然,反过来也是一样的

同时,对于iOS端的IPA文件保护,可以使用IpaGuard这款专业工具,无需源码即可对编译后的IPA进行代码和资源混淆,支持Flutter、Swift、OC等语言,混淆后还能直接重签名测试,有效提升反编译难度。