周五晚上提交审核,周一早上收到驳回通知。这些问题机器早就能发现,为什么要人肉查?
前四篇我们解决了权限、SDK 初始化、依赖治理、数据删除这些问题。
现在的问题是:这些检查每次都要人工做。提交前一天,对着 Checklist 一条一条看。经常漏,经常忘。
能不能让机器自动检查?把人工 Checklist 变成 CI 规则,不合规的构建直接拦住。
一、先想清楚:哪些能自动检查,哪些要人判断
先把最基础的问题想明白。
| 类型 | 例子 | 能不能自动检查 |
|---|---|---|
| 格式问题 | 权限有没有声明 | 能 |
| 一致性问题 | 隐私政策和实际对不对得上 | 能 |
| 内容问题 | 用途说明合不合理 | 要人判断 |
| 体验问题 | 权限弹窗时机好不好 | 要人判断 |
机器能查的:格式、一致性、有没有字段。
人要判断的:内容合不合理、体验好不好。
二、Release Gate 检查什么
发布前自动检查(Release Gate)要查哪些:
| 检查项 | 做什么 |
|---|---|
| 权限声明 | 扫描 module.json5,看有没有敏感权限 |
| 依赖版本 | 扫描 oh-package.json5,看版本有没有上限 |
| 第三方 SDK | 扫描依赖树,生成 SDK BOM |
| 隐私政策版本 | 看政策版本和当前功能对不对得上 |
| SDK 初始化时机 | 检查有没有在 onCreate 里初始化 SDK |
| 签名和 Profile | 检查 Release Profile 配置 |
| Debug 配置 | 检查有没有 Debug 代码进 Release 包 |
这段代码解决什么问题:发布前自动检查脚本。
文件:scripts/release-check.js
用途:CI 合规检查
接入位置:发布流程
constfs=require('fs');// 检查权限声明functioncheckPermissions(){constmoduleConfig=JSON.parse(fs.readFileSync('module.json5'));constpermissions=moduleConfig.requestPermissions||[];constsensitivePerms=permissions.filter(p=>p.name.includes('LOCATION')||p.name.includes('CONTACTS'));if(sensitivePerms.length>0&&!sensitivePerms.every(p=>p.reason)){console.error('错误:敏感权限缺少用途说明');returnfalse;}returntrue;}// 检查 SDK 初始化时机functioncheckSDKInit(){constabilityFile=fs.readFileSync('entry/src/main/ets/entryability/EntryAbility.ets','utf8');if(abilityFile.includes('onCreate')&&abilityFile.includes('initSDK')){console.warn('警告:onCreate 中可能存在 SDK 初始化');}}三、CI 闸门怎么设
把这些检查放到 CI 里。构建的时候自动跑,不通过就不让发布。
| 阶段 | 做什么 |
|---|---|
| 代码提交 | 跑基础检查 |
| 构建 Release 包 | 跑完整合规检查 |
| 提交审核前 | 人工确认 + 机器检查报告 |
四、几个容易踩的坑
第一个坑:发布前一天才人工检查。经常漏,经常忘。
第二个坑:开发环境配置进入 Release。Debug 代码忘了删。
第三个坑:权限已删除但隐私政策还写着。政策和代码不同步。
第四个坑:SDK 升级没人触发合规复核。升级了,政策没更新。
第五个坑:脚本只检查"有没有字段"不检查内容是否一致。格式对了,内容错了。
第六个坑:CI 通过就认为一定能过审核。机器检查是基础,人判断还是要的。
这次做工程收口最大的体会是:合规不是靠人记,是靠流程和工具。
真正做的时候,最容易忽略的不是怎么写检查规则,而是怎么把检查变成流程的一部分。让不合规的代码进不了发布包,比靠人去查靠谱得多。