分层职责
| 层次 | 实现组件 | 职责 | 不承担的职责 |
|---|---|---|---|
| Android宿主层 | MainActivity、WorkbenchService、StartupAnimationView、ExportPolicy、ExportProvider | 生命周期、启动画面、WebView、系统选择器、通知、唤醒、另存与分享安全 | 不实现TTS模型、不承载远端账号授权 |
| 前端交互层 | Jinja模板中的内联JS、mobile.js、mobile.css | 文案和标题、音色、图片来源、状态展示、确认操作、草稿、四页导航 | 不作为唯一的验证或额度权威 |
| 本机服务层 | android_runtime.start、Flask app、guard | 手机私有回环服务、鉴权、JSON接口、资源和媒体返回 | 不面向局域网或互联网开放API |
| 业务调度层 | app.py、Control、WORKERS、ACTIVE、CONTROLS | 创建任务、线程调度、阶段状态、确认闸门、暂停/取消、恢复、素材保留 | 无持久化多任务队列、无OS JobScheduler |
| 素材处理层 | speech.py、photo_import.py、seedream.py、标题脚本 | 在线语音、输入图片安全、云端图像适配、画面绘制 | 无端侧大模型、无文字AI改写 |
| 媒体执行层 | Android FFmpeg/FFprobe PIE程序 | H.264/AAC编码、格式/时长/流探测、进度输出 | 无Android MediaCodec硬件编码分支 |
| 私有数据层 | JSON/JSONL、PNG、MP3、MP4 | 草稿、任务快照、语音片段、素材、成品、日志、试用账本 | 无SQLite/Room、无同步服务器 |
进程与线程
Activity、Service、WebView宿主和Chaquopy均处于默认应用进程,Manifest没有独立android:process声明。Service有单线程计划执行器,Python本机HTTP服务以daemon线程运行且请求处理支持线程;每个业务步骤由daemon线程执行,音频步骤内部运行asyncio事件循环。FFmpeg和FFprobe通过Python子进程执行,不由JNI媒体接口加载。
libffmpeg.so和libffprobe.so虽使用.so名字,实际是Android ELF64 PIE可执行程序。这个名称方便Android安装时将其提取到nativeLibraryDir;执行路径来自系统应用信息,不依赖PATH中另行安装FFmpeg。
Chaquopy作为Android Gradle插件将Python运行时、Python业务和对应ABI依赖打入APK;本项目使用Java API在宿主中启动与调用Python模块。Chaquopy 17 Gradle文档说明这一接入机制;具体版本和模块调用以本项目配置为准。
依据:app/build.gradle:9–55、AndroidManifest.xml:14–27、WorkbenchService.java:47–57、android_runtime.py:168–187、app.py:325–366。