周五晚上提交审核,周一早上收到驳回通知。这些问题机器早就能发现,为什么要人肉查?

文章封面

前四篇我们解决了权限、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 合规检查
接入位置: 发布流程

const fs = require('fs');

// 检查权限声明
function checkPermissions() {
  const moduleConfig = JSON.parse(fs.readFileSync('module.json5'));
  const permissions = moduleConfig.requestPermissions || [];
  
  const sensitivePerms = permissions.filter(p => 
    p.name.includes('LOCATION') || p.name.includes('CONTACTS')
  );
  
  if (sensitivePerms.length > 0 && !sensitivePerms.every(p => p.reason)) {
    console.error('错误:敏感权限缺少用途说明');
    return false;
  }
  return true;
}

// 检查 SDK 初始化时机
function checkSDKInit() {
  const abilityFile = fs.readFileSync('entry/src/main/ets/entryability/EntryAbility.ets', 'utf8');
  if (abilityFile.includes('onCreate') && abilityFile.includes('initSDK')) {
    console.warn('警告:onCreate 中可能存在 SDK 初始化');
  }
}

CI闸门流程图

三、CI 闸门怎么设

把这些检查放到 CI 里。构建的时候自动跑,不通过就不让发布。

阶段做什么
代码提交跑基础检查
构建 Release 包跑完整合规检查
提交审核前人工确认 + 机器检查报告

四、几个容易踩的坑

第一个坑:发布前一天才人工检查。经常漏,经常忘。

第二个坑:开发环境配置进入 Release。Debug 代码忘了删。

第三个坑:权限已删除但隐私政策还写着。政策和代码不同步。

第四个坑:SDK 升级没人触发合规复核。升级了,政策没更新。

第五个坑:脚本只检查"有没有字段"不检查内容是否一致。格式对了,内容错了。

第六个坑:CI 通过就认为一定能过审核。机器检查是基础,人判断还是要的。

这次做工程收口最大的体会是:合规不是靠人记,是靠流程和工具。

真正做的时候,最容易忽略的不是怎么写检查规则,而是怎么把检查变成流程的一部分。让不合规的代码进不了发布包,比靠人去查靠谱得多。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐