Flutter dart代码混淆与解混淆

目录

Dart 代码混淆(Obfuscation)可以 防止反编译和代码泄露,但也会导致 崩溃日志难以阅读。因此,在启用混淆的同时,我们需要保留调试符号文件(symbol files),以便后续 解混淆(Symbolization)。

一、Flutter Dart 代码混淆

1、启用混淆

针对Android,Flutter 在 release 构建时可以启用 Dart 代码混淆:

powershell 复制代码
flutter build apk --release --obfuscate --split-debug-info=./symbols/

或者针对 iOS:

powershell 复制代码
flutter build ios --obfuscate --split-debug-info=./symbols/

参数说明:

参数 作用
--obfuscate 开启 Dart 代码混淆(会混淆类名、方法名等)
--split-debug-info=./symbols/ 存储生成的符号表,避免混淆后无法解读堆栈信息,symbols 为生成的符号表目录

2、符号表文件

运行上述命令后,symbols 目录中会生成符号表文件,以Android为例:

powershell 复制代码
debug_info/
  ├── app.android-arm.symbols
  ├── app.android-arm64.symbols
  ├── app.android-x64.symbols

这些 symbols 文件用于解混淆崩溃日志。

二、Flutter Dart 代码解混淆

如果应用因为 dart 代码导致崩溃,堆栈日志可能是这样的:

java 复制代码
#00 abs 0000006febe81e6b virt 000000000025ee6b _kDartIsolateSnapshotInstructions+0x1288eb
#01 abs 0000006febecd6d7 virt 00000000002aa6d7 _kDartIsolateSnapshotInstructions+0x174157
#02 abs 0000006febed08c3 virt 00000000002ad8c3 _kDartIsolateSnapshotInstructions+0x177343
#03 abs 0000006fec07ea37 virt 000000000045ba37 _kDartIsolateSnapshotInstructions+0x3254b7
#04 abs 0000006fec02781f virt 000000000040481f _kDartIsolateSnapshotInstructions+0x2ce29f
#05 abs 0000006febfce6ab virt 00000000003ab6ab _kDartIsolateSnapshotInstructions+0x27512b
#06 abs 0000006febfce43b virt 00000000003ab43b _kDartIsolateSnapshotInstructions+0x274ebb
#07 abs 000

1、使用 flutter symbolize 解混淆

我们需要用 flutter 自带的 symbolize 命令,解码混淆日志:

powershell 复制代码
# 格式
flutter symbolize -i [stack_trace_file] -d [symbols_file] > [out_file]

# 例如
flutter symbolize -i /Users/xxx/crash.txt -d /Users/xxx/app.android-arm64.symbols > out.txt

参数说明:

参数 说明
-i [stack_trace_file] 将需要解混淆的 Dart 代码拷贝到文件中,例如 crash.txt
-d [symbols_file] 指定 Flutter 生成的符号表文件,注意要制定对应架构的解码文件
> [out_file] 解码后的堆栈输出到 out_file 文件中

2、解混淆后的日志

解码后,你会得到可读的崩溃日志:

java 复制代码
#0      FlutterCrashPageState.build.<anonymous closure> (/Users/xxx/flutter-mobile-demo/lib/crash/FlutterCrashPage.dart:28:17)
#1      _InkResponseState.handleTap (/Users/xxx/flutter_3.19.5/packages/flutter/lib/src/material/ink_well.dart:1183:21)
#2      _InkResponseState.handleTap (/Users/xxx/flutter_3.19.5/packages/flutter/lib/src/material/ink_well.dart:1175:3)
#3      new _GrowableList._literal1 (third_party/dart/sdk/lib/_internal/vm/lib/growable_array.dart:558:22)
#4      new _ErrorDiagnostic (/Users/xxx/flutter_3.19.5/packages/flutter/lib/src/foundation/assertions.dart:178:18)
#5      new ErrorDescription (/Users/xxx/flutter_3.19.5/packages/flutter/lib/src/foundation/assertions.dart:271:37)
#6      GestureRecognizer.invokeCallback (/Users/xxx/flutter_3.19.5/packages/flutter/lib/src/gestures/recognizer.dart:329:18)
#7      TapGestureRecognizer.handleTapUp (/Users/xxx/flutter_3.19.5/packages/flutter/lib/src/gestures/tap.dart)
#8      BaseTapGestureRecognizer._checkUp (/Users/xxx/flutter_3.19.5/packages/flutter/lib/src/gestures/tap.dart:310:5)
#9      BaseTapGestureRecognizer.handlePrimaryPointer (/Users/xxx/flutter_3.19.5/packages/flutter/lib/src/gestures/tap.dart:244:7)
#07 abs 000

这就恢复了 原始类名和方法名,可以用于 分析和修复 Bug。

相关推荐
●VON6 小时前
Flutter 鸿蒙插件适配实战:用 device_screen_brightness 2.0.0 控制并监听屏幕亮度
flutter·华为·harmonyos
风早爽太15 小时前
Flutter 开发笔记:share_plus 分享插件
笔记·flutter
●VON15 小时前
Flutter 鸿蒙插件适配实战:用 boot_time_plugin 1.0.0 读取启动时间与运行时长
flutter·华为·harmonyos
不羁的木木17 小时前
给鸿蒙 App 增加唤起系统邮件发送能力 —— flutter_email_sender 的鸿蒙使用指南
flutter·华为·harmonyos
●VON18 小时前
Flutter 鸿蒙插件适配实战:用 accurate_storage_info 0.1.1 查询总量、可用量与已用量
flutter·华为·harmonyos
●VON19 小时前
Flutter 鸿蒙插件适配实战:用 network_status_bridge 0.0.5 查询并监听默认网络
网络·flutter·华为·harmonyos·鸿蒙
安好说AI20 小时前
Flutter for OpenHarmony 实战:媒体选择库 adaptive_image_picker 的鸿蒙化适配全解读
flutter·harmonyos·媒体
恋猫de小郭20 小时前
ADB Wi-Fi 2.0 ,Android 17 把无线调试的连接链路重新做了一遍
android·前端·flutter
●VON20 小时前
Flutter 鸿蒙插件适配实战:用 app_version_details 1.0.3 读取版本号与包名
flutter·华为·harmonyos
●VON1 天前
Flutter 鸿蒙插件适配实战:用 locale_plus 2.0.0 读取语言、地区与格式偏好
flutter·华为·harmonyos·鸿蒙