From e83b3dcaa8c8673fed4183a5f88f489ebe04a37b Mon Sep 17 00:00:00 2001 From: lisonge Date: Sat, 13 Jul 2024 23:07:20 +0800 Subject: [PATCH] docs: fast query --- api/src/index.ts | 10 ++++++++-- docs/selector/optimize.md | 30 +++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/api/src/index.ts b/api/src/index.ts index b41d3ae..9e6ddce 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -268,7 +268,7 @@ export interface RawCommonProps { /** * 如果开启, 此规则下的所有满足 **特定格式的选择器** 将使用快速查找优化查询速度 * - * 详细文档请查看 [查询优化](https://gkd.li/selector/optimize) + * 详细文档请查看 [查询优化](/selector/optimize) * * @default false */ @@ -572,9 +572,13 @@ export interface RawGroupProps extends RawCommonProps { */ export interface RawAppRuleProps { /** - * 如果 设备界面Id startWith activityIds 的任意一项, 则匹配 + * 如果 界面Id startWith activityIds 的任意一项, 则匹配 * * 如果要匹配所有界面: `undefined` (不填写) 或者 `[]` (避免使用上级属性) + * + * 如果 activityId 以 `.` 开头, 则等价于 appId + activityId + * + * 示例: `com.tencent.mm` (微信) 的某界面 `.MainActivity` 等价于 `com.tencent.mm.MainActivity` */ activityIds?: IArray; @@ -582,6 +586,8 @@ export interface RawAppRuleProps { * 如果 设备界面Id startWith excludeActivityIds 的任意一项, 则排除匹配 * * 优先级高于 activityIds + * + * 当 activityId 以 `.` 开头时, 与 activityIds 识别规则一致 */ excludeActivityIds?: IArray; diff --git a/docs/selector/optimize.md b/docs/selector/optimize.md index 0b7dfb0..00cc5d3 100644 --- a/docs/selector/optimize.md +++ b/docs/selector/optimize.md @@ -40,15 +40,18 @@ ## 快速查询 {#fast-query} > [!TIP] 提示 -> 此优化需要设置 [fastQuery](https://gkd.li/api/interfaces/RawCommonProps#fastquery) 来启用 +> 此优化需要设置 [fastQuery](/api/interfaces/RawCommonProps#fastquery) 来启用 一般情况下, 选择器 `[vid="name"]` 需要从 根节点/事件节点 使用深度先序顺序遍历子孙节点并判断是否满足条件 -但是 Android 提供了 [findAccessibilityNodeInfosByViewId](https://developer.android.google.cn/reference/android/view/accessibility/AccessibilityNodeInfo#findAccessibilityNodeInfosByViewId(java.lang.String)) / [findAccessibilityNodeInfosByText](https://developer.android.google.cn/reference/android/view/accessibility/AccessibilityNodeInfo#findAccessibilityNodeInfosByText(java.lang.String)) 两个 Api +但是 Android 提供了如下两个快速获取节点的 Api + +- [findAccessibilityNodeInfosByViewId](https://developer.android.google.cn/reference/android/view/accessibility/AccessibilityNodeInfo#findAccessibilityNodeInfosByViewId(java.lang.String)) +- [findAccessibilityNodeInfosByText](https://developer.android.google.cn/reference/android/view/accessibility/AccessibilityNodeInfo#findAccessibilityNodeInfosByText(java.lang.String)) 这使得可以通过 `id`/`vid`/`text` 直接获取子孙节点 -于是我们需要规定符合特定条件的选择器来调用这些 Api 从而跳过手动遍历子孙节点 +对此我们需要规定符合特定条件的选择器来调用这些 Api 从而跳过手动遍历子孙节点 所有 `末尾属性选择器`的`第一个属性选择表达式`符合下面的结构之一 @@ -59,7 +62,7 @@ - `[text*='abc']` - `[text$='abc']` -或者任意数量符合格式并使用 `||` 连接形成逻辑表达式也符合条件, 即如下格式 +或者使用 `||` 将它们连接形成的逻辑表达式也符合条件, 即如下格式 - `[id='abc' || id='abc2']` - `[id='abc' || vid='abc' || text='abc' || text^='abc' || text*='abc' || text$='abc']` @@ -73,11 +76,14 @@ - `A > B + C[id='x' || text='manbaout' || text*='ikun'][childCount=2]` ✅ - `A > B + C[childCount=2][id='x' || text='manbaout' || text*='ikun']` ❎ -此外某个属性选择器如果符合上面格式并且使用 `>>n` 连接, 也将使用局部快速查找 +这样一个选择器只能在右侧使用快速查询, 为了在中间的子选择器也能使用 + +额外规定如果属性选择器如果符合上面格式并且右侧是 `>>n`, 也能在局部使用快速查找 示例 `A > B + C[id='x'][childCount=2] >>n D` 中的 `C[id='x'][childCount=2] >>n` 可以使用局部快速查找 -实际上所有的选择器如 `A > B + C` 都可以等价看待为 `A > B + @C < [!TIP] 提示 +> 实际上从根节点开始匹配的选择器如 `A > B` 都可等价为 `A > @B < C[id='x'] >>n D[id='y'] >>n E`, 其中的 `C[id='x'] >>n` 和 `D[id='y'] >>n` 都可以使用局部快速查找 -以 [`[vid="image"] <