diff --git a/.github/ISSUE_TEMPLATE/submit_new_chart_rule.yml b/.github/ISSUE_TEMPLATE/submit_new_chart_rule.yml new file mode 100644 index 00000000..1a22cbde --- /dev/null +++ b/.github/ISSUE_TEMPLATE/submit_new_chart_rule.yml @@ -0,0 +1,153 @@ +name: (preview) Submit new chart rule /(预览)提交新的图表统计规则 +description: Create an issue and describe a chart statistic rule. / 创建一个 issue 并描述图表统计规则信息。 +labels: [New Chart Rule] +title: "[New Chart Rule] (Chart rule title)" +body: + - type: markdown + attributes: + value: | + 为了避免浪费彼此的时间,请认真填写以下信息。 + In order to avoid wasting each other's time, please fill in the information carefully. + + 请参考文档 / Please read reference: https://github.com/LibChecker/LibChecker-Rules/blob/v4/chart/README.md + - type: textarea + attributes: + label: Statistic title / 统计标题 + description: | + Fill in the chart statistic title in English and Simplified Chinese, for example: **Flutter apps / Flutter 应用** + 填写图表统计标题,需同时提供英文和简体中文,例如:**Flutter apps / Flutter 应用** + placeholder: | + en: Example SDK + zh-Hans: 示例 SDK + validations: + required: true + - type: textarea + attributes: + label: Statistic description / 统计描述 + description: | + Fill in a neutral introduction of the technology or capability measured by this statistic, for excerpting from the official document. + 填写该技术或能力的中性介绍,最好在官方文档摘抄。 + placeholder: | + en: Example SDK provides a documented capability for Android apps. + zh-Hans: 示例 SDK 为 Android 应用提供一项有公开文档的能力。 + validations: + required: true + - type: input + attributes: + label: Reference URL / 参考链接 + description: | + Fill in the primary project, standards body, vendor, or platform document here. **Must be not other third-party links.** + 这里填写主要的项目、标准机构、厂商或平台的文档链接。**不可以是其他第三方链接。** + validations: + required: true + - type: dropdown + attributes: + label: Calculation type / 计算方式 + description: | + Select the calculation type. Use **predicate** when every app belongs to one of two groups. Use **facets** when one app can match several named capabilities. + 选择计算方式。**predicate** 适用于非此即彼的二元分类。**facets** 适用于一个应用可能匹配多个命名能力的情况。 + options: + - predicate (two groups / 二元分类) + - facets (multiple capabilities / 多能力分类) + validations: + required: true + - type: textarea + attributes: + label: Detection evidence / 检测依据 + description: | + Describe what data LibChecker should inspect / 描述 LibChecker 应检测哪些数据: + - `target_sdk` — target API level of the app / 应用的 target API 级别 + - `native_library` — .so library filename / .so 库文件名 + - `archive_entry` — APK ZIP entry name / APK ZIP 条目名 + - `dex_class` — DEX class query / DEX 类查询 + - `manifest_receiver_action` — manifest receiver action + - `manifest_attribute` — manifest Boolean attribute / manifest 布尔属性 + placeholder: | + evidence: native_library + operator: contains + value: libexample.so + validations: + required: true + - type: textarea + attributes: + label: Matched & Unmatched titles / 匹配组 & 未匹配组标题 + description: | + Fill in the labels for the two result groups (matched apps and other apps). + 填写两个结果组的标签(匹配的应用和未匹配的应用)。 + placeholder: | + matchedTitle: + en: Example SDK apps + zh-Hans: 示例 SDK 应用 + unmatchedTitle: + en: Other apps + zh-Hans: 其他应用 + validations: + required: true + - type: textarea + attributes: + label: Facet items (if facets) / 分面项(如适用) + description: | + If you selected **facets**, fill in each facet item's ID, title, and detection condition here. Maximum 8 items. + 如果选择了 **facets**,请在这里填写每个分面项的 ID、标题和检测条件。最多 8 项。 + placeholder: | + id: service-kit + title: + en: Service Kit + zh-Hans: 服务套件 + evidence: native_library, contains, libexample_service.so + validations: + required: false + - type: input + attributes: + label: Rule ID / 规则 ID + description: | + Fill in the permanent rule ID. Must match `.` pattern, for example: **official.example-sdk** / **absinthe.example-sdk** + 填写永久规则 ID,必须匹配 `<组织小写名>.<规则小写名>` 模式,例如:**official.example-sdk** / **absinthe.example-sdk** + validations: + required: true + - type: textarea + attributes: + label: Icon / 图标 + description: | + If there is a logo icon, you can choose to provide it, **but it must be in SVG format**. The SVG must with no scripts, styles, text, or external references. + 如果有 Logo 图标可以选择提供,**但必须为 SVG 格式**。SVG 不能包含脚本、样式、文本或外部引用。 + validations: + required: false + - type: dropdown + attributes: + label: Release channel / 发布渠道 + description: | + New rules should normally start with **preview-only**. Move to **stable** after testing. + 新规则通常应从 **preview-only** 开始,测试后再转为 **stable**。 + options: + - preview-only + validations: + required: true + - type: dropdown + attributes: + label: Fingerprint / 指纹策略 + description: | + Select when LibChecker should discard cached chart results after app data changes. Use **standard** for metadata-only rules, **artifact** for rules inspecting native libraries / archive entries / DEX / manifest. + 选择应用数据变化后何时丢弃缓存的图表结果。纯元数据规则用 **standard**,涉及原生库/ZIP 条目/DEX/manifest 的规则用 **artifact**。 + options: + - standard (default / 默认) + - artifact (for DEX / native / archive / manifest rules) + - features (for feature initialization rules / 依赖 LibChecker 已初始化特征数据的规则) + validations: + required: true + - type: textarea + attributes: + label: Tested apps / 测试应用 + description: | + Which applications were used to verify the matching and non-matching behavior? Provide app names and versions if necessary. + 使用哪些应用验证了匹配和未匹配行为?如有必要请提供应用名称和版本号。 + validations: + required: false + - type: textarea + attributes: + label: Additional remarks / 其他备注 + description: | + Fill in any additional information to help reviewers understand the rule. + 填写其他有助于审核者理解该规则的信息。 + validations: + required: false diff --git a/.github/issue-close-app.yml b/.github/issue-close-app.yml index e622dcac..c8abd14a 100644 --- a/.github/issue-close-app.yml +++ b/.github/issue-close-app.yml @@ -1,10 +1,19 @@ comment: "This issue is closed because it does not meet our issue template. Please read it." issueConfigs: - content: -# bug report + # submit new rule - "Library filename" - "Library label" - "Library team" - "Library relative URL" +- content: + # submit new chart rule + - "Statistic title" + - "Statistic description" + - "Reference URL" + - "Calculation type" + - "Detection evidence" + - "Matched & Unmatched titles" + - "Rule ID" caseInsensitive: false label: "closed by bot" diff --git a/.github/workflows/close-invalid-issues.yml b/.github/workflows/close-invalid-issues.yml index 9ef16aa5..bb397394 100644 --- a/.github/workflows/close-invalid-issues.yml +++ b/.github/workflows/close-invalid-issues.yml @@ -11,14 +11,26 @@ jobs: steps: - name: Check Issue Content - uses: actions/github-script@v6 + uses: actions/github-script@v9 with: script: | const issueBody = context.payload.issue.body || ''; const validKeywordsNewRules = ['Library filename / 库文件名', 'Library label / 库的文字标签']; - const validKeywordsBugReport = ['Current library filename / 现有库文件名', 'Library relative URL / 相关链接'] + const validKeywordsBugReport = ['Current library filename / 现有库文件名', 'Library relative URL / 相关链接']; + const validKeywordsNewChartRules = ['Statistic title / 统计标题', 'Statistic description / 统计描述']; - if (!validKeywordsNewRules.every(keyword => issueBody.includes(keyword)) && !validKeywordsBugReport.every(keyword => issueBody.includes(keyword))) { + const isMatch = validKeywordsNewRules.every(keyword => issueBody.includes(keyword)) + || validKeywordsBugReport.every(keyword => issueBody.includes(keyword)) + || validKeywordsNewChartRules.every(keyword => issueBody.includes(keyword)); + + const issueTitle = context.payload.issue.title || ''; + const defaultTitles = [ + '[New Rule] (Library label)', + '[Bug] (Library label)', + '[New Chart Rule] (Chart rule title)' + ]; + + if (!isMatch) { const issueNumber = context.payload.issue.number; const owner = context.repo.owner; const repo = context.repo.repo; @@ -27,7 +39,7 @@ jobs: owner, repo, issue_number: issueNumber, - body: 'This issue does not follow the template. Please update it accordingly.' + body: 'This issue does not follow the template. Please update it accordingly.\n\n此 issue 未遵循模板格式,请按要求填写。' }); await github.rest.issues.update({ @@ -36,4 +48,15 @@ jobs: issue_number: issueNumber, state: 'closed' }); + } else if (defaultTitles.some(title => issueTitle === title)) { + const issueNumber = context.payload.issue.number; + const owner = context.repo.owner; + const repo = context.repo.repo; + + await github.rest.issues.createComment({ + owner, + repo, + issue_number: issueNumber, + body: 'Please update the issue title to reflect the specific content of your submission, rather than keeping the default title.\n\n请修改 issue 标题以反映提交内容,不要使用默认标题。' + }); } diff --git a/.github/workflows/fetch_flutter_snapshot_hash.yml b/.github/workflows/fetch_flutter_snapshot_hash.yml index 2d866a92..62a42a22 100644 --- a/.github/workflows/fetch_flutter_snapshot_hash.yml +++ b/.github/workflows/fetch_flutter_snapshot_hash.yml @@ -14,6 +14,7 @@ concurrency: jobs: generate_files: + if: github.repository_owner == 'LibChecker' runs-on: ubuntu-latest timeout-minutes: 20 diff --git a/flutter_hash/engine/69c8c61792f04cc809dfef0c910414fb9afc06cd.json b/flutter_hash/engine/69c8c61792f04cc809dfef0c910414fb9afc06cd.json new file mode 100644 index 00000000..26528e05 --- /dev/null +++ b/flutter_hash/engine/69c8c61792f04cc809dfef0c910414fb9afc06cd.json @@ -0,0 +1,12 @@ +{ + "engine": "69c8c61792f04cc809dfef0c910414fb9afc06cd", + "releases": [ + { + "flutter": "3.44.7", + "dart": "3.12.2", + "channel": "stable", + "framework": "84fc5cbb223bc12f83d65b647ff8a56caf779ffd", + "release_date": "2026-07-20T18:06:40.613912Z" + } + ] +} diff --git a/flutter_hash/tools/__pycache__/fetcher.cpython-314.pyc b/flutter_hash/tools/__pycache__/fetcher.cpython-314.pyc index d1d55345..4d545788 100644 Binary files a/flutter_hash/tools/__pycache__/fetcher.cpython-314.pyc and b/flutter_hash/tools/__pycache__/fetcher.cpython-314.pyc differ diff --git a/flutter_hash/tools/__pycache__/test_fetcher.cpython-314.pyc b/flutter_hash/tools/__pycache__/test_fetcher.cpython-314.pyc index 41c1e753..a95a69d0 100644 Binary files a/flutter_hash/tools/__pycache__/test_fetcher.cpython-314.pyc and b/flutter_hash/tools/__pycache__/test_fetcher.cpython-314.pyc differ