更新日志(Changelog)

格式参考 Keep a Changelog。

[1.0.1] — 2026-09-27

修复

  • 引擎:__file__ 等模块属性注入。PyRun_FileExFlags 不会像标准运行那样自动设置 __file__/__cached__/__loader__/__spec__,用户脚本里 os.path.dirname(__file__) / Path(__file__) 等高频写法会直接 NameError(已实测复现)。已在 pybridge.c 注入, 并重编 libpybridge.so(NDK 27.3 + CPython 3.13.9 交叉头文件)。
  • 引擎:并发运行状态机加固。execFile 是阻塞 JNI 调用,协程 cancel 无法中断; 原实现提前复位 busy 导致旧脚本未退出时新运行并发执行(sys.path/cwd/argv 互相污染、 输出串台)。现 busy/running 只在 execFile 真正返回时复位;Finished 事件幂等去重; stop() 增加中断兜底线程(2s 未收尾补发 Finished 130)。
  • UI:stopRun 兜底由 3s 延长到 8s 并对齐引擎实际状态,避免"UI 已停、进程还在跑"。
  • UI:运行 .java 文件给出明确提示(原实现把 Java 源码当 Python 执行,报无意义语法错误)。
  • 构建脚本:pkill -9 -f GradleDaemon 会误杀用户所有项目的 Gradle 进程,改为 gradlew --stop + 只清理陈旧(>10min)锁文件。

变更

  • 品牌化:项目更名为 CodePocket「口袋码」,README 全面改版;
  • 文档体系上线:docs/BRANDING.md(品牌方案)、docs/INTRODUCTION.md(项目介绍)、 docs/USER_GUIDE.md(用户手册)、docs/ARCHITECTURE.md(技术架构)、 docs/ROADMAP.md(路线图)、docs/PROMOTION.md(宣传文案包)、docs/FAQ.md(常见问题)、 CONTRIBUTING.md、SECURITY.md 更新;
  • README 如实修正:移除"预装 numpy/pandas/matplotlib"等不实表述,架构描述对齐原生 CPython;
  • 清理 4 处未使用 import。

[1.0.0] — 2026-09-26

新增

  • 正式版发布(versionCode 14),双引擎架构收口:APK 带原生运行时用 NativeEngine, 否则回退 Pyodide(过渡期);UI 对引擎切换透明。
  • 原生引擎核心能力稳定:真文件系统、input()/print() 桥接(中文不乱码)、 死循环可中断、报错行点击跳转、20+ 高频错误人话翻译。

变更

  • 版本号 1.0.0,包名 com.devterminal,minSdk 24 / targetSdk 35。

[0.9.2] — 2026-09-25

新增(阶段 1:原生 CPython 引擎落地)

  • 原生 CPython 3.13.9 运行引擎(PEP 738 官方 Android 支持,零外部依赖):
    • 工具链全部为免费公开物,无需任何申请/授权:NDK 27.3(Google 官方)+ CPython 源码(GitHub)+ BeeWare 预编译依赖;
    • libpython3.13.so 原生 ARM64 交叉编译产物 + libpybridge.so(自写 JNI 桥,约 350 行 C)随 APK 打包;
    • 标准库(7561 个纯 .py 文件)打包为 assets/python-stdlib.zip,首次运行解压到私有目录;
    • 引擎按需惰性初始化:首次运行前解压标准库并 Py_Initialize(约 0.5~2 秒),之后秒开。
  • 双引擎架构:EngineProvider 工厂自动选择——APK 带原生运行时用 NativeEngine,否则回退 Pyodide;UI 对引擎切换完全透明(RunEngine 接口)。
  • 原生引擎核心能力(相对 Pyodide/WASM 的质变):
    • 原生 ARM64 性能,不再有 WASM 1/10~1/50 降速;
    • 真文件系统:脚本直接读写 App 私有目录,cwd = 项目目录(不再是 WebView 虚拟 FS);
    • input()/print() 在 Python 层桥接(自定义 TextIOBase),无死锁、中文不乱码; Kotlin 侧做行缓冲(CPython 的 print 按参数多次 write),print("a","b") 正确显示为一行;
    • 死循环可中断:Py_AddPendingCall 在字节码检查点抛 KeyboardInterrupt;阻塞在 input() 时推 EOF 兜底,两条路径都能停下运行。

变更

  • 版本号 0.9.2(versionCode 12)。
  • 路线变更:废弃 Chaquopy 方案(需向 Chaquo 公司邮件申请开源 license,违反本项目 「零外部申请依赖」的硬约束),改为 CPython 官方 Android 支持自建原生运行时; docs/CHAQUOPY_LICENSE_APPLICATION.md 已删除。
  • 引擎注入点:EditorViewModel 由直接 new PyodideEngine 改为 EngineProvider.create(context)。
  • 构建脚本 scripts/build_apk.sh(沙箱专用:自动清 Gradle 孤儿锁 + 至多 3 次重试)、 打包脚本 scripts/package_native.sh(NDK clang 编译 JNI 桥 + 打包标准库)入库。

说明

  • 过渡期 Pyodide 仍在 APK 内(约 72MB assets);原生引擎验证稳定后整体下线, APK 预计从约 115MB 降至约 48MB。
  • input() 交互在原生引擎下需要用户在输出面板输入框输入——当前沿用 Pyodide 的输入面板, NativeEngine 已实现 writeStdin/closeStdin 接口,UI 无需改动。

[0.9.1] — 2026-09-24

修复(阶段 0:运行引擎止血)

  • 修复 input() 交互输入死锁:原实现用 while not __IQ__: time.sleep(0.05) 忙等等待输入,占死 JS 事件循环,导致 evaluateJavascript 注入的输入进不去, 真机必卡 120 秒超时。改用 Pyodide 官方 setStdin(浏览器默认行为即 window.prompt):Android WebView 的 JS 运行在独立线程,同步弹框不卡 UI, 交互输入真正可用。预喂输入队列保留(run 参数 / pushInput 均入队)。
  • 修复死循环超时/停止在真机失效:中断依赖 SharedArrayBuffer,而 WebView 拿不到 COOP/COEP 头,SAB 恒不可用、interruptBuffer 恒为 null(原注释说的 「强制重载」降级实际未实现)。现在 JS 侧把能力标记(sab/nosab)上报 Kotlin: 无 SAB 时停止/超时走 销毁 WebView 重建强杀(hardKillAndFinish), 死循环必然终止;Kotlin 侧兜底看门狗缩短到超时 +5s 并触发强杀。
  • 修复「停止」按钮与真实运行状态脱节:stopRun() 不再立即把 UI 置为已停止, 运行状态以引擎 Finished 事件为唯一权威来源,真正收尾后才翻回可运行态; 点击后先显示「正在停止…」反馈。
  • 输出改为官方 write handler:stdout/stderr 由逐字节 raw 回调改为整块 write 回调,大幅减少 JS↔Kotlin 桥调用次数(官方文档明确 raw 不推荐)。

变更

  • 版本号 0.9.1(versionCode 11)。运行时仍为 Pyodide 0.26.4; 本阶段为阶段 1(迁移原生 CPython,PEP 738)前的止血修复。

[0.9.0] — 2026-09-24

新增

  • 三态主题(跟随系统):设置页「主题外观」由原来的深浅二选一升级为 跟随系统 / 浅色 / 深色三态。选择「跟随系统」后,App 深浅随手机系统夜间模式 自动切换,无需重启即生效;编辑器主题(跟随明暗)、Markdown/HTML 预览配色 同步联动。旧版「深色主题」开关自动迁移为对应模式,老用户设置不丢失。

变更

  • 版本号 0.9.0(versionCode 10)。AppSettings.darkTheme(Boolean)升级为 themeMode(system / light / dark),SharedPreferences 增加 theme_mode 键, 首次升级时按旧 dark_theme 值迁移(true→dark、false→light)。

[0.8.0] — 2026-09-22

新增

  • matplotlib 离线画图:3.5.2 及全部依赖(pillow / fonttools / kiwisolver / cycler / packaging / pyparsing / matplotlib-pyodide)随 APK 打包,约 24MB, sha256 与 Pyodide 0.26.4 lock 完全一致;import matplotlib.pyplot 即用,零网络。

    端到端验证:无头 Chromium 实测 savefig 输出合法 PNG(19143 字节,魔数 89504e47)。

  • 编辑器多主题:新增 Monokai / 明日蓝 / Solarized 暗 / Solarized 亮 四套 TextMate 配色(源自 VS Code 内置主题,MIT),加上原有 Darcula / Quiet Light 共 6 套; 设置页新增「编辑器主题」选择,「跟随明暗」为默认值,与旧版行为向后兼容。 全部主题一次性预载入注册表,切换零 IO 等待。
  • Markdown / HTML 实时预览:打开 .md / .html 文件后,顶栏或命令面板可开启 编辑器分屏预览(上编辑 / 下渲染);基于 org.jetbrains:markdown 0.7.3 (IntelliJ 同款解析器,GFM 方言支持表格/删除线/任务列表)。 编辑停止 350ms 后自动刷新(collectLatest 防抖,只渲染最后一次输入); 预览 WebView 禁用 JavaScript 与 file:// 访问;超 500K 字符的文件分段渲染保护。

测试

  • 新增 MarkdownRendererTest(6 例):标题/加粗、GFM 表格、代码块转义、 页面壳明暗背景、HTML 直通、畸形输入兜底。全部 29 例通过。

变更

  • 版本号 0.8.0(versionCode 9);切到不可预览文件时预览分屏自动收起。

[0.7.0] — 2026-09-22

新增

  • 数据科学栈离线内置:随 APK 打包 numpy 1.26.4 / pandas 2.2.0 官方 Pyodide wheel (含 python-dateutil / pytz / six,共约 37MB,sha256 与 lock 完全一致)。 运行器在执行用户代码前用 loadPackagesFromImports 按 import 自动装载—— 写 import pandas 即用,全程零网络;看门狗在装载完成后才启动,不侵占用户超时。

    端到端验证:无头 Chromium(与 Android WebView 同内核)实测本地装载 0.7s, DataFrame 统计与 numpy 线性代数结果正确。

  • Git 能力回归(JGit):引入 org.eclipse.jgit(纯 Java,EDL-1.0), 重写 GitManager:init(main 分支)/ status(分支、变更、ahead/behind、最近提交)/ commitAll / push / pull 全部在应用进程内完成,依旧离线;远程 URL 支持内嵌 token, 结果回显只显示主机名,不回显 token。UI 层零改动。
  • 环境自检补齐「数据科学库」「Git 操作」两项能力标注。

修复

  • AI「已配置」判定恒为真:aiConfigured 原为「端点非空」,而默认值是占位的 本机 Ollama 地址(恒非空),导致「未配置」引导永不出现、AI 动作直接发请求必败。 改为显式持久化标志(KEY_AI_CONFIGURED),仅在设置页点「保存 AI 配置」时置真; 未配置时 AI 面板禁用输入与「发送」,占位文案给出引导。
  • 关于页过时文案:删除「内置 Python / Java 工具链」「Termux packages」, 改为 Pyodide / CPython 实况,许可列表同步更新。

变更

  • 版本号 0.7.0(versionCode 8);APK 体积约 32MB → 约 44MB (37MB wheel 在 APK 内压缩后约 11MB 增量 + JGit 约 1MB)。

测试

  • 新增 GitManagerTest(6 例,纯 JVM):真实建仓 / 提交 / 状态读取; 顺带修出真 bug——刚 init 未提交时 log() 抛 NoHeadException 导致 status 误报 「不是仓库」。全部 23 例通过。

[0.6.0] — 2026-09-22

重构(核心:把「离线」从宣传变成事实)

  • 执行引擎整体替换为 Pyodide(WebAssembly):新增 PyodideEngine.kt, 以内嵌 WebView + WebViewAssetLoader 承载 WASM 版 CPython, 运行时(pyodide.asm.wasm + python_stdlib.zip,约 13MB)随 APK 打包,装完即离线。
  • 删除旧的原生工具链方案:移除 TermuxEngine.kt 与 EnvironmentInstaller 中 的 usrtar.zip 解压逻辑、Termux 环境变量模拟等全部死代码。

    旧方案要求一个 441MB 的 assets/usrtar.zip,该文件不入库、必须联网下载, 导致 clone 源码构建出的 APK 根本跑不了代码——「离线」名不副实。

  • 新增运行器页面 app/src/main/assets/python-runner.html: 移植自 design/pyworker.js 的成熟逻辑(流式 UTF-8 解码、traceback 内部帧清洗、 setup 与用户代码分离以避免行号偏移、中断缓冲超时)。

新增

  • input() 运行中交互:JS 侧输入队列 + pushInput 桥,程序阻塞在 input() 时 可被 Kotlin 侧实时唤醒,不再是"仅支持预喂"。
  • 环境自检改为校验运行时完整性:EnvDiagnostics 现在逐个检查 APK 内 Pyodide 资源是否齐备,并明确标注各项能力(Python 可用 / Java 不可用)。
  • 构建约束固化:build.gradle.kts 增加 noCompress += listOf("wasm", "zip"), 避免 AAPT 压缩导致 WebView 无法加载 WASM;新增 androidx.webkit 依赖。

变更(能力边界,诚实标注)

  • Java 执行下线:JVM 无法运行于 WebAssembly 沙箱。保留编辑与语法高亮, 运行时给出明确说明而非报错崩溃。
  • Git 操作下线:原依赖工具链内的 git 二进制。保留 UI 与接口, 后续可通过 JGit(纯 Java 实现)恢复。
  • README 全面校正:删除"Python + Java 全程零网络""本机 Ollama 离线 AI" 等与实现不符的宣称,新增「能力边界」章节。

说明

  • Java 与 Git 的恢复属于后续独立阶段的工作,本轮聚焦「让 Python 真正离线可跑」。

[0.5.0] — 2026-09-17

新增

  • 离线真实 Python 运行引擎(设计稿验证版):design/mockup.html 接入 Pyodide 0.26.4 (本地 vendor 到 design/pyodide/full/,Web Worker 架构),实现真实 stdout/stderr 捕获、 完整 traceback、input() 预喂、多文件 import、超时中断。
  • 内置题库(11 道真实可运行题目):素数筛 / 递归栈溢出 / 语法错误 / 除零 / KeyError / 多文件模块导入 / 5000 行长输出 / 死循环超时 / 文件读写 / 中文 Emoji / 交互式问答。
  • 报错行点击跳转:真实 traceback 进入输出面板即自动变为可点击行,点击后编辑器滚动并高亮 对应源码行;与 Kotlin 端 parseErrorLine(app/.../OutputPanel.kt)正则逐字符一致。
  • 端到端测试脚手架:tools/serve_design.py(多线程静态服务)、tools/test_suite.py (Playwright 驱动逐题真实运行 + 断言 + 截图 + 录屏)、tools/test_ui.py(UI 交互覆盖)、 tools/build_promo.py(宣传片生成)。

修复

  • Pyodide worker 超时提示字符串拼接错误:原 '⏱ 已超时取消(" + sec + 's)…' 拼接语法错误, sec 不被插值;改为正确拼接。
  • traceback 内部帧清洗:过滤 Pyodide 注入的 _pyodide/_base.py、CodeRunner 等栈帧, 避免被 parseErrorLine 误判为可跳转行。
  • 中文/Emoji 乱码:raw 回调返回 UTF-8 字节流,改用 TextDecoder('utf-8') 流式解码。
  • 多文件 import 失败:runPythonAsync 不自动把 cwd 加入 sys.path,setup 阶段补 sys.path.insert。
  • 报错行号偏移:setup 与用户代码分离为两次 runPythonAsync,避免 setup 撑偏行号。

测试

  • 端到端全量测试 11/11 通过(约 44s,含首次解释器预热); 逐题验证真实输出、报错行可跳转、中文无乱码、死循环 3s 安全终止。
  • 交付:宣传片 + 题库遍历录屏 + UI 交互录屏 + 27 张截图 + 结构化测试报告(见 test_results/)。

构建

  • versionCode 5 → 6,versionName 0.4.1 → 0.5.0。
  • 说明:本轮核心改动落在 design/ 设计稿与测试工具链,原生 APK 未集成 Pyodide (APK 仍走 usrtar.zip + TermuxEngine 的本地 Linux 用户空间方案)。

[0.4.1] — 2026-09-16

新增

  • 横屏两栏布局:编辑器在左(64%)、输出面板在右(36%),中间细分隔线; 内容抽成局部 Composable 复用,拖拽把手仅在竖屏显示。 设计稿的 grid 方案(design/mockup.html)先行验证过收益:横屏下代码可见高度从 0 恢复到 180dp
  • JUnit 单元测试:ParseErrorLineTest 17 个用例锁定报错行解析 (Python traceback / javac / flake8 / 路径前缀 / 版本号与时间戳误报 / Int 溢出等), 与 tools/tests/test_parse_error_line.py 用例一一对应,跑 ./gradlew :app:testDebugUnitTest

构建

  • versionCode 4 → 5(0.4.0 的 APK 无横屏两栏,避免同版本号两种内容)
  • 排查:多个 Gradle daemon 并存时会复发 usrtar.zip 的 MD5 哈希竞态 (本次发生在 packageDebug),./gradlew --stop 后单实例构建即恢复稳定

[0.4.0] — 2026-09-16

构建(技术栈全面升级)

  • Kotlin 2.0.21(K2 编译器):Compose 编译器改为独立插件 org.jetbrains.kotlin.plugin.compose, 移除 kotlinCompilerExtensionVersion
  • AGP 8.7.3 / Gradle 8.11.1 / compileSdk & targetSdk 35(Android 15)
  • Compose BOM 2024.12.01(material3 1.3.1)、SoraEditor 0.23.6、 core-ktx 1.15.0 / activity-compose 1.9.3 / lifecycle 2.8.7、desugar 2.1.4
  • Version Catalog(gradle/libs.versions.toml):全部依赖版本集中管理
  • org.gradle.parallel=false:规避 Gradle 8.11 并行执行对 461MB usrtar.zip 的哈希读取竞态

新增(使用逻辑)

  • 报错行可点击跳转:输出面板解析 line N 与 file.ext:N 两类报错行(0 基换算、 跳过 💡 提示与 —— 分隔线),点击后编辑器光标直达对应行; ScrollToLineRequest 用 seq 自增保证连点同一行也响应
  • 首启引导空态:无项目时展示「写代码,不用联网」+ 新建 / 导入双入口; 有项目未开文件时改为「选一个文件开始」
  • 弹窗状态收敛为 Overlay 密封接口:替换 9 个独立布尔值, 编译期保证同一时刻至多一个面板
  • 返回键三层处理:搜索面板 → 抽屉 → 弹窗,逐层退出

变更(前端)

  • Motion 动效体系(theme/Motion.kt):统一时长(120/220/320ms)与缓动曲线 (Emphasized Decelerate / Accelerate),拖动跟随用 NoBouncy spring
  • 触觉反馈(components/Haptics.kt):运行结束按退出码区分成功(CONFIRM, API<30 回退 VIRTUAL_KEY)/ 失败(LONG_PRESS)
  • 触控尺寸:图标按钮最小 48dp,符号栏键帽 32→38dp
  • 输出面板高度上限改为按可用高度 62% 动态计算(横屏 / 小屏不再挤没编辑器)

文件管理

  • 文件树默认展开第一层,折叠目录显示子项数量
  • 抽屉标题栏提示「长按可重命名」

设计

  • design/mockup.html 与 App 行为对齐:首启引导可视化、报错行点击跳转演示 (utils.py 第二次运行)、浅色主题(色值逐项对齐 Theme.kt 的 QuietLight)
  • 修复设计稿 4 处缺陷:跳转重建 DOM 冲掉语法高亮、行号高亮残留、 引导页盖住状态栏、行内高度压过媒体查询
  • 补齐响应式媒体查询:矮屏压缩输出面板、横屏两栏网格
  • 新增 21 张高清截图(深色 15 + 浅色 6)、33.6s 交互录屏 design/demo.mp4

[0.3.0] — 2026-09-14

新增

  • 命令面板 ⌘K:顶栏命令图标唤出,搜索直达所有功能(运行 / Git / AI / 片段 / 设置),Cursor 范式
  • Git 面板:状态 / 初始化 / 提交 / 推送 / 拉取,直接调用内置 git 二进制(离线可用); 报错翻译(403→令牌、rejected→先拉取);Git 身份与远程 URL 配置
  • AI 助手(可选):OpenAI 兼容协议,默认端点本机 Ollama(本地推理 = 离线可用); 快捷动作:解释此文件 / 修复运行错误 / 生成测试 / 加注释; 「修复运行错误」自动携带最近运行的报错输出与当前文件上下文
  • 全局搜索:跨文件搜索(防抖 400ms、上限 200 条),命中行点击直达
  • 代码片段库:12 个骨架模板(Python 主入口 / 类 / dataclass / 装饰器, Java POJO / Stream / 正则等),从命令面板插入光标处
  • 双指缩放:编辑器字号随捏合手势调整(10–24sp,实时持久化)
  • 输出分享:系统 ShareSheet 分享运行结果
  • 设置页新增 AI 端点配置(URL / 模型 / Key)

变更

  • Manifest 增加 INTERNET 权限:仅 AI 可选用途,未配置端点时 App 不发起任何网络请求

[0.2.0] — 2026-09-14

新增

  • 多文件 Tab 条:一键切换,关闭自动切相邻(对标 VS Code / Acode)
  • 快捷符号栏:26 编程符号 + Tab / 退格,插入走编辑器撤销栈(对标 Pydroid 3 / Spck)
  • 查找 / 替换:实时匹配计数、跳转滚动定位、单个 / 全部替换
  • 会话恢复:重启回到上次项目 / Tab 列表 / 编辑文件
  • 输出面板拖拽调高(120–560dp),高度持久化
  • 底部状态栏:Ln/Col、语言、字符数、保存状态

构建(v0.3.0 实测产出 APK)

  • 真实构建成功:纯 Linux 沙盒(无 Android SDK、无 Google 网络)内 assembleDebug 出包, 产物 47MB debug APK(com.devterminal 0.3.0 / minSdk 24 / targetSdk 34)
  • 内置离线工具链 usrtar.zip:从 Termux F-Droid 官方 bootstrap(arm64 v1022,sha256 校验)
    • termux-main 仓库 BFS 解析 17 个依赖包合并而成;Python 3.14.6、bash、coreutils、curl、 tar、sqlite 等共 1745 个文件,symlink 全部物化、ELF 依赖静态校验通过
  • 内置语法高亮资源 textmate/:18 种语言(py/java/kt/js/ts/html/css/json/md/sh/c/cpp/go/ rs/sql/yaml/xml/lua)29 个扩展名条目,含 darcula 主题
  • 开启 core library desugaring(language-textmate 0.23.5 要求)
  • 构建镜像化:Gradle 8.9 → 腾讯云;Maven 依赖 → 阿里云;SDK 组件 → 腾讯云 AndroidSDK 镜像

修复

  • 输出面板由固定 260dp 改为可调,长输出不再挤压

[0.1.0] — 2026-09-14

首个版本

  • Kotlin + Jetpack Compose + Material 3 完整工程
  • 离线执行引擎:ProcessBuilder + termux 环境变量模拟,工具链预打包零网络
  • Python 交互式 stdin(input())、Java 多文件编译运行
  • 环境自检、友好报错(20+ 高频错误翻译)、运行配置、文件管理、前台服务保活
  • SAF 导入导出、设置页、静态补全、崩溃日志
  • 高保真可交互 UI 原型(design/mockup.html)与静态自检脚本