gkd-kit / gkd

基于无障碍,高级选择器,订阅规则的自定义屏幕点击 Android 应用 | An Android APP with custom screen tapping based on Accessibility, Advanced Selectors, and Subscription Rules
https://gkd.li
GNU General Public License v3.0
22.2k stars 1.12k forks source link

[BUG] preKeys设置为自身时导致规则无限触发 #737

Closed AIsouler closed 2 months ago

AIsouler commented 2 months ago

日志文件

https://f.gkd.li/17028019

BUG描述(文字/截图/视频)

规则如下:

{
  id: 'li.songe.gkd',
  name: 'GKD',
  groups: [
    {
      key: 1,
      name: '其他',
      rules: [
        {
          key: 0,
          activityIds: 'li.songe.gkd.MainActivity',
          matches: '@[clickable=true] > [text="关于"]',
          exampleUrls: 'https://e.gkd.li/b9d2d27e-702c-4467-850e-8e1fe5c49037',
          snapshotUrls: 'https://i.gkd.li/i/17027734',
        },
        {
          preKeys: [0, 1],
          key: 1,
          activityIds: 'li.songe.gkd.MainActivity',
          matches: '[text="构建渠道"]',
          exampleUrls: 'https://e.gkd.li/9fa768f1-dca5-42d0-9f12-f9f2d37a876d',
          snapshotUrls: 'https://i.gkd.li/i/17027733',
        }
      ],
    },
  ],
}

虽然可以不这么写来避免此问题,但是当有scopeKeys且目标组存在相同key时无法避免

{
  id: 'li.songe.gkd',
  name: 'GKD',
  groups: [
    {
      key: 1,
      name: '其他-1',
      scopeKeys: 2,
      rules: [
        {
          preKeys: [1],
          key: 1,
          activityIds: 'li.songe.gkd.MainActivity',
          matches: '[text="构建渠道"]',
          exampleUrls: 'https://e.gkd.li/9fa768f1-dca5-42d0-9f12-f9f2d37a876d',
          snapshotUrls: 'https://i.gkd.li/i/17027733',
        }
      ],
    },
    {
      key: 2,
      name: '其他-2',
      rules: [
        {
          key: 1,
          activityIds: 'li.songe.gkd.MainActivity',
          matches: '[text="版本名称"]',
          exampleUrls: 'https://e.gkd.li/9fa768f1-dca5-42d0-9f12-f9f2d37a876d',
          snapshotUrls: 'https://i.gkd.li/i/17027733',
        },
      ],
    }
  ],
}

期望行为(文字/截图/视频)

规则不无限触发

实际行为(文字/截图/视频)

规则无限触发

lisonge commented 2 months ago

没感觉有什么不对,行为完全符合字段规范定义

lisonge commented 2 months ago

scopeKeys 本来就要求不同的组的 key 也要不同

lisonge commented 2 months ago

scopeKeys 相当于合并多个组,但是这些组仍然可以受到用户的配置开关

所以合并的时候,最好每个组的rule key 都是全局唯一的

AIsouler commented 2 months ago

明白了,但是这样提交代码时不会触发重复key的报错

之前突然发现写好的一个顺序签到规则会被另一个规则组的rule打断,也就是在两条顺序规则之间触发了另一个规则组的rule,然后想到scopeKeys可以解决这个问题,但是规则的key值已经设置好了,只能去掉prekeys或者修改key值了