当前开发阶段是 M2 原生 Android 客户端:按 tools/ForFilm 的五页结构与 Ark 黑白黄风格重新实现 Android Views,不使用 WebView。BLE 保持设备控制连接,传图时临时建立 2.4GHz WiFi Direct GO,由 Ark 下载手机提供的 .film。
当前开发优先级(2026-10-08):网页主题统一与状态收敛后,开始研究 Flutter 原生界面重构。现有 Android Views 工程保留为通信实现基线;下述 M1/M2 是已有工程的验证记录,不是 Flutter 的完成记录。取消与重试的实机验收仍为待完成,不因切换框架而视为通过。
新工程位于 flutter_app,已有六页原生框架、双主题、通行证内存预览与 Android BLE 桥接。Dart 静态检查、3 项 widget 测试和 Web 预览构建通过;Android APK 首次构建被 C 盘空间不足阻塞,尚未完成 Android 编译或实机连接验收。旧工程继续作为通信内核来源和既有验证记录。
ArkSession、ArkBleController、ArkP2pController、FilmHttpServer、DirectTransferCoordinator。Flutter 不再通过另一 BLE 插件建立第二条设备连接。WiFi Direct 群组密码留在原生层。TransferSnapshot。发起操作、GATT 写完成、设备回包与最终完成是不同状态;设备改名必须保留现有同通道回包确认。FilmConverter 的六色/黑白 v1 转换,跨通道传受管理的文件路径和状态;预览变化采用只处理最新请求的调度,避免滑杆积压。高级算法、GIF 编辑与批量队列后续单独迁移。实施顺序:
.film 文件传输:开始、进度、取消、清理中、失败、重试。使用系统蓝牙稳定的手机完成 START 后取消与同文件重试验收。开发环境:Flutter stable 3.47.6 / Dart 3.13.5 已安装到仓库忽略目录 .output/toolchains/flutter,新宿主由官方模板生成。Android SDK 目录与 platform-tools 已存在;APK 构建前须解决 C 盘空间,并将大型构建依赖安排到空间充足的磁盘。现有 Android 项目和新宿主均使用 compile/target SDK 35、min SDK 29、JVM 17。
技术依据:Flutter platform channels、Android WiFi Direct。Android 13+ 的附近 WiFi 权限、旧系统的定位要求及 BLE 权限仍由平台层按系统版本处理。
.film 规范。当前量化为 RGB 最近色 + 可选 Floyd–Steinberg,不声称与网页全部高级算法逐像素一致。.film;GIF 编辑、逐帧画板、批量队列和 46/55 色、SZ 增强尚未迁移。界面明确显示当前支持范围。ArkSession 统一持有 BLE;传输期间串行隔离普通设备命令,结束后保留连接。单个本地文件支持取消与重试;重试前先确认旧固件会话和手机直连组已经清理,清理未确认时显示“重试清理”。FRAMEFILMARK 或 FRAMEFILMARK-<后缀>,列表显示扫描包中的实际设备名;订阅 GATT 通知,通过 0x42 读取屏幕参数。0x54 读取、0x55 保存 Ark 蓝牙设备名。用户只编辑后缀(1–16 个 UTF-8 字节),完整名称最多 29 字节;收到设备同通道通知才视为成功。保存后需重启设备或重新初始化蓝牙才会更新广播名,App 不自动重启。旧固件不支持时约 7 秒超时,可继续使用其他功能。DirectTransferProbe 会读取原有 WiFi 配置、建立临时群组、通过 Ark 专用的 0x50/0x51/0x52 命令发送和查询测试文件,最后比较配置并清理临时资源。M1 的测试文件按钮已由 M2 原生文件上传入口替代。密码只在内存中传给 Ark,不显示在日志。需要 JDK 17 或 21、Android SDK Platform 35 和 Build Tools 35.0.0。设置 ANDROID_HOME,或在不入库的 local.properties 中设置 sdk.dir。
.\gradlew.bat :app:assembleDebug
adb -s <手机序列号> install -r -g app/build/outputs/apk/debug/app-debug.apk
adb -s <手机序列号> shell am start -n org.framefilm.ark.dev/org.framefilm.ark.MainActivity
开发版包名为 org.framefilm.ark.dev,与未来正式版分开。应用仅在用户操作后扫描、连接或建组。Android 12+ 需要附近蓝牙权限,Android 13+ 需要附近 WiFi 权限;较旧系统的扫描还需要定位权限和系统定位开关。
先断开电脑网页与 Ark 的 BLE 连接,手机保持蓝牙和 WiFi 开启。不要在已有其他 WiFi Direct 业务运行时测试。探针拒绝接管已有群组。
adb -s <手机序列号> shell am instrument -w org.framefilm.ark.dev/org.framefilm.ark.ConnectivityProbe
探针必须同时报告 result=PASS 和 cleanupCompleted=true 才算通过。它调用与界面相同的控制器,不模拟屏幕点击。探针仅编入 debug APK;输出不包含群组密码。
M1 真文件传输探针(同样仅在 debug APK 中):
adb -s <手机序列号> shell am instrument -w org.framefilm.ark.dev/org.framefilm.ark.DirectTransferProbe
请先给应用授予附近蓝牙和附近 WiFi 权限,并确保手机没有其他 WiFi Direct 组。异常时探针请求取消,等待 Ark 报告恢复完成后再释放手机 HTTP 服务及直连组;最长可能等待数分钟。
adb -s <手机序列号> shell am instrument -w org.framefilm.ark.dev/org.framefilm.ark.NativeAppProbe
探针启动实际 MainActivity,确认五页原生控件导航、六色文件头与像素排列,再用生成的测试图执行 START 后取消及同文件重试。只写独立时间戳文件名。该探针不操作系统相册/相机/导出选择器,也不替代全部人工验收。
固件基础功能与设备端通行证界面完成后,再按实际使用继续迁移 App 高级图片算法与动画编辑;本协议不与小米互传私有协议互通。
第三方 ROM 声明支持 WiFi Direct 仅表示具备接口,兼容性以具体手机的实测结果为准。
0.2.0-dev 调试 APK 编译通过,不包含运行时 WebView 页面。初次原生探针通过五页导航和六色编码检查(文件头、172,832 字节、颜色码与 180° 排列),随后停在设备发现阶段。.output/ark/logs/android-m2-native-scan-fix-build.log。Status: ok;解锁后重新执行探针返回 Process crashed。联调期间系统 com.android.bluetooth 在 07:03:05 与 07:03:31 再次因 LE_EXTENDED_CREATE_CONNECTION(0x2043) was not expecting complete event 中止,与 M0 的系统蓝牙故障一致。尚未完成 START 后取消或重试,不能将此记录为 App 传输通过,也不将系统崩溃直接归因于 App 代码。android-m2-native-probe.log、android-m2-native-probe-mi9-unlocked.log、android-m2-mi9-bluetooth-crash.log,均位于 .output/ark/logs/。用户暂时无法更换手机,已停止实机测试并保留当前成果;下次使用 M1 已通过的新手机完成剩余验收。本轮未修改或烧录固件。.output/ark/backups/pre-direct-m1-app.bin。owner=true, groupFormed=true, addressPresent=false, passphrasePresent=true。客户端改为有限等待真实地址,并在失败时确认本次组是否释放。为调试失败恢复增加 DirectTransferProbe -e cleanupGroup <精确组名> 分支;只清理匹配且属于 GO 的组,不修改其他组。result=PASS、cleanupCompleted=true。Ark 经 WiFi 保存 43,232 字节已知有效的 720×480 单帧 .film,状态从 RESTORING 进入 DONE,接收字节数和总长均为 43,232;原有 WiFi 开关、SSID、密码和 API 地址查询结果前后一致。本机原配置为 WiFi 关闭、网络信息为空,尚未验证恢复已有路由器连接。InactiveState,groupFormed=false,临时组已释放。测试文件使用独立时间戳名称,未覆盖用户原有图片。.output/ark/logs/build-direct-m1-final.log、flash-direct-m1.log、android-direct-m1-gatt-fix-build.log、android-direct-m1-probe-gatt-fixed.log。最终传输依据设备 BLE 状态回包;串口捕获在最终传输前已结束,不能声称最终串口日志验证了保存或屏幕刷新。25042PN24C、设备代号 dijun,系统自报 Android 17 / API 37。使用现有 APK 和已授予的附近设备权限执行探针。0x02、720×480;手机建立临时 2.4GHz GO 组后,BLE 再次查询仍得到相同屏参。InactiveState,但客户端收到关闭通道的迟到回调,误报“清理未确认”。已修复:关闭前作废通道身份,忽略主动关闭及旧通道的迟到回调。result=PASS、cleanupCompleted=true,没有清理误报。修复版已安装到新手机。.output/ark/logs/android-m0-probe-dijun-fixed.log。本轮只验证手机建组与 BLE 控制通信并存;Ark 尚未通过 WiFi 加入该组,没有进行 WiFi 文件传输或吞吐测试。:app:assembleDebug 均构建通过;使用 JDK 21、Gradle 8.11.1、AGP 8.10.1、SDK 35。Status: ok,冷启动约 696ms,应用进程存在。这是启动验证,不代表界面视觉验收。Process crashed;同一阶段日志记录系统进程 com.android.bluetooth 在 MiuiBluetooth/system/gd/hci/hci_layer.cc:256 因 LE_EXTENDED_CREATE_CONNECTION(0x2043) was not expecting complete event 中止。尚无成功的屏参回包,未进入 WiFi 建组步骤;不能把它记为 BLE 或双通道通过,也尚不能仅凭此断言探针退出的完整因果链。.output/ark/logs/android-m0-probe.log 和 android-m0-probe-crash.log,不将手机原始系统日志入库。