移动开发原生移动GUI 自动化【免费下载链接】SKIP自动跳过APP开屏广告项目地址https://gitcode.com/gh_mirrors/ski/SKIP点击查看免费下载导读布局检查Layout Inspect是 SKIP 提供的一项探查能力用于抓取屏幕上应用的节点布局信息节点树、坐标、控件 ID、文本等。本文以官方使用文档为主体结合仓库源码完整讲解从「开启无障碍服务 → 开启布局检查开关 → 按音量- 触发采集 → 记录管理 → Web 端导入分析 → 生成自定义配置」的完整闭环帮助你为自定义配置功能准备准确的节点数据。功能定位布局检查用来做什么在深入操作之前先明确这项功能的价值。官方功能文档 docs/advance/layout-inspect/intro.md 明确指出布局检查功能可以用于探查屏幕的节点布局信息掌握屏幕的节点信息有助于编写自定义配置文件。SKIP 的跳过逻辑基于无障碍节点匹配文本 / 控件 ID / 屏幕坐标三类规则而每个 App 的页面结构各不相同只有拿到目标页面真实的节点树才能写出精准的配置。布局检查正是这条数据链路的起点它把屏幕快照与节点树一并采集下来供你离线分析甚至在 Web 工具中一键生成 YAML 配置片段。使用前置条件两类权限缺一不可官方文档开头用提示块强调「布局检查功能需要通知权限。」结合源码看这个前置条件背后有两条硬性依赖通知权限布局检查依赖一个前台服务InspectService来执行屏幕采集MediaProjection 截屏。在 InspectService.kt 中服务启动时会创建名为INSPECT_SERVICE、标题为「布局检查服务」的通知渠道并通过startForeground(1, notification)常驻通知栏。而在 InspectActivity.kt 中开启布局检查开关时App 会先调用NotificationManagerCompat.areNotificationsEnabled()检测通知权限未开启时弹出「通知权限请求」对话框要求先允许通知。SKIP 无障碍服务节点树采集与音量键拦截都依赖无障碍服务详见下文。首先开启「SKIP 无障碍服务」布局检查的第一步是确保 SKIP 的无障碍服务处于开启状态。这一步的强制校验写在 StartInspectRepository.kt 中当尝试开启布局检查而无障碍服务未运行时会直接拦截并提示toast_start_accessibility_first「请先开启无障碍服务」。开启方式进入系统「设置 → 无障碍 → 已安装的服务」找到 SKIP 并开启「无障碍」服务。服务声明见 accessibility.xml其中启用了flagReportViewIds上报控件 ID这是skipIds匹配的数据来源、flagIncludeNotImportantViews包含非重要视图保证节点树尽量完整以及canRetrieveWindowContent读取窗口内容节点采集的基础能力。然后开启「是否启用布局检查」的开关开启无障碍服务后进入 SKIP 的「布局检查」页面将「是否启用布局检查」开关打开。对应源码是 StartInspectButton.kt 与 InspectActivity.kt 中的开关监听逻辑其内部流程为若检测到通知权限未开启先弹出通知权限请求对话框通知权限就绪后调用MediaProjectionManager.createScreenCaptureIntent()请求屏幕录制/截屏授权系统会弹出确认弹窗勾选「不再询问」可避免重复授权授权通过后启动前台服务InspectService其通过VirtualDisplayImageReader建立屏幕镜像等待采集指令时抓取一帧画面并保存为 JPEG关闭开关或服务被系统回收时停止并销毁InspectService。InspectService启动后会在通知栏常驻「布局检查服务运行中」的通知strings.xml这也是本文开头强调通知权限的根本原因。通过按下「音量-」执行一次布局检查开关开启后每按下一次「音量-」按键即可执行一次布局检查。这条链路在 MyAccessibilityService.kt 的onKeyEvent中实现仅当InspectService正在运行时拦截KEYCODE_VOLUME_DOWN的按下事件命中后调用accessibilityInspectRepository.startAccessibilityInspect()并消费该事件返回true避免音量继续生效。补充除了音量键官方还提供了悬浮窗触发方式。开启布局检查页面中的「是否启用悬浮窗」后点击悬浮窗图标同样可触发一次检查FloatingWindowService.kt 中带有 1000ms 防抖若检查服务未运行会提示「请先开启布局检查服务」。开关副标题「启用后点按『悬浮窗/音量-』执行布局检查」对此也有说明。触发后发生了什么一次检查的完整数据链路一次检查并非只拍一张截图而是「截图 节点树 打包」三件事核心实现在 AccessibilityInspectRepository.kt 的startAccessibilityInspect()生成UUID作为本次记录的fileId并置起截图与节点采集两个标志位节点采集无障碍服务收到下一个窗口事件时执行startCaptureNode()MyAccessibilityService.kt以 BFS 广度优先方式遍历当前窗口的AccessibilityNodeInfo树为每个节点记录深度、父子关系、屏幕边界、可点击性、类名、文本与控件 ID屏幕截图InspectService通过ImageReader抓取一帧屏幕压缩为 JPEG 保存打包成记录后台协程以 1 秒为间隔最多重试 5 次等待同名的.json与.jpeg文件齐备后调用ZipUtils.zipFiles()将两者打包为{fileId}.zip并弹出「保存成功」提示超时未齐备则提示「保存失败」。所有文件统一存放在 App 私有目录filesDir/capture下。节点 JSON 的结构对应 NodeRootSchema.kt 与 NodeChildSchema.kt顶层fileId、appName、packageName、activityName、screenWidth、screenHeight、createTime、deviceName、nodes每个节点nodeId、parentId、depth、childCount、left/top/right/bottom屏幕坐标、isClickable、className、text、viewIdResourceName。这份结构同时定义了 Web 端 docs/inspect/types.ts 中AccessibilityWindow/AccessibilityNode的类型两端数据格式完全对齐。最后在「布局检查记录」页面查看、删除与分享采集完成后打开「布局检查记录」页面InspectRecordActivity.kt可对每条记录执行三类操作查看以图片弹窗形式查看该次采集的屏幕截图JpegDialog分享通过系统分享面板将{fileId}.zip分享给其他应用转存——分享实现基于FileProvider生成content://URI 并以ACTION_SENDapplication/zip发送删除删除单条记录同步清理同名.zip/.jpeg/.json三个文件菜单中还提供「全部删除」。列表页数据来源于 InspectListRepository.kt扫描capture目录下所有.zip文件读取同名的.json解析出应用名、包名、Activity 名与创建时间并按创建时间倒序排列配合 InspectListPagingSource.kt 做分页加载记录入口按钮会实时显示「当前存在 N 条记录」的数量InspectRecordButton.kt。Web 端通过「布局检查工具」导入并查看详细节点手机端查看的是截图与概要信息更详细的节点分析需要转到 Web 端完成。官方文档指引在 Web 端通过「布局检查工具」导入并查看详细的节点信息该工具即仓库中 docs/inspect/index.md 对应的页面由 InspectHome.vue 渲染。Web 端的工作方式与使用要点如下导入记录页面头部提供「批量上传」按钮InspectHeader.vue可一次选择多个.zip文件解压逻辑见 docs/inspect/hook/useZip.ts它用 JSZip 将 zip 中的.jpeg与.json分离并把解析结果存入浏览器本地 IndexedDBdocs/my-index-db/index.ts重复文件会被自动去重记录列表上传后以表格展示创建时间、应用名称、包名、设备名称支持按应用过滤、按时间排序与多选批量删除InspectTable.vue点击行进入详情页通过?fileId参数定位若本地已有缓存则直接读取节点详情查看详情页InspectContainer.vue分为四块截图区NodePic.vue显示采集到的屏幕截图鼠标悬停显示真实像素坐标点击画面可命中对应节点并高亮红色框选框选带 150ms 过渡动画节点树NodeTree.vue以树形结构展示节点层级叶子节点与含子节点显示子节点数量一目了然节点表NodeTable.vue展示当前选中节点的坐标、深度、可点击性、类名、文本、控件 ID 等全部属性配置代码NodeCode.vue选中节点后自动生成一段 YAML 配置草稿并支持一键复制。从 Web 工具直接生成 YAML 配置这是布局检查与「自定义配置」衔接最顺滑的一环。NodeCode.vue 会根据选中节点的特征自动生成对应的配置片段节点存在viewIdResourceName→ 生成skipIdsid 取控件 ID节点存在text→ 生成skipTexts并自动填入length: 文本长度两者皆无 → 生成skipBoundsbound 取left,top,right,bottom拼接的坐标字符串无论哪种类型都会带上当前页面的activityName以及filefileIdxxxnodeIdyyy溯源参数和占位的desc描述字段。例如选中一个带控件 ID 的节点会得到类似下面的草稿可在此基础上补充描述后合并进自定义配置- appName: 示例应用 packageName: com.example.app skipIds: - id: com.example.app:id/btn_skip activityName: com.example.app.activity.SplashActivity file: fileIdxxxx-xxxx-xxxxnodeId10 desc: 请填写描述将这份 YAML 接入 SKIP 的「自定义配置」功能支持 URL / YAML 文本 / JSON 文本见 settings 相关源码即可形成「布局检查 → 生成配置 → 自动跳过」的完整工作流。配置字段的完整语义可参考 docs/advance/custom-config/field-meaning.md 与仓库内置示例 app/src/main/assets/skip_config_v3.yaml。常见问题与注意事项按音量- 无反应请确认两件事——「SKIP 无障碍服务」已开启且「是否启用布局检查」开关处于打开状态InspectService运行中才会拦截音量键。通知权限被关闭布局检查服务是前台服务系统要求其必须有常驻通知若关闭通知权限开启开关时会被强制弹窗引导开启。记录保存失败截图与节点 JSON 需在 5 秒内每秒检测一次最多 5 次同时就绪才会打包成功若当前页面恰好没有新的无障碍事件导致节点未采集可能出现失败提示重新按一次音量- 即可。记录存储位置采集产物zip / jpeg / json保存在 App 私有目录filesDir/capture下可随时在记录页删除或分享转存不占用系统相册。配置溯源Web 工具生成的file字段fileIdxxxnodeIdyyy可追溯到原始采集记录便于后续校对节点坐标与配置是否一致。赞分享移动开发原生移动GUI 自动化【免费下载链接】SKIP自动跳过APP开屏广告项目地址https://gitcode.com/gh_mirrors/ski/SKIP点击查看免费下载相关推荐SKIP 布局查看实战从节点探查获取 text、id、bounds编写精准的 skip 配置SKIP 布局查看实战从节点探查获取 text、id、bounds编写精准的 skip 配置 SKIP 是一款基于 Android 无障碍服务自动跳过 Ap移动开发原生移动GUI 自动化PyTorch分布式检查点(DCP)使用指南PyTorch分布式检查点 DCP 使用指南 概述 在分布式训练环境中模型参数和梯度被划分到多个训练器上这使得模型检查点的保存和恢复变得复杂。PyTorch示例工程一键取整本教材tchMaterial-parser电子课本 PDF 一次到位一键取整本教材tchMaterial parser电子课本 PDF 一次到位 逐页保存卡在第 4 本 开学前夜陈老师收新学期语文电子课本对着国家中小学前端桌面应用AI 应用MCP 服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考