
web-to-app 文件管理器APK/AAB 构建产物与用户文件的统一管理web-to-app 的文件管理器是所有构建产物APK、AAB、克隆包、更新包与用户项目文件的统一入口提供浏览、搜索、分享、安装、删除和批量清理能力。读完本文你将了解它的六个分区如何对应真实的文件系统目录、每个操作背后的 Intent 与 FileProvider 机制以及构建日志查看器的截断策略从而能在手机上安全地管理构建产物并释放存储。入口与导航文件管理器从主屏幕右上角的⋮ → 文件管理打开见 主屏幕更多菜单文档。在导航层中主菜单的更多选项面板触发onOpenFileManager由导航控制器跳转到Routes.FILE_MANAGER最终渲染 FileManagerScreen.kt 中的FileManagerScreen组件见 AppNavigation.kt。六个分区功能到真实目录的映射原文档说APK 构建、AAB 导出、应用克隆、构建日志以及用户文件目录都在这里源码中这对应FileSection枚举定义的六个分区每个分区绑定一个真实目录名分区枚举值目录名存储位置可用操作已构建 APKAPKbuilt_apks外部文件目录安装、分享、删除AAB 导出AABbuilt_aabs外部文件目录打开、分享、删除应用克隆CLONEDcloned_apks外部文件目录安装、分享、删除更新包UPDATE_APKSupdate_apks外部文件目录安装、分享、删除构建日志LOGSbuild_logs外部文件目录查看、分享、删除用户文件USER_PROJECTS10 个项目子目录应用内部私有目录仅删除不可分享映射关系与操作能力由 FileManagerScreen.kt#L91-L104 中的枚举属性精确控制canInstall仅对 APK/克隆/更新三个分区开放canOpen仅对 AAB 与日志开放canShare对用户文件分区关闭——用户项目文件不出应用边界。扫描逻辑在scanAllSections中除用户文件外的分区都以context.getExternalFilesDir(null)为基目录按分区目录名列出文件外部目录不可用时该分区显示为空而不是回退到私有目录见 scanAllSections。这与构建端的约定一致ApkBuilder.kt#L48-L52 中 APK 输出目录首选外部built_apks不可用时才回退到filesDir/built_apks因此个别设备上刚构建的 APK 可能不出现在文件管理器中——这是理解构建产物落在这里这条说明时的一个重要适用前提。用户文件分区比较特殊它不扫描单个目录而是遍历硬编码的 10 个项目子目录见 USER_PROJECT_DIRS每个子项目以父目录/项目名的形式展示大小为整棵目录树的递归求和dirSize用栈实现非递归遍历html_projects // HTML 项目 frontend_builds // 前端构建 nodejs_projects // Node.js 项目 php_projects // PHP 项目 python_projects // Python 项目 go_projects // Go 项目 wordpress_projects // WordPress 项目 docs_projects // 文档站点项目 scraped_sites // 抓取站点 sample_projects // 示例项目浏览、搜索与排序界面顶部是一张汇总卡片显示当前范围的文件总数量与总占用未过滤时为全部分区合计过滤时仅统计可见项。其下是搜索框与分区筛选条搜索对文件名做大小写不敏感的前缀无关包含匹配entry.name.contains(q, ignoreCase true)没有命中的分区会被隐藏只显示仍有结果或有匹配的分区分区筛选横向滚动的 Chip 列表全部加六个分区各带文件计数选中某分区时自动展开其卡片排序三种模式——最新按修改时间倒序、最大按大小倒序、名称不区分大小写字母序对应FileSortMode枚举与entryComparator默认最新见 排序实现。每个分区是一张可折叠卡片卡片头显示文件数与合计大小文件行展示名称、大小与修改时间yyyy-MM-dd HH:mm并提供安装/打开/查看/分享/删除图标按钮。文件操作安装、打开、查看、分享、删除原文档列出的查看、打开、复制、分享、安装(APK)和删除在源码中各有独立实现路径安装 APK。安装按钮仅出现在可安装分区。点击后调用 ApkBuilder.installApkAndroid 7.0 通过 FileProvider 生成 content URI低版本回退为Uri.fromFile随后发出ACTION_VIEWIntentMIME 类型为application/vnd.android.package-archive并附加FLAG_GRANT_READ_URI_PERMISSION启动系统包安装器。启动成功返回true界面提示安装已启动抛异常则记录日志并返回false界面通过 Snackbar 报告失败——这正是原文档安装会启动系统包安装器失败会被报告的实现。分享与打开。分享走ACTION_SEND多文件分享走ACTION_SEND_MULTIPLE打开走ACTION_VIEW二者均通过 FileProvider 授权authority 固定为应用包名 .fileprovider与 AndroidManifest.xml 中声明的${applicationId}.fileprovider一致。MIME 类型由guessMimeType推断.apk映射到 Android 包归档类型、.aab与未知扩展名回退application/octet-stream、.log/.txt为纯文本其余交给系统MimeTypeMap见 分享与打开实现。复制构建日志场景日志查看器内提供复制按钮将预览文本写入系统剪贴板。删除单文件删除弹确认对话框用户文件分区里的条目是目录删除时调用deleteRecursively整树移除文件则直接delete()见 删除确认逻辑。多选与批量清理长按任意文件行进入选择模式顶栏标题切换为已选数量并提供全选/取消全选与关闭按钮底部操作栏出现分享仅当选区含可分享文件时与删除两个批量按钮。重扫文件列表时已选集合会与现存文件取交集防止持有已失效的条目。分区级的清空Clear挂在每个非空分区卡片头部触发确认对话框后经clearSection执行外部分区逐文件删除用户文件分区则遍历全部 10 个项目子目录逐个递归删除见 clearSection。由于用户项目分区对应的是真实项目数据清空它等同于删除该分区下所有项目操作前务必确认。构建日志查看器日志条目点击后弹出只读查看器在 IO 线程逐行读取累计长度超过MAX_LOG_CHARS 200_000字符即停止读取并标记已截断见 readLogPreview对应原文档大日志会截断显示。查看器以等宽字体展示内容最大高度 360dp 内可滚动并提供复制预览文本、分享完整日志文件、关闭三个动作。截断只影响屏幕预览完整日志文件仍可通过分享导出这是排查长构建日志时的实用组合。与构建管线的关系文件管理器本质上是构建流水线的产物汇聚点构建 APK 的产物落入built_apksAAB 导出 的产物落入built_aabs目录常量见 AabExportCoordinator.kt应用克隆功能的输出目录为cloned_apks见 AppCloner.kt应用自更新下载的安装包存放在update_apks见 ApkUpdateInstaller.kt。以上各功能模块只负责把文件写入约定目录浏览、分发、安装与回收统一交给文件管理器避免产物散落在多个功能页面里难以清理。使用说明与限制安装依赖系统包安装器需要设备允许安装未知应用失败会通过 Snackbar 报告而不是静默丢弃用户文件分区只展示项目目录的一级子目录深度嵌套的文件需借助系统文件管理器访问搜索仅在已扫描的条目中过滤不做全文检索外部文件目录不可用的设备上构建产物分区可能为空产物实际位于应用私有目录需通过分享或构建页面自行导出。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考