分类建议:Android / 移动开发 / 信息安全标签建议:APK安全、上架自检、漏洞扫描、APK加固、安固云、独立开发者类型:实操清单(可收藏)(csdn-分享-加固后验收清单.md)
先说用途
这不是等保审计表,也不是银行级渗透报告模板。
它面向 个人开发者、外包交付、中小企业常规业务 App:在点「提交审核 / 发给客户」之前,用 30~90 分钟 把「裸奔问题」和「加固前该修什么」过一遍。
我自己的顺序固定是:
本地快检 → 云端扫描留报告 → 该改的改 → 再加固 → 加固后验收
前两轮本文讲;后两轮见系列下一篇《加固后怎么验收》。
使用说明(建议收藏这一节)
| 符号 | 含义 |
|---|---|
| ☐ | 未检查 |
| ✓ | 通过 |
| ✗ | 不通过,发版前必须处理 |
| △ | 已知风险,写进 release note 或后续迭代 |
四轮分别是什么:
| 轮次 | 耗时 | 做什么 | 工具 |
|---|---|---|---|
| 第 1 轮 | 10~15 分钟 | 包体 / 签名 / 权限 / Debug 开关 | 本机 |
| 第 2 轮 | 15~30 分钟 | 明文密钥、日志、网络、组件暴露 | jadx + grep |
| 第 3 轮 | 20~60 分钟 | 防护与漏洞扫描,留 PDF/HTML | 云端(如 安固云) |
| 第 4 轮 | 10~20 分钟 | 混淆规则、64K、加固兼容性预检 | 构建脚本 + 真机 |
原则:第 3 轮尽量在加固之前做。 加固只能抬高逆向成本,修不掉业务里的明文密钥和错误权限。
第 1 轮:包能不能上架(10~15 分钟)
1.1 签名与版本
| # | 检查项 | 怎么验 | 通过标准 |
|---|---|---|---|
| 1.1.1 | Release 用正式 keystore | 看 CI / 本地打包脚本 | 不是 debug.keystore |
| 1.1.2 | versionCode 递增 | 对比上一版 APK | 商店 / 渠道不接受回退 |
| 1.1.3 | versionName 与 changelog 一致 | 人工对照 | 客户 / 审核能对上 |
| 1.1.4 | 签名方案 | apksigner verify --verbose | 至少 V2;目标商店若要求 V3 则一并满足 |
| 1.1.5 | 包名与渠道登记一致 | 对比控制台 | 包名、签名指纹未变(除非刻意迁移) |
1.2 Debug / 测试残留
| # | 检查项 | 怎么验 | 通过标准 |
|---|---|---|---|
| 1.2.1 | android:debuggable | 解包看 Manifest 或 jadx | Release 为 false |
| 1.2.2 | 测试 Server / 开关 | 搜 staging、test、192.168 | 无硬编码内网地址进 Release |
| 1.2.3 | 调试入口 Activity | Manifest + jadx | 无「隐藏调试页」留在线上包 |
| 1.2.4 | BuildConfig.DEBUG 分支 | 代码检索 | 调试 Toast / 埋点 / 跳过校验 不应在 Release 生效 |
1.3 权限与隐私(粗筛)
| # | 检查项 | 怎么验 | 通过标准 |
|---|---|---|---|
| 1.3.1 | 权限是否最小化 | Manifest 清单 | 不申请用不到的敏感权限(如无关 App 要 READ_SMS) |
| 1.3.2 | 隐私政策链接 | App 内 + 商店页 | 收集个人信息时有 reachable 说明 |
| 1.3.3 | 备份策略 | android:allowBackup | 含本地敏感数据的 App 谨慎开全量备份 |
| 1.3.4 | 导出组件 | exported="true" 的 Activity/Service/Receiver | 每个都有业务必要性和权限保护 |
第 1 轮小结: 这一轮不过,后面扫再漂亮也别上架。
第 2 轮:裸奔代码快检(15~30 分钟)
用 jadx 打开 未加固的 Release APK(或 mapping 对齐的构建产物),配合简单 grep。
2.1 密钥与凭证
| # | 检查项 | 怎么验 | 通过标准 |
|---|---|---|---|
| 2.1.1 | API Key / Secret | 搜 key、secret、token、AKIA | 无明文长期密钥 |
| 2.1.2 | 对称密钥常量 | 搜 16/32 字节 hex、Base64 长串 | 业务加密钥不放 Java 常量 |
| 2.1.3 | 内嵌证书私钥 | assets / res / raw | 无私钥文件打进 APK |
| 2.1.4 | 本地数据库密码 | SQLite / Room 配置 | 非硬编码弱口令 |
| 2.1.5 | OAuth / 支付回调密钥 | 配置类、BuildConfig | 敏感项走服务端或 NDK + 服务端下发 |
2.2 日志与崩溃
| # | 检查项 | 怎么验 | 通过标准 |
|---|---|---|---|
| 2.2.1 | Log 级别 | logback / LogUtil 配置 | Release 非 DEBUG 洪泛 |
| 2.2.2 | 日志落盘 | 搜 mylogs、/sdcard/ 写文件 | 不默认把请求体、token 写文件 |
| 2.2.3 | 崩溃栈外泄 | 自定义 UncaughtHandler | 给用户看的错误信息不含内部路径 / SQL |
| 2.2.4 | WebView 调试 | setWebContentsDebuggingEnabled | Release 关闭 |
2.3 网络与存储
| # | 检查项 | 怎么验 | 通过标准 |
|---|---|---|---|
| 2.3.1 | 明文 HTTP | Manifest usesCleartextTraffic + 代码 URL | 无核心业务走 http(除非有明确例外并文档化) |
| 2.3.2 | 证书校验 | 自定义 TrustManager / HostnameVerifier | 无「信任所有证书」 |
| 2.3.3 | 敏感 SharedPreferences | MODE_PRIVATE + 是否加密 | token 等不明文存 SP |
| 2.3.4 | 外部存储 | 下载 / 缓存路径 | 敏感文件不进公有目录 |
2.4 组件与 Deep Link
| # | 检查项 | 怎么验 | 通过标准 |
|---|---|---|---|
| 2.4.1 | 导出 Activity 鉴权 | jadx + adb am start 试跳 | 不能无登录进敏感页 |
| 2.4.2 | Deep Link 参数 | Intent 处理逻辑 | 无 SQL 拼接、路径穿越 |
| 2.4.3 | FileProvider | paths 配置 | 不过度暴露根目录 |
第 2 轮小结: 这里查的是 加固替你做不了的事。DEX 加密挡不住「字符串还在业务 dex 里」——只是让别人多看几步。
第 3 轮:云端扫描留报告(20~60 分钟,建议加固前)
一个人扛发版时,第 2 轮容易漏项。我习惯在 安固云 补一轮 防护等级评估 或 漏洞扫描,主要是为了 报告可归档,不是替代自己看代码。
3.1 先登记包名,再上传已签名 APK
站点要求对已登记包名做评估 / 扫描 / 加固。我习惯:
- 「包名资产」里添加包名
- 「我的 APK」上传 已签名的 Release 包
- 选 防护等级 或 漏洞扫描 提交任务
服务器侧文件大约 48 小时 清理——发版窗口内够用。政企合同禁止上传第三方云的,跳过本轮,走内网方案。
3.2 两种扫描怎么选
| 类型 | 偏什么 | 我什么时候跑 |
|---|---|---|
| 防护等级评估 | 是否已有壳、对抗项、证书 / 壳识别等 | 想知道「现在裸奔程度」;或加固前后对比 |
| 漏洞扫描 | 应用层可改项、密钥 / URL / 接口专扫 | 交付前、大版本上线前 |
3.3 报告里我会重点看的字段
| # | 检查项 | 动作 |
|---|---|---|
| 3.3.1 | 综合建议 / 风险等级 | ✗ 的高危先修再加固 |
| 3.3.2 | 密钥 / 硬编码类命中 | 回到第 2 轮改代码,别指望加壳 |
| 3.3.3 | 组件 / 权限 / 网络安全项 | 能改 Manifest 或配置的当场改 |
| 3.3.4 | 加固 / 壳相关提示 | 若尚未加固,记下「加固后应改善」的项,留给下一篇验收 |
| 3.3.5 | 报告归档 | HTML 在线查看或 PDF 摘要存一份(外包交付尤其有用) |
3.4 扫描 vs 加固的顺序(重要)
推荐:登记包名 → 上传 Release APK → 扫描 → 修代码 → 再加固 → 加固后验收
不推荐:加固 → 扫描 → 发现密钥明文 → 再改代码 → 再加固(多一轮工)
扫描和加固在同一账号里做的好处是:加固前的裸奔报告 和 加固后的防护报告 可以对照,客户问「你们做没做安全处理」时有东西拿。
第 4 轮:加固与上架兼容性预检(10~20 分钟)
即使还没点「加固」,也建议先过一遍,减少加固后闪退返工。
| # | 检查项 | 怎么验 | 通过标准 |
|---|---|---|---|
| 4.1 | MultiDex / 64K | 冷启动 + 主流程 | 无 ClassNotFound |
| 4.2 | ProGuard / R8 规则 | Release 包跑全功能 | 反射类、JNI、数据类未误删 |
| 4.3 | 壳 Application 兼容 | 看 minSdk | 常见 minSdk=21 时,加固平台若要求兼容模式(如保证 Android 8.0+),提交前勾选 |
| 4.4 | Native SO 架构 | lib/ 目录 | 目标机型架构齐全(arm64-v8a 等) |
| 4.5 | 动态加载 / 插件 | 若有 | 文档化;加固后单独回归 |
| 4.6 | 真机 smoke | 至少 1 台日常机 | 安装、冷启动、登录 / 主链路 OK |
第 4 轮小结: 加固不是万能药。混淆配错、MultiDex 问题,加固只会放大排查难度。
可打印总表(收藏用)
复制到 Notion / 飞书即可当发版模板:
【APK 上架前安全自检 — 包名:________ 版本:________ 日期:________】
第 1 轮 包体与上架
☐ 正式 keystore ☐ debuggable=false ☐ versionCode 递增
☐ 权限最小化 ☐ 导出组件已复核 ☐ 隐私政策可达
第 2 轮 裸奔代码
☐ 无明文 API Key ☐ Release 日志收敛 ☐ 无信任所有证书
☐ token 不明文 SP ☐ 无测试环境 URL 残留
第 3 轮 云端扫描(加固前)
☐ 包名已登记 ☐ 防护/漏洞扫描已完成
☐ 高危项已修复 ☐ 报告已归档 PDF/HTML
第 4 轮 加固预检
☐ R8 规则 Release 全通过 ☐ 真机 smoke 通过
☐ 已确认 minSdk / 兼容模式 ☐ 准备同一 keystore 做本地重签
签字 / 备注:________________________________
我常用的最短路径(30 分钟档)
时间紧时我只做「最小必做集」:
- 第 1 轮 全做(15 分钟)
- 第 2 轮 只查密钥 + 日志 + 导出组件(10 分钟)
- 第 3 轮 漏洞扫描提交任务,边等边修明确问题(异步)
- 扫描报告无阻塞项后 → 普通版加固 → 本地重签 → 按下一篇做验收
站点入口:www.anguyun2026.cn/
边界(避免 checklist 变成迷信)
| 误区 | 实际情况 |
|---|---|
| 扫描通过 = 绝对安全 | 扫描是抽样与规则匹配,不能替代代码 review |
| 加固可以代替修密钥 | 不能;明文字符串仍在,只是更难找 |
| 清单打完就能上金融级 | 本文不覆盖 VMP、等保、渗透复测 |
| 任何 APK 都能上传公有云 | 合同禁上传的走内网或私有化 |
结语
上架前安全,我现在的固定口诀是:
先扫裸奔,再谈加壳;报告归档,加固验收分开做。
第 1~4 轮解决「包本身干不干净、该不该现在加固」;加固完成后,用系列用工具检测检测,参考上一篇文章 回答「钱花对了没有」。
试用扫描 + 加固:安固云 APK Guard
欢迎评论区补充:你们发版前 必查但本文没写 的一项是什么?我可以攒进 v2 清单。