资讯动态

免ROOT截屏实现原理:深入屏译的MediaProjection、Shizuku与无障碍三条通路

发布时间:2026/10/16 22:54:17 来源:尧图企业网站定制
【免费下载链接】overlay-translator无需 ROOT 的开源 Android 屏幕实时翻译工具适合游戏、视觉小说和漫画。支持端侧与云端 OCR、离线 LLM、多种翻译服务和文字朗读TTS译文可直接显示在画面上。Open-source no-root Android real-time screen translator for games, visual novels, and manga. Supports on-device and cloud OCR, offline LLMs, multiple translation services, on-screen translations, and text-to-speech (TTS).项目地址https://gitcode.com/gh_mirrors/ov/overlay-translator点击查看免费下载屏译overlay-translator是一款免ROOT的 Android 屏幕实时翻译工具面向游戏、视觉小说和漫画把截屏 → 识字 → 翻译 → 叠加显示整条链路装进一台手机。而截屏是这条链路的地基没有 ROOTAndroid 却有三条官方或半官方的截屏通路——无障碍AccessibilitytakeScreenshot、系统级MediaProjection、以及借助 Shizuku 的 shell 权限。本文将用通俗的语言拆解屏译是如何在这三条通路上选择、降级与优化的。为什么截屏是免ROOT应用最难的一环Android 对读取屏幕像素这件事管得很严普通应用没有权限直接拿到别的 App 画面screencap命令属于 shell 身份普通应用不能调用任何截屏能力通常都伴随用户授权或系统服务绑定。屏译的解法不是绕开限制而是把三条合法通路都接上按设备环境自动挑最快的一条。所有截屏实现都收敛在 app/src/main/java/com/gameocr/app/capture/ 目录下由一个统一的抽象接口 Screenshotter.kt 描述核心契约只有三件事interface Screenshotter { val isReady: Boolean suspend fun capture(): Bitmap? // 抓一帧返回 null 表示跳过 fun release() }有了这层抽象上层服务 CaptureService.kt 完全不关心像素到底从哪来只关心这一帧能不能拿到。通路一无障碍 takeScreenshot——最快的系统级截图Android 11API 30起AccessibilityService新增了takeScreenshot()接口是三条通路中唯一零弹窗的方案无需用户每次授权一次开启无障碍权限之后截屏静默进行硬件缓冲直接交付系统回传HardwareBuffer屏译用Bitmap.wrapHardwareBuffer()包一层再拷贝为ARGB_8888转换成本很低有系统节流AOSP 会拒绝间隔小于约 333ms 的请求屏译因此内置了 AccessibilityScreenshotPacing 节拍器两次请求之间至少间隔 350ms。实现见 AccessibilityScreenshotter.kt配套的服务声明在 a11y_config.xml。这条通路还顺带承担了其他能力监听焦点输入框输入翻译、音量双键触发等截图只是其中一个副产品。代价是门槛需要用户愿意开启无障碍权限且仅 API 30 可用。通路二MediaProjection——兼容性最好的标准方案MediaProjection是 Android 官方提供的录屏/投屏框架也是屏译的兜底通路授权通过系统对话框MediaProjectionManager.createScreenCaptureIntent()请求授权用户点开始后拿到一次性令牌resultCode Intent data。请求活动见 CaptureStartRequestActivity.kt建虚拟显示用令牌创建MediaProjection再createVirtualDisplay()挂一块虚拟屏幕把真实屏幕镜像过来收帧虚拟屏幕的输出面交给ImageReader每来一帧回调一次取最新帧转成Bitmap。完整实现见 MediaProjectionScreenshotter.kt几个工程细节值得一提只取最新帧循环翻译时不需要每帧都收LatestFrameAwaiter.kt 会把积压帧丢弃、只留最新一帧避免队列越拖越长处理行内边距Image的rowStride常比pixelStride × 宽度多出填充字节代码会按头部信息裁掉 padding保证 Bitmap 尺寸正确分辨率变化自适应注册onCapturedContentResize回调旋转屏幕后重建ImageReader并resize虚拟显示失败自动回滚旧 Surface。MediaProjection 的短板在授权体验每次部分系统每次开机后都会弹系统授权窗Android 14 之后还会弹出正在录制的常驻提示这正是屏译把它放在优先级最低的原因。通路三Shizuku——免弹窗的高性能旁路Shizuku 是一个把 shell系统 UID权限安全地租借给应用的开源项目。有了 shell 身份屏译就可以直接执行screencap从而绕开 MediaProjection 的授权弹窗。实现在 ShizukuScreenshotter.kt内部按可用性分层回退优先级方式说明1无障碍takeScreenshotShizuku 路径也会先复用无障碍快通道2原生screencapraw 帧直接读未压缩像素最快解码逻辑在 ShizukuRawScreencapDecoder.kt3screencap -pPNG兼容 raw 头未知的设备原生 raw 帧的解码是纯手工活先读 16 字节头部从头部推算整帧字节数再精确读取、丢弃流里多余的数据。这样做避免了ByteArrayOutputStream反复扩容拷贝单次截屏可稳定在百毫秒级。代价同样写在源码注释里raw shell 通路每次截屏约 150–300ms帧率上限约 5 FPS适合按需触发而非高帧率轮询且反射调用的Shizuku.newProcess属于 hidden API未来 Shizuku 大版本变动可能失效——所以 Shizuku 只是加速项不是必需品。Shizuku 的安装与就绪状态检测在 shizuku/ 目录ShizukuCapabilities.kt 会把未安装 / 未运行 / 未授权 / 未配对等状态归一成统一的可用度枚举。三条通路如何自动选择选路逻辑集中在 CaptureStartCoordinator.kt 与 SystemCapturePolicy.kt规则可以总结成一句话用户在会话中手动选了 Shizuku 就选 Shizuku否则 API 30 且无障碍截图能力就绪 → 无障碍再否则 → MediaProjection。internal fun systemCaptureBackend(sdk: Int, connected: Boolean, capable: Boolean): CaptureBackend if (sdk 30 connected capable) CaptureBackend.ACCESSIBILITY else CaptureBackend.MEDIA_PROJECTION服务启动后CaptureService 按后端实例化对应的Screenshotter若走 Shizuku 路径还会先做一次试截图dry-run失败就弹提示并停止服务避免用户对着一个装不出的悬浮球干等。三条通路的横向对比通路每次授权弹窗最低版本单次延迟依赖无障碍 takeScreenshot否一次开启API 30低硬件缓冲无障碍权限MediaProjection是系统对话框API 21中无Shizuku screencap否视 Shizuku 后端raw 约 150–300msShizuku 应用截到帧之后屏译如何把实时做省电拿到像素只是开始。循环翻译模式下屏译用两级策略避免每 0.5 秒 OCR 翻译一次的浪费帧差去重FrameDeduper.kt 把帧缩成 9×8 灰度图算出 64bit 的 dHash 指纹与上一帧做汉明距离比较距离 ≤ 6 就判定画面没变直接跳过 OCR 和翻译停稳轮询LoopRuntimePolicy.kt 决定轮询间隔取用户设定间隔与后端最小间隔Shizuku 路径为 350ms的较大值画面稳定后才真正出手翻译。总结一张图看懂屏译的截屏架构用户点开始截屏 │ CaptureStartCoordinator.prepare() ── 会话偏好Shizuku / 系统 │ ├── 系统偏好 API30 无障碍就绪 ──► AccessibilityScreenshotter最快 ├── 偏好 Shizuku 且 Shizuku 就绪 ───► ShizukuScreenshotter │ 无障碍快通道 → raw screencap → PNG └── 其余情况 ─────────────────────► MediaProjectionScreenshotter兜底 │ Screenshotter.capture() 每帧 │ LatestFrameAwaiter 取最新帧 → FrameDeduper dHash 去重 → OCR / 翻译 / 悬浮窗渲染三条通路共用同一个Screenshotter接口、同一套去重与渲染管线用户在主页或快捷磁贴里无感切换——这就是免ROOT 也能实时截屏翻译背后的完整答案不追求一条完美的路而是把系统给的三条路都铺平按设备条件选最快的那条走。想了解具体代码实现建议从 Screenshotter.kt、CaptureService.kt 和 SystemCapturePolicy.kt 三个文件读起相关策略的单测如 SystemCapturePolicyTest.kt也演示了每条选路分支的预期行为。赞分享【免费下载链接】overlay-translator无需 ROOT 的开源 Android 屏幕实时翻译工具适合游戏、视觉小说和漫画。支持端侧与云端 OCR、离线 LLM、多种翻译服务和文字朗读TTS译文可直接显示在画面上。Open-source no-root Android real-time screen translator for games, visual novels, and manga. Supports on-device and cloud OCR, offline LLMs, multiple translation services, on-screen translations, and text-to-speech (TTS).项目地址https://gitcode.com/gh_mirrors/ov/overlay-translator点击查看免费下载相关推荐ScreenTranslator终极截屏翻译解决方案跨语言阅读无障碍还在为外语内容阅读障碍而烦恼吗ScreenTranslator这款开源工具将彻底改变你的跨语言阅读体验。作为一款集截屏、OCR识别和在线翻译于一体的强大软件桌面应用OCRvFlow权限配置一步到位无障碍、Shizuku与Root全解vFlow权限配置一步到位无障碍、Shizuku与Root全解 刚入手 Android 自动化工具 vFlow却不知如何完成 vFlow 权限配置这篇指南终极指南深入理解LMAX Disruptor内存屏障原理与无锁算法实现终极指南深入理解LMAX Disruptor内存屏障原理与无锁算法实现 LMAX Disruptor是一个高性能的线程间消息传递库它通过创新的内存屏障和无锁并发编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑