■ 抽取捆绑脚本
   assets/flutter_assets/assets/blutter.py                    -> blutter.py
   assets/flutter_assets/assets/dartvm_fetch_build.py         -> dartvm_fetch_build.py
   assets/flutter_assets/assets/extract_dart_info.py          -> extract_dart_info.py

■ blutter 二进制形态
   libblutter.so                                  3.10 MB  ELF64 | ET_DYN | AArch64 | entry=0xbc9a0 | interp=/system/bin/linker64
         RUNPATH /data/data/com.termux/files/usr/bin/../../usr/lib
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_2_14.so                             2.96 MB  ELF64 | ET_DYN | AArch64 | entry=0xcdb80 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_2_15.so                             3.16 MB  ELF64 | ET_DYN | AArch64 | entry=0xdd3d0 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_2_16.so                             3.16 MB  ELF64 | ET_DYN | AArch64 | entry=0xde220 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_2_17.so                             3.22 MB  ELF64 | ET_DYN | AArch64 | entry=0xe3840 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_2_18.so                             3.29 MB  ELF64 | ET_DYN | AArch64 | entry=0xe8400 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_2_19.so                             3.35 MB  ELF64 | ET_DYN | AArch64 | entry=0xebf10 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_0_90.so                           3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xeeb20 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_0_aa.so                           3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xeebb0 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_1.so                              3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xec610 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_10.so                             3.16 MB  ELF64 | ET_DYN | AArch64 | entry=0xbc9a0 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_11.so                             3.16 MB  ELF64 | ET_DYN | AArch64 | entry=0xbd0f0 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_12.so                             3.29 MB  ELF64 | ET_DYN | AArch64 | entry=0xc06d0 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_2.so                              3.48 MB  ELF64 | ET_DYN | AArch64 | entry=0xec260 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_3.so                              3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xeb350 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_4.so                              3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xea510 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_5.so                              3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xeb6c0 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_6.so                              3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xee540 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_7.so                              3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xee500 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_8.so                              3.42 MB  ELF64 | ET_DYN | AArch64 | entry=0xee5d0 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so
   libblutter_3_9.so                              3.16 MB  ELF64 | ET_DYN | AArch64 | entry=0xbc150 | interp=/system/bin/linker64
         RUNPATH $ORIGIN
         NEEDED liblog.so
         NEEDED libcapstone.so
         NEEDED libdl.so
         NEEDED libc.so
         NEEDED libicuuc.so
         NEEDED libc++_shared.so
         NEEDED libm.so

■ 在 kernel_blob.bin / dex 里搜版本映射线索
   扫描字节数: 85.5 MB
   blutter              178
   Blutter              48
   libblutter           26
   blutter_             108
   dartvm_fetch         0
   extract_dart_info    0
   snapshot_hash        0
   dart_version         0
   pointer_compression  0
   arm64                11
   pp.txt               78
   blutter_out          0
   asm                  76
   /blutter             108
   capstone             2
   DartInfo             0

■ 含 'lutter' 的字符串 (8762 条)
                              // though Flutter's widget system believed otherwise). This likely
                          FlutterErrorDetails(
                          Text('Blutter GUI', style: Get.textTheme.titleLarge),
                          exception: FlutterError(
                        //  https://github.com/flutter/flutter/issues/48522
                        FlutterError.reportError(
                        FlutterErrorDetails(
                       throw FlutterError('separatorBuilder cannot return null.');
                      FlutterError.reportError(
                      FlutterErrorDetails(
                    'Blutter GUI - Flutter 
                    'The RawKeyboard.instance.keyEventHandler assigned by Flutter is a dummy '
                    // though Flutter's widget system believed otherwise). This likely
                    FlutterError.reportError(
                    FlutterErrorDetails(
                  '  https://api.flutter.dev/flutter/rendering/debugDumpRenderTree.html',
                  '  https://flutter.dev/to/debug-render-layer\n'
                  '  https://github.com/flutter/flutter/issues/new?template=02_bug.yml',
                  'Flutter App 
                  'See https://flutter.dev/to/internationalization/ for more '
                  'your fault. Contact support: https://github.com/flutter/flutter/issues/new?template=02_bug.yml',
                  (throw FlutterError(
                  // https://github.com/flutter/flutter/issues/69908
                  ? TraversalEdgeBehavior.leaveFlutterView
                  ErrorHint('This usually indicates an error in the Flutter framework itself.'),
                  FlutterError.reportError(
                  FlutterErrorDetails(
                  error = FlutterError.fromParts(<DiagnosticsNode>[
                  exception: FlutterError(
                  throw FlutterError.fromParts(<DiagnosticsNode>[
                 deprecatedDoNotUseWillBeRemovedWithoutNoticeRenderView.flutterView == view,
                 throw FlutterError(
                 throw FlutterError.fromParts(<DiagnosticsNode>[
                '  https://api.flutter.dev/flutter/widgets/AnimatedGridState-class.html',
                '  https://api.flutter.dev/flutter/widgets/AnimatedListState-class.html',
                '  https://api.flutter.dev/flutter/widgets/ReorderableListState-class.html',
                '  https://api.flutter.dev/flutter/widgets/SliverReorderableListState-class.html',
                '  https://github.com/flutter/flutter/issues/new?template=02_bug.yml',
                '<https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html> '
                'All FlutterError objects should have only a single short '
                'If $T is a custom binding mixin, there must also be a custom binding class, like WidgetsFlutterBinding, '
                'If this is a custom binding mixin, there must also be a custom binding class, like WidgetsFlutterBinding, '
                'In a test, one can call "TestWidgetsFlutterBinding.ensureInitialized()" as the first line in the test\'s "main()" method '
                'Powered by Flutter',
                'See "Types with special considerations" at https://api.flutter.dev/flutter/animation/Tween-class.html '
                'To inspect this widget in Flutter DevTools, visit: $devToolsInspectorUri',
                'Typically, this is done by calling "WidgetsFlutterBinding.ensureInitialized()" or "runApp()" (the '
                'your fault. Contact support: https://github.com/flutter/flutter/issues/new?template=02_bug.yml',
                (throw FlutterError('$target and $this are not in the same render tree.'));
                // Devtools, the Intellij plugin, and the flutter tool all depend
                // amount of overscroll - https://github.com/flutter/flutter/issues/11884
                // https://github.com/flutter/flutter/issues/119573.
                FlutterError.demangleStackTrace(
                FlutterError.reportError(
                FlutterErrorDetails(
                _$flutterPluginBinding.pointer)
                _buildFeatureRow(Icons.bolt, 'Blutter 
                addendum.add(ErrorHint('See also: https://flutter.dev/unbounded-constraints'));
                exception: FlutterError(
                exception: FlutterError.fromParts(<DiagnosticsNode>[
                final FlutterError error;
                stackFrames[0].package == 'flutter' &&
                stackFrames[1].package == 'flutter';
                throw FlutterError(
                throw FlutterError.fromParts(<DiagnosticsNode>[
                throw FlutterError.fromParts(information);
                to.parent ?? (throw FlutterError('$target and $this are not in the same render tree.'));
               : identical(style, FlutterLogoStyle.horizontal)
               throw FlutterError(
              "a sheet of material. In Flutter's material library, that "
              '  https://api.flutter.dev/flutter/material/Scaffold/of.html',
              '  https://github.com/flutter/flutter/issues/new?template=02_bug.yml',
              '${_stringify(details.exception)}\nSee also: https://docs.flutter.dev/testing/errors';
              'All FlutterError objects should start with a short (one line) '
              'See also: https://api.flutter.dev/flutter/material/ListTile-class.html#material.ListTile.4',
              'The Flutter bindings were initialized in a different zone than is now being used. '
              'This is typically either due to https://github.com/flutter/flutter/issues/125975, '
              'https://api.flutter.dev/flutter/widgets/SliverAnimatedGridState-class.html\n'
              'https://api.flutter.dev/flutter/widgets/SliverAnimatedListState-class.html\n'
              'your fault. Contact support: https://github.com/flutter/flutter/issues/new?template=02_bug.yml',
              // (https://github.com/flutter/flutter/issues/18057#issue-328003931)
              // See: https://github.com/flutter/flutter/issues/141775.
              // TODO(TonicArtos): Remove MouseRegion workaround for pointer hover events passing through DraggableScrollableSheet once https://github.com/flutter/f
              // https://github.com/flutter/flutter/issues/102001
              // https://github.com/flutter/flutter/issues/134723
              DiagnosticsProperty<FlutterError>(
              ErrorHint('See https://flutter.dev/to/unbounded-constraints for more information.'),
              ErrorHint('This could be an error in the Flutter framework.')
              ErrorHint('This usually indicates an error in the Flutter framework itself.'),
              ErrorSummary('FlutterError contained multiple error summaries.'),
              FlutterError('Can not change entry mode from ${widget.entryMode}');
              FlutterError.defaultStackFilter(
              FlutterError.demangleStackTrace(stack!),
              FlutterError.reportError(
              FlutterErrorDetails(
              FlutterErrorDetailsForPointerEventDispatcher(
              FlutterTimeline.finishSync();
              FlutterTimeline.startSync('${newWidget.runtimeType}', arguments: debugTimelineArguments);
              addLog('   bin/blutter_dartvm<ver>_android_arm64');
              addLog('   cd blutter');
              addLog('   git clone https://github.com/worawit/blutter.git');
              addLog('   python3 blutter.py /path/to/app/lib/arm64-v8a out_dir');
              const FlutterErrorDetails(
              developer.postEvent('Flutter.FirstFrame', <String, dynamic>{});
              error = FlutterError('Radio groups must not have multiple checked children');
              exception: FlutterError(
              exception: FlutterError('Attempt to set $desiredSensitivity sensitivity failed: $e}'),
              exception: FlutterError.fromParts(<DiagnosticsNode>[
              final FlutterView? view = View.maybeOf(context);
              result = FlutterError.fromParts(<DiagnosticsNode>[
              throw FlutterError(
              throw FlutterError('Unknown keymap for key events: $keymap');
              throw FlutterError.fromParts(<DiagnosticsNode>[
              title: 'Blutter GUI',
             'Image.file is not supported on Flutter Web. '
             onShare: null, // See https://github.com/flutter/flutter/issues/141775.
            "", dialogTitle ?? "flutter picker", xdpOption);
            '  https://api.flutter.dev/flutter/material/Scaffold/of.html',
            '${kIsWeb ? "\nSee: https://flutter.dev/to/web-multiview-runwidget" : ""}',
            'Android Flutter View has a content sensitivity mode '
            '`--track-widget-creation` to `flutter run` or `flutter test`.',
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.clear$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.getAll$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.remove$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.setBool$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.setDeprecatedStringList$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.setDouble$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.setEncodedStringList$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.setInt$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesApi.setString$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.clear$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.getAll$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.getBool$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.getDouble$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.getInt$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.getKeys$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.getPlatformEncodedStringList$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.getString$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.getStringList$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.setBool$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.setDeprecatedStringList$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.setDouble$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.setEncodedStringList$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.setInt$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_android.SharedPreferencesAsyncApi.setString$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_foundation.LegacyUserDefaultsApi.clear$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_foundation.LegacyUserDefaultsApi.getAll$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_foundation.LegacyUserDefaultsApi.remove$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_foundation.LegacyUserDefaultsApi.setBool$pigeonVar_messageChannelSuffix';
            'dev.flutter.pigeon.shared_preferences_foundation.LegacyUserDefaultsApi.setDouble$pigeonVar_messageChannelSuffix';
