gkd 选择器属性匹配:节点属性筛选与逻辑表达式
属性选择器决定「什么样的节点算命中」。GKD 的属性选择器和 CSS 很像,但表达能力更强:方括号里可以写完整的逻辑表达式。本页只讲属性部分,层级关系留给下一页。
方括号里的表达式
每个 [] 内部是一个逻辑表达式,可以包含多个条件:
@TextView[a=1][b^='2'][c*='a'||d.length>7&&e=false]
拆解这段示例能看到全部要素:
TextView:节点类型(name 属性)。因为 Android 节点名都是android.widget.TextView这样的全限定名,写TextView等价于[name='TextView'||name$='.TextView'];*:通配任意类型;^=、*=:前缀、包含匹配(操作符全家桶见下表);||与&&:逻辑或、逻辑且,&&优先级更高;- 并列多个
[]等价于且关系:[a=1][b=1]就是[a=1&&b=1]; !(...):取反,注意!后面必须紧跟括号;@:声明匹配的目标节点。一条规则可以有多个属性选择器,@打在谁身上,最终点击的就是谁;没写@时取最后一个属性选择器。
常用操作符
GKD 的属性比较操作符一共 14 个,写规则最常用的是这几个:
| 操作符 | 含义 | 示例 |
|---|---|---|
= / != | 等于 / 不等于 | [text="跳过"] |
*= / !*= | 包含 / 不包含 | [text*="跳过"] |
^= / $= | 以…开头 / 以…结尾 | [text^="广告"] |
~= | 正则匹配 | [text~="(?is).*skip.*"] |
> / < | 数值比较(仅整数) | [text.length<10] |
两个类型限制要记住:> < 只能比较 int;正则 ~= 的右侧只能是字符串字面量,且必须是平台支持的正则语法。
属性从哪来:节点属性与快捷方式
节点自带的常用属性有 name(类型)、text(文字)、id(完整资源 id)、desc(无障碍描述)、clickable(可点击)、visibleToUser(对用户可见)、childCount(子节点数)等,完整清单可在官方文档的节点属性方法页查阅。
两个提升书写效率的简写:
- vid:
[vid="btn_skip"]是 id 的简写形式,自动匹配应用包名前缀,不用写全com.xxx.app:id/btn_skip; - 属性链:
text.length这种成员表达式可以取属性的属性,text.get(0)这类调用表达式还能调方法,组合起来能表达很细的条件(如[text.size=3])。
一条完整的属性选择器
把本页要素合起来,就是全局规则那条经典示例的核心:
[text*="跳过"][text.length<10][visibleToUser=true]
三个条件叠加:文字包含「跳过」、文字长度小于 10(排除「跳过本集片头」)、节点真实可见。三个 [] 并列,全部满足才算命中。
下一步:光有属性不够时,把节点之间的关系写进来——见层级关系匹配。