Skip to content
Open
153 changes: 153 additions & 0 deletions .github/ISSUE_TEMPLATE/submit_new_chart_rule.yml
Original file line number Diff line number Diff line change
@@ -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 `<lowercase-org-name>.<lowercase-rule-name>` 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
11 changes: 10 additions & 1 deletion .github/issue-close-app.yml
Original file line number Diff line number Diff line change
@@ -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"
31 changes: 27 additions & 4 deletions .github/workflows/close-invalid-issues.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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({
Expand All @@ -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 标题以反映提交内容,不要使用默认标题。'
});
}
1 change: 1 addition & 0 deletions .github/workflows/fetch_flutter_snapshot_hash.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ concurrency:

jobs:
generate_files:
if: github.repository_owner == 'LibChecker'
runs-on: ubuntu-latest
timeout-minutes: 20

Expand Down
12 changes: 12 additions & 0 deletions flutter_hash/engine/69c8c61792f04cc809dfef0c910414fb9afc06cd.json
Original file line number Diff line number Diff line change
@@ -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"
}
]
}
Binary file modified flutter_hash/tools/__pycache__/fetcher.cpython-314.pyc
Binary file not shown.
Binary file modified flutter_hash/tools/__pycache__/test_fetcher.cpython-314.pyc
Binary file not shown.