Skip to content

RawAppRule

应用规则

Extends

Properties

actionCd?

actionCd?: Integer

单位: 毫秒

当前规则的冷却时间, 或者执行 action 最小间隔

Default

ts
1000

Inherited from

RawRuleProps.actionCd


actionDelay?

actionDelay?: Integer

单位: 毫秒

延迟执行: 查询到节点->等待一段时间->再次查询到节点则执行对应 action

Inherited from

RawRuleProps.actionDelay


quickFind?

quickFind?: boolean

如果开启, 此规则下的所有 末尾属性选择器第一个属性选择表达式符合下面的结构之一的选择器 将使用快速查找

  • [id='abc']
  • [vid='abc']
  • [text='abc']
  • [text^='abc']
  • [text*='abc']
  • [text$='abc']

比如 A > B + C[id='x'][childCount=2] 符合, 但 A > B + C[childCount=2][id='x'] 不符合

它的底层原理是 跳过手动遍历所有节点 直接调用 findAccessibilityNodeInfosByViewId / findAccessibilityNodeInfosByText 得到可匹配节点

大多数情况下都能查询到, 在少数某些复杂结构下, 即使目标节点存在, 快速查询也不一定查询到

比如 Image < @View + View >2 [text*='广告'] 虽然符合快速查询的条件但是使用 findAccessibilityNodeInfosByText("广告") 并不能查询到节点

它是优点是快速, 因为遍历所有节点是一个耗时行为, 虽然多数情况下这种耗时较低

但是在某些软件比如 哔哩哔哩 的开屏广告在这种耗时下延迟可达 1-2s, 这也是导致 gkd-kit/gkd#60 的原因

如果你想对某个局部选择器关闭快速查找,只需要调整你的选择器的属性选择表达式的顺序使得它不符合快速查找的条件即可

Default

ts
false

Inherited from

RawRuleProps.quickFind


matchDelay?

matchDelay?: Integer

单位: 毫秒

匹配延迟

规则准备匹配/或被唤醒时, 等待一段时间, 使此规则参与查询屏幕节点

Inherited from

RawRuleProps.matchDelay


matchTime?

matchTime?: Integer

单位: 毫秒

规则匹配时间, 此规则参与查询屏幕节点时, 等待一段时间, 休眠此规则

例如某些应用的 开屏广告 的 activityId 容易误触/太广泛, 而开屏广告几乎只在应用切出来时出现, 设置一个有限匹配时间能避免后续的误触

Inherited from

RawRuleProps.matchTime


actionMaximum?

actionMaximum?: Integer

最大执行次数

规则的 action 被执行的最大次数, 达到最大次数时, 休眠此规则

功能类似 matchTime, 适用于只需要执行一次的: 开屏广告/更新弹窗/青少年弹窗 一类规则

当规则准备匹配/或被唤醒时, 将重新计算次数

Inherited from

RawRuleProps.actionMaximum


resetMatch?

resetMatch?: "activity" | "app"

当规则因为 matchTime/actionMaximum 而休眠时, 如何唤醒此规则

Default

ts
'activity'

Example

ts
'activity'
// 当 activity 刷新时, 唤醒规则
// 刷新 activity 并不代表 activityId 变化
// 如 哔哩哔哩视频播放页 底部点击推荐视频 进入另一个 视频播放页, 进入了新 activity 但是 activityId 并没有变化

Example

ts
'app'
// 重新进入 app 时, 唤醒规则

Inherited from

RawRuleProps.resetMatch


actionCdKey?

actionCdKey?: Integer

与这个 key 的 rule 共享 cd

比如开屏广告可能需要多个 rule 去匹配, 当一个 rule 触发时, 其它 rule 的触发是无意义的

如果你对这个 key 的 rule 设置 actionCd=3000, 那么当这个 rule 和 本 rule 触发任意一个时, 在 3000毫秒 内两个 rule 都将进入 cd

Inherited from

RawRuleProps.actionCdKey


actionMaximumKey?

actionMaximumKey?: Integer

与这个 key 的 rule 共享次数

比如开屏广告可能需要多个 rule 去匹配, 当一个 rule 触发时, 其它 rule 的触发是无意义的

如果你对这个 key 的 rule 设置 actionMaximum=1, 那么当这个 rule 和 本 rule 触发任意一个时, 两个 rule 都将进入休眠

Inherited from

RawRuleProps.actionMaximumKey


order?

order?: Integer

规则参与匹配的顺序, 数字越小越先匹配

如果两个规则 order 相同, 按照 groups 中的数组顺序匹配, app 类型规则顺序优先于 global 类型规则

属于不同订阅的规则按照订阅列表中顺序匹配, 长按订阅卡片可以拖动排序

Default

ts
0

Version

1.7.0

Inherited from

RawRuleProps.order


forcedTime?

forcedTime?: Integer

单位: 毫秒

在开始匹配后的一段时间内, 不管界面没有通知变化, 主动使此规则参与屏幕查询

GKD 借助 onAccessibilityEvent 感知界面变化

但是某些基于 flutter/webview 开发的应用/页面在变化时并不会通知系统去触发 onAccessibilityEvent, 但是屏幕上的节点信息确实产生变化

唯一的办法是在开始匹配的一定时间内主动查询屏幕节点

Version

1.7.0

Inherited from

RawRuleProps.forcedTime


snapshotUrls?

snapshotUrls?: IArray<string>

当前 规则/规则组 的快照链接, 增强订阅可维护性

Inherited from

RawRuleProps.snapshotUrls


exampleUrls?

exampleUrls?: IArray<string>

当前 规则/规则组 的规则在手机上的运行示例, 支持 jpg/png/webp/gif

如果规则是多个规则组合起来的, 可以更好看懂规则到底在干啥, 比如 点击关闭按钮-选择关闭原因-确认关闭 这种广告用 gif 看着更清楚在干啥

Inherited from

RawRuleProps.exampleUrls


key?

key?: Integer

当前规则在列表中的唯一标识

key 没有顺序大小之分, 可以是任意数字

设置后不可更改, 否则造成点击记录错乱

Inherited from

RawRuleProps.key


name?

name?: string

规则名称

Inherited from

RawRuleProps.name


preKeys?

preKeys?: IArray<Integer>

要求当前列表里某个 key 刚刚执行

比如点击关闭按钮-选择关闭原因-确认关闭, key 分别是 1,2,3, preKeys 分别是 [],[1],[2]

那么 选择关闭原因 必须要求 比如点击关闭按钮 刚刚点击过才能执行, 确认关闭 也要求 选择关闭原因 刚刚点击过才执行

否则后面的规则不会触发, 也就是要求规则按顺序执行, 这是为了防止规则匹配范围太过广泛而误触

Inherited from

RawRuleProps.preKeys


action?

action?: "click" | "clickNode" | "clickCenter" | "back" | "longClick" | "longClickNode" | "longClickCenter"

规则匹配后的操作行为

position 存在的情况下, action 的默认值为 clickCenter

Example

ts
`click`
// 为默认值, 如果目标节点是 clickable 的, 则使用 `clickNode`, 反之使用 `clickCenter`
// 并且当 `clickNode` 事件没有被应用接收时, 则使用 `clickCenter`

Example

ts
`clickNode`
// 向系统发起一个点击无障碍节点事件. 即使节点在屏幕外部/或者被其它节点遮挡,也依然能够正确触发点击目标节点
// 但是如果目标节点不是 clickable 的, 目标应用通常不响应这个点击事件, 也就是点击无效果
// 在极少数情况下, 即使节点是 clickable 的,应用显示接收但是不响应节点点击事件, 此时需要手动设置 `clickCenter`

Example

ts
`clickCenter`
// 计算出此控件的中心的坐标并且如果这个坐标在屏幕内部,那么就向系统发起一个点击屏幕坐标事件
// 如果这个坐标不在屏幕内部, 当作未匹配
// 另外如果目标节点的位置被其它节点遮挡覆盖, 则会点击触发最上层的节点(可能不是目标节点)

Example

ts
`back`
// 向系统发起一个返回事件, 相当于按下返回键

Example

ts
`longClick`
// 如果目标节点是 longClickable 的, 则使用 `longClickNode`, 反之使用 `longClickCenter`
// 并且当 `longClickNode` 事件没有被应用接收时, 则使用 `longClickCenter`

Example

ts
`longClickNode`
// 向系统发起一个长按无障碍节点事件,与 clickNode 类似

Example

ts
`longClickCenter`
// 与 clickCenter 类似, 长按时间为 400 毫秒

Inherited from

RawRuleProps.action


position?

position?: Position

在使用 clickCenter/longClickCenter 时的自定义点击位置

默认坐标为节点中心

如果计算出的坐标不在屏幕内部, 当作未匹配

在 position 存在的情况下, action 的默认值为 clickCenter

Version

1.7.0

Inherited from

RawRuleProps.position


matches?

matches?: IArray<string>

一个或者多个合法的 GKD 选择器, 如果每个选择器都能匹配上节点, 那么点击最后一个选择器的目标节点

Inherited from

RawRuleProps.matches


excludeMatches?

excludeMatches?: IArray<string>

一个或者多个合法的 GKD 选择器, 如果存在一个选择器匹配上节点, 则停止匹配此规则

Inherited from

RawRuleProps.excludeMatches


activityIds?

activityIds?: IArray<string>

如果 设备界面Id startWith activityIds 的任意一项, 则匹配

如果要匹配所有界面: undefined (不填写) 或者 [] (避免使用上级属性)

Inherited from

RawAppRuleProps.activityIds


excludeActivityIds?

excludeActivityIds?: IArray<string>

如果 设备界面Id startWith excludeActivityIds 的任意一项, 则排除匹配

优先级高于 activityIds

Inherited from

RawAppRuleProps.excludeActivityIds


versionNames?

versionNames?: IArray<string>

如果应用版本名称包含在此列表中, 则匹配

Version

1.7.0

Inherited from

RawAppRuleProps.versionNames


excludeVersionNames?

excludeVersionNames?: IArray<string>

如果应用版本名称包含在此列表中, 则排除匹配, 优先级高于 versionNames

Version

1.7.0

Inherited from

RawAppRuleProps.excludeVersionNames


versionCodes?

versionCodes?: IArray<Integer>

如果应用版本代码包含在此列表中, 则匹配

Version

1.7.0

Inherited from

RawAppRuleProps.versionCodes


excludeVersionCodes?

excludeVersionCodes?: IArray<Integer>

如果应用版本代码包含在此列表中, 则排除匹配, 优先级高于 versionCodes

Version

1.7.0

Inherited from

RawAppRuleProps.excludeVersionCodes

Released under the GPL-v3 License.