KernelVault:把 AI 装进手机,让隐私资料只在本机被看懂
Your private files, organized locally by AI.
从一个 Android 开发者视角,记录如何用 Jetpack Compose + SQLite / FTS + MNN 端侧模型,做一个"不联网、不上传、不默认改写原文件"的手机隐私资产整理工具。
1. 起因:为什么我要做这个
1.1 手机里最难找的,往往也是最不想上传的
每个人手机里都有一类资料:平时不怎么打开,但关键时刻一定会找。
电子发票、合同截图、证件照片、付款凭证、聊天记录、会议材料、下载文档、录音、压缩包。它们混在相册、下载目录、聊天软件缓存和系统文件夹里。真要找的时候,常见流程是:翻相册、搜文件名、回忆日期、打开聊天记录、再去文件管理器里碰运气。
更麻烦的是,这些资料通常不适合上传云端做识别。
云相册可以告诉你"这是一张票据",云盘可以帮你 OCR,但前提是你愿意把这些敏感文件交给远端服务。对合同、证件、账单和聊天截图来说,这个心理成本很高。
所以我想做一个更克制的东西:让手机自己看懂这些资料,但资料不离开手机。
这就是 KernelVault 的起点。
1.2 KernelVault 的含义
KernelVault 这个名字里有两个词:
Kernel:本机内核、端侧处理、离线优先。Vault:保险箱、风险审计、用户自己掌控。
它不是云相册,也不是传统文件管理器,更不是一键清理工具。它要做的是把手机里的资料整理成一座本地隐私资产库,让用户知道:
text
这是什么?
里面大概有什么?
是否需要留意?
这个结论从哪里来?
我给它固定了一个核心输出:
text
{tags, summary, privacy}
也就是:标签、摘要、风险等级。
1.3 我给这个项目画的三条红线
动手之前,我先定了三条红线。
红线一:不上传。 当前 Android Manifest 不声明 INTERNET 权限,识别、索引、搜索和备份都在本机完成。隐私产品如果第一步就要联网,它的可信度会天然打折。
红线二:不默认处置原文件。 KernelVault 不默认删除、移动或改写用户原始资料。保险箱首版只是风险标记和审计工作台,不伪装成系统级隔离沙盒。
红线三:不承诺全库秒级深度 AI。 端侧大模型有真实成本。全库图片和文档如果一上来都跑视觉模型,很容易拖慢手机、推高内存,甚至被系统后台策略中断。所以 KernelVault 采用"先快后准":先快速整理进库,再对关键资料做本机 AI 精修。
基于这三条红线,技术路线逐渐清晰:
text
界面层 Kotlin + Jetpack Compose
资产读取 MediaStore / SAF
本地索引 SQLite + FTS + 本地向量索引
端侧模型 MNN 视觉模型 + MNN embedding
后台维护 WorkManager
结果表达 tags / summary / privacy
安全边界 无 INTERNET 权限 + 不默认改写原文件
2. 先看效果
白天版整体展示:

黑夜版整体展示:

功能总览版:

对用户
- 找资料更自然:不用记文件名和目录,用关键词、标签、摘要就能找。
- 隐私更可控:资料不上传,风险结果只在本机提醒。
- 结果更可解释:每个资产都有标签、摘要、风险等级和识别来源。
- 使用更安心:App 不默认删除、移动或改写原始文件。
App 首页先把产品边界讲清楚:只在本机工作,不上传。
应用场景:它到底解决什么问题
场景一:找回"去年买显卡的电子发票"
传统相册按时间排序,文件管理器按目录和文件名查找。但真实用户不一定记得文件名,也不一定记得那张发票保存在哪一天。
KernelVault 会先把授权范围内的资料纳入本地索引,再通过标签、摘要、FTS 和本地向量召回,让用户可以用更自然的关键词找资料。
典型查询可能是:
text
去年买显卡的电子发票
合同截图
身份证复印件
微信里的付款凭证
上次会议的 PDF

场景二:判断一张截图是否值得放进保险箱
很多截图文件名没有意义,但里面可能包含身份证号、订单号、手机号、地址、账号、金额或合同条款。
KernelVault 不替用户删除文件,而是把高风险和需留意资料集中到保险箱,让用户自己决定下一步怎么处理。

场景三:确认 AI 到底识别了什么
很多 AI 产品容易给出一个"看起来很聪明"的结果,但用户不知道它从哪里来。
所以详情页固定展示:
text
文件类型 / AI 标签 / 人工标签 / 摘要 / 风险等级 / 识别来源
用户能知道结论来自快速整理、本地模型识别、导入索引还是人工修正。用户也可以用人工标签、人工摘要和备注覆盖 AI 建议。

场景四:证明"只在本机"
隐私产品最怕只喊口号。KernelVault 在防线页集中展示媒体授权、后台维护、系统通知和本机处理证明,让用户知道 App 读了什么、正在做什么、哪些能力依赖本地模型。

3. 技术架构:先快后准的本机智能链路
我把 KernelVault 的架构拆成四层:
#mermaid-svg-GX2aLnWctJdq1EYL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GX2aLnWctJdq1EYL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GX2aLnWctJdq1EYL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GX2aLnWctJdq1EYL .error-icon{fill:#552222;}#mermaid-svg-GX2aLnWctJdq1EYL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GX2aLnWctJdq1EYL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GX2aLnWctJdq1EYL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GX2aLnWctJdq1EYL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GX2aLnWctJdq1EYL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GX2aLnWctJdq1EYL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GX2aLnWctJdq1EYL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GX2aLnWctJdq1EYL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GX2aLnWctJdq1EYL .marker.cross{stroke:#333333;}#mermaid-svg-GX2aLnWctJdq1EYL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GX2aLnWctJdq1EYL p{margin:0;}#mermaid-svg-GX2aLnWctJdq1EYL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GX2aLnWctJdq1EYL .cluster-label text{fill:#333;}#mermaid-svg-GX2aLnWctJdq1EYL .cluster-label span{color:#333;}#mermaid-svg-GX2aLnWctJdq1EYL .cluster-label span p{background-color:transparent;}#mermaid-svg-GX2aLnWctJdq1EYL .label text,#mermaid-svg-GX2aLnWctJdq1EYL span{fill:#333;color:#333;}#mermaid-svg-GX2aLnWctJdq1EYL .node rect,#mermaid-svg-GX2aLnWctJdq1EYL .node circle,#mermaid-svg-GX2aLnWctJdq1EYL .node ellipse,#mermaid-svg-GX2aLnWctJdq1EYL .node polygon,#mermaid-svg-GX2aLnWctJdq1EYL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GX2aLnWctJdq1EYL .rough-node .label text,#mermaid-svg-GX2aLnWctJdq1EYL .node .label text,#mermaid-svg-GX2aLnWctJdq1EYL .image-shape .label,#mermaid-svg-GX2aLnWctJdq1EYL .icon-shape .label{text-anchor:middle;}#mermaid-svg-GX2aLnWctJdq1EYL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GX2aLnWctJdq1EYL .rough-node .label,#mermaid-svg-GX2aLnWctJdq1EYL .node .label,#mermaid-svg-GX2aLnWctJdq1EYL .image-shape .label,#mermaid-svg-GX2aLnWctJdq1EYL .icon-shape .label{text-align:center;}#mermaid-svg-GX2aLnWctJdq1EYL .node.clickable{cursor:pointer;}#mermaid-svg-GX2aLnWctJdq1EYL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GX2aLnWctJdq1EYL .arrowheadPath{fill:#333333;}#mermaid-svg-GX2aLnWctJdq1EYL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GX2aLnWctJdq1EYL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GX2aLnWctJdq1EYL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GX2aLnWctJdq1EYL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GX2aLnWctJdq1EYL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GX2aLnWctJdq1EYL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GX2aLnWctJdq1EYL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GX2aLnWctJdq1EYL .cluster text{fill:#333;}#mermaid-svg-GX2aLnWctJdq1EYL .cluster span{color:#333;}#mermaid-svg-GX2aLnWctJdq1EYL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GX2aLnWctJdq1EYL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GX2aLnWctJdq1EYL rect.text{fill:none;stroke-width:0;}#mermaid-svg-GX2aLnWctJdq1EYL .icon-shape,#mermaid-svg-GX2aLnWctJdq1EYL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GX2aLnWctJdq1EYL .icon-shape p,#mermaid-svg-GX2aLnWctJdq1EYL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GX2aLnWctJdq1EYL .icon-shape .label rect,#mermaid-svg-GX2aLnWctJdq1EYL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GX2aLnWctJdq1EYL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GX2aLnWctJdq1EYL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GX2aLnWctJdq1EYL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MediaStore / SAF 授权资产
快速整理:类型、首轮标签、摘要、风险
SQLite:资产元数据与人工修正
FTS / 倒排 / 本地向量索引
资产库:浏览、筛选、搜索
保险箱:高风险与待处理
详情页:tags / summary / privacy
MNN 本机 AI 精修
WorkManager 后台维护
.kvault 加密备份
3.1 第一层:授权资产读取
KernelVault 通过 MediaStore 和 SAF 读取用户授权范围内的图片、视频、音频和文档。它不会假设自己天然拥有全部文件权限,也不会绕开系统授权。
3.2 第二层:快速整理
首轮整理优先速度和稳定性。它会先生成基础类型、首轮中文标签、摘要和风险等级,让用户尽快看到资产库结果。
这一步不追求"每个文件都跑完真实视觉大模型",因为那会把全库整理变成高风险重任务。
3.3 第三层:本地索引与搜索
本地数据库保存资产元数据、标签、摘要、风险等级、人工修正和识别来源。
搜索层由几条链路共同组成:
- SQLite 保存结构化资产信息。
- FTS 支持关键词搜索。
- 本地向量索引用于语义召回。
- 人工标签和备注进入搜索文本,保证用户自己的整理结果优先可用。
3.4 第四层:本机 AI 精修
当用户打开某个资产详情页,可以对单个图片或文档触发 本机 AI 精修。
这个设计是整个项目最重要的取舍:大模型不是全库扫描的阻塞点,而是单个高价值资产的增强工具。
4. 模型选型:为什么用 MNN
端侧模型能力分成两类:
| 能力 | 模型方向 | 作用 |
|---|---|---|
| 视觉理解 | Qwen-VL 系列 MNN 模型 | 对图片和截图生成中文语义标签、简短摘要和隐私线索 |
| 文本向量 | bge-large-zh-MNN 等中文 embedding 模型 |
支持本地语义搜索和相似召回 |
| 快速兜底 | 启发式规则 + 文件元数据 + 文本抽取 | 模型不可用时仍能整理、搜索和展示可读摘要 |
选择 MNN 的原因很直接:
- 面向移动端推理,适合 Android 端侧部署。
- 可以通过 Native / JNI 调用,不需要把识别链路交给云服务。
- 同一套端侧思路可以承接视觉模型和 embedding 模型。
- 模型不可用时也能清晰降级,不影响快速整理和搜索。
5. 产品创新点
5.1 创新点一:把"隐私资产"作为手机资料的新组织方式
传统文件管理器关心目录,云相册关心照片,KernelVault 关心的是"这份资料是否有价值、是否敏感、是否需要被找回"。这个角度更贴近日常手机资料管理。
5.2 创新点二:本机 AI 不是噱头,而是产品边界
KernelVault 不把"本地 AI"写成宣传词,而是把它落实到权限、模型路径、识别来源、状态文案和失败降级上。模型可用时,用户可以在详情页看到本机 AI 精修结果;模型不可用时,App 也不会伪装成已经深度识别。
5.3 创新点三:标签、摘要和风险分开表达
很多整理工具会把所有信息塞进标签里,结果用户只看到一排含混的词。KernelVault 固定输出 {tags, summary, privacy},让信息层次更清楚:
tags解决"如何筛选和搜索"。summary解决"这个文件大概是什么"。privacy解决"是否需要留意"。
5.4 创新点四:保险箱不是删除器
隐私管理不等于替用户做危险操作。KernelVault 首版只维护本地索引、风险标记、人工修正和审计状态,不默认删除、移动或改写原文件。这个设计牺牲了一点"强控制感",但换来更低的误伤风险。
5.5 创新点五:演示链路和真实能力保持一致
比赛或文章展示中,KernelVault 不承诺"全库秒级视觉识别"。更可信的展示链路是:
text
检查识别 -> 整理手机资料 -> 资产库 -> 详情页本机 AI 精修 -> 保险箱 -> 防线
这条链路既能展示端侧 AI,也符合普通手机的性能边界。
6. 技术难点与解决方案
这个项目最难的地方,不是把 UI 做出来,而是把"端侧 AI 能跑、能解释、还能不拖垮手机"同时做到。
难点一:全库视觉识别太慢,容易拖死前台。
- 解决:改成"先快速整理进库,再对单个高价值资产做本机 AI 精修",把大模型开销限制在局部。
难点二:真机端侧模型容易受内存和系统后台策略影响。
- 解决:重型 MNN 视觉推理放进独立
:mnn进程,超时可结束子进程,主进程继续保持 UI 和索引可用。
难点三:AI 结果如果只剩工程词,用户看不懂也不信。
- 解决:统一输出
tags / summary / privacy,并保留人工标签、人工摘要和风险等级的覆盖权。
难点四:隐私产品一旦默认上传或默认处置,就会失去可信度。
- 解决:不声明
INTERNET权限,不默认删除、移动或改写原文件,把保险箱定义成审计台而不是清理器。
重头戏:端侧适配踩过的坑
坑一:全库视觉识别会把前台整理拖慢
一开始很容易有个冲动:既然要做 AI 整理,那每张图片、每个文档都跑一遍视觉模型。
真机上这条路很快会暴露问题:耗时长、内存压力大、系统可能清理进程,用户看到的是进度卡住,而不是"AI 很聪明"。
最终方案是:
text
整理手机资料:快速整理优先
详情页:单资产本机 AI 精修
后台维护:系统允许时分批补全
坑二:native 推理不能卡死主进程
端侧视觉模型一旦进入 native 层长时间不返回,Kotlin 侧取消 Future 只能放弃等待,不能真正中断 native 推理。
所以 KernelVault 把重型 MNN 视觉调用隔离到独立 :mnn 进程。主进程通过远程服务发起推理请求,并记录子进程 pid。超时后可以解绑、停止服务并结束子进程。
这样即便模型仍卡住,也不会让主进程 UI 和数据库被几 GB native heap 拖死。
坑三:AI 输出容易泄露工程词
早期整理结果里很容易出现 quick_index、native_fallback、image、document 这类工程词。它们对开发者有意义,但对用户没有意义。
现在展示层会把字段拆清楚:
text
文件类型:图片 / 文档 / 音频 / 视频
AI 标签:发票 / 合同 / 证件 / 聊天截图
识别来源:快速整理结果 / 本地模型识别结果 / 人工修正结果
也就是说,工程词可以留在内部索引里,但不能直接出现在用户界面上。
坑四:隐私工具不能替用户做危险决定
很多清理类 App 喜欢"自动删除""自动归档""自动挪走"。但 KernelVault 的首版边界是反过来的:只做本地索引、风险标记、人工修正和审计状态。
保险箱不是删除器。它提醒用户"这份资料可能敏感",但不会默认改写原文件。
总结与思考
做完这个阶段后,我最大的体会是:端侧 AI 不是把模型塞进手机就结束了。真正困难的是产品边界和工程边界。
你要知道哪些事情应该交给模型,哪些事情必须用确定性规则;哪些任务可以后台慢慢补,哪些结果必须立刻给用户;哪些字段是内部调试信息,哪些内容可以直接展示给普通用户。
KernelVault 的答案是:**让 AI 帮用户看懂资料,但不要替用户失去控制权。**它不上传、不默认删除、不默认移动,只在本机建立索引、解释内容、提示风险。
结语:当 AI 从云端走向端侧,它真正有价值的地方不只是省掉网络请求,而是把数据控制权还给用户。KernelVault 希望证明:一个隐私工具也可以聪明,但它首先要可信。
参考资源
- MNN 官方仓库:https://github.com/alibaba/MNN
- MNN LLM 文档:https://mnn-docs.readthedocs.io/en/latest/transformers/llm.html
- Android WorkManager 文档:https://developer.android.com/topic/libraries/architecture/workmanager
- Android MediaStore 文档:https://developer.android.com/training/data-storage/shared/media