恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Gander如何做到0权限读取你的文件?Android存储访问框架(SAF)深度解析

  • 首页
  • 资讯中心
  • /
  • Gander如何做到0权限读取你的文件?Android存储访问框架(SAF)深度解析

相关资讯

技术碾压:从网文创作到币圈实战的降维打击逻辑 2026/10/15 19:16:38
Canvas粒子动画实现动态星空科技感登录页:完整代码与调优 2026/10/15 19:16:38
SAP银企直连从架构到排障:付款报文、对账与状态机设计详解 2026/10/15 19:16:38

最新资讯

AI论文写作效率提升指南:9款工具组合测评与避坑实践
VuePress部署到云服务器ECS完整实操:从Markdown到公网访问
大学生自我认知进化:双清单对比法实践指南
Leaflet-Velocity实战:Web气象大屏的动态风场粒子可视化
天锐DLP是如何实现数据防泄漏?
Claude Code 使用指南:从 Node.js 环境到终端与 IDE 的完整配置

今日推荐

AI视频生成的时间一致性难题与时空建模演进
基于bbox的PDF文档解析:多栏重排与水印过滤实战
探矿数据进RAG前的清洗全攻略:TXT、Word、PDF、网页四类文档处理实践

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Gander如何做到0权限读取你的文件?Android存储访问框架(SAF)深度解析

发布时间:2026/10/15 19:16:38
Gander如何做到0权限读取你的文件?Android存储访问框架(SAF)深度解析 【免费下载链接】ganderTake a gander at any file. Offline, zero-permission Android viewer for PDF, Word, Excel, PowerPoint, ODT, RTF, ZIP, STL, photos, video, audio, Markdown and code.项目地址https://gitcode.com/gh_mirrors/gander1/gander点击查看免费下载如果你装过任何文档 App大概都被问过同一个问题允许访问手机上的所有文件而 Gander 是一款主打零权限、离线的 Android 文件查看器——它的权限列表是空的却能打开你选中的 PDF、Word、Excel、图片、视频、音频、Markdown、代码和 zip 压缩包。这听起来像魔法其实答案只有一个Android 存储访问框架Storage Access FrameworkSAF。这篇文章带你拆解 Gander 的完整链路文件如何进入 App、授权如何生效、又为何无法被滥用。先看结果权限列表为什么是空的Gander 的AndroidManifest.xml里没有任何uses-permission声明——连INTERNET都没有。它在系统应用信息页的 Permissions 一栏显示的永远是No permissions requested更狠的是自我验证Gander 用三层保险保证这条承诺不被破坏——构建期拦截app/build.gradle.kts里的checkPermissions任务会扫描合并后的 manifest只要出现任何权限声明就让构建失败沙箱验证FormatRegistryTest.kt 在 Robolectric 沙箱里询问 PackageManager真机验证ZeroPermissionTest.kt 在真实设备上读取已安装包的权限列表断言为空。所以零权限不是宣传语而是被测试盯死的不变量。那问题来了一个连存储权限都没有的 App凭什么读你的文件核心原理权限换授权——文件是系统递过来的传统模型里App 拿到READ_EXTERNAL_STORAGE后自己去磁盘上找文件SAF 把方向倒了过来App 不找文件文件来找 App。Android 提供了系统级文件选择器picker和打开方式面板。当用户亲手点选某个文件时系统会临时颁发一张一次性读取令牌URI grantApp 拿到的不是路径而是一个content://URI且只能读这一个文件什么都多拿不到。用一句话概括这个安全模型传统权限 给你一把万能钥匙你自己决定开哪扇门SAF 授权 你每递一件文件系统才开一扇对应的门。Gander 恰好有两条收文件的通道全部走这套机制 通道一文件选择器OpenDocument / OpenDocumentTree在 MainActivity.kt 里打开文件和添加文件夹分别注册了两个 SAF 契约ActivityResultContracts.OpenDocument()——弹出系统文件选择器用户选中后回传一个 URI。Gander 拿到就直接送进阅读器ActivityResultContracts.OpenDocumentTree()——授权一个文件夹。此时 Gander 调用takePersistableUriPermission()把这次授权存下来之后可以随时浏览该文件夹且完全不需要任何存储权限。文件夹列表则是通过向系统 DocumentsProvider 发起DocumentsContract子查询读出来的MainActivity.kt 中专门用单线程 executor 执行避免大文件夹卡死主线程触发 ANR。通道二打开方式与分享面板在 AndroidManifest.xml 中ViewerActivity声明了两组 intent-filterandroid.intent.action.VIEW——在文件管理器里点任何受支持格式的文件用其他应用打开列表里就有 Ganderandroid.intent.action.SEND——从微信、邮件、浏览器分享文件时的分享面板里也有它。两组过滤器都只接受contentscheme——注释里写得很清楚其他 App 传来的file://路径会被拒绝因为那相当于让系统以 Gander 的身份读文件而 Gander 根本没有能读的路径只会读到它自己的私有目录。ViewerActivity.kt 在入口处还做了一道来源甄别区分Gander 自己打开的和外部应用递来的外部来源的 URI 还要通过mayOpenFromOutside()的 MIME 白名单检查不合格直接finish()关门。授权的生命周期Gander 把令牌管得很严一次性授权天然会过期Gander 对每种来源做了不同处理文件来源授权类型Gander 的做法系统文件选择器可持久化takePersistableUriPermission()保留进入最近文件列表文件夹授权可持久化同上作为常驻文件夹行显示打开方式/分享一次性只够这次打开App 卡片随文件关闭而消失重启后必然失效最近文件列表Recents.kt每次展示前都会用persistedUriPermissions对账授权还在才显示条目被删或被挤出 25 条上限时还会主动调用releasePersistableUriPermission()把授权还给系统——连顺手留一张令牌这种事都不做。这也是为什么AndroidManifest.xml里ViewerActivity设了persistableModepersistNever、Auto Backup 被设为false备份一份授权列表毫无意义授权是逐次安装授予的恢复回来也是空的却会给零权限这条核心承诺打上星号。进阶细节zip 里的文件如何被原地读出最妙的部分在 zip 支持。你让 Gander 打开一个.zip它并不解压到磁盘——ArchiveProvider.kt 是一个exportedfalse的 ContentProvider给压缩包内的每个文件发一个专属 URI阅读器像读普通文件一样读它未压缩store条目直接交给指向压缩包中一段字节的窗口文件从未落地压缩deflate条目后台线程边解压边通过ParcelFileDescriptor管道流式送给阅读器不落盘带密码条目密码只保留在进程内永远不出现在 URI 里。这里还藏着一个精巧的安全细节只有 Gander 自己Binder.getCallingUid() Process.myUid()能拿到窗口这种可越界读的句柄如果外部 App 通过分享拿到了某个 zip 内文件的 URI它只会得到一条只含这一个文件的管道压缩包里的其他文件一概读不到。权限最小化精确到单个文件。没有网络权限还意味着什么零权限常被理解为零存储权限Gander 的野心更大——它连INTERNET都没有物理上无法联网回传所有 Office 格式在沙箱 WebView里渲染请求全部被 ViewerActivity.kt 拦截只应答 App 内置资源app/src/main/assets/viewer/和那个content://文档流网络协议栈从头到尾没被碰过ViewerPolicy.kt 给每个页面叠加一层 Content Security Policy连文档里夹带的脚本都跑不起来系统 WebView 组件自带的指标上报通过android.webkit.WebView.MetricsOptOut元数据显式关闭见 AndroidManifest.xml 注释。如何验证 Gander 的零权限承诺想亲手确认三步走 ✅看系统设置设置 → 应用 → Gander → 权限应显示No permissions requested见上文截图看 App 内 About 页Gander 会当场询问系统本应用请求了哪些权限并把答案展示给你旁边附全部内置库的许可证全文app/src/main/assets/licences.md读源码ZeroPermissionTest.kt 和app/build.gradle.kts的checkPermissions任务就是这套承诺的可执行证明。小结SAF 是够用就好的范本Gander 的案例说明权限是面向应用的粗粒度授权SAF 授权是面向单个文件的细粒度授权。当你的功能只需要用户递给我的那一个文件时后者才是正确的工具——App 拿不到它没有要的东西安全模型从信任 App变成信任用户的每一次点选。这套思路不限于文档查看器任何读一下、看一眼、不带走的场景都值得先问一句——我真的需要那把万能钥匙吗更多背景可以阅读 README.md 中的 How the zero-permission trick works 章节以及设备测试用例 ArchiveDeviceTest.kt 中 zip 原地读取的真机验证。赞分享【免费下载链接】ganderTake a gander at any file. Offline, zero-permission Android viewer for PDF, Word, Excel, PowerPoint, ODT, RTF, ZIP, STL, photos, video, audio, Markdown and code.项目地址https://gitcode.com/gh_mirrors/gander1/gander点击查看免费下载相关推荐android-sunflower中的Compose与存储访问框架SAF使用android sunflower中的Compose与存储访问框架SAF使用 你是否在开发Android应用时遇到文件访问权限的困扰尤其是在Android移动开发示例工程Retro Music Player权限与存储访问框架(SAF)配置终极指南Retro Music Player权限与存储访问框架 SAF 配置终极指南 在Android系统中Retro Music Player使用存储访问框架 SA音视频移动开发10 分钟跑通抖音批量下载去水印、主页备份与直播录制一套配置10 分钟跑通抖音批量下载去水印、主页备份与直播录制一套配置 douyin downloader 是一个命令行抖音批量下载工具贴链接即可把无水印视频、图文、网页爬虫CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号