---
title: "Android 应用签名与密钥管理"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/android-app-signing-key-management/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/03-软件工程与质量保障/CI-CD与质量保障/CI-CD工具链/安卓签名相关.md"
content_hash: 7c1a7c01ab517adf28c6e8af2ad6169891e46593a1c6d24a63cc210ed1c6f25a
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# Android 应用签名与密钥管理

> **note · 通用化说明**
> 本文已移除真实工程路径、别名、口令和内部发布信息。示例中的变量均为占位符。

## 签名解决什么问题

Android 要求 APK 在安装或更新前经过签名。签名用于确认更新包与已安装应用属于同一签名身份，并参与系统权限、应用更新和商店发布流程。签名不能证明应用没有漏洞，也不能替代代码与依赖安全审查。

## 基本流程

对 APK 的典型顺序是：

1. 构建未签名 APK。
2. 使用 `zipalign` 对齐；签名后再修改 APK 会使签名失效。
3. 使用 `apksigner` 签名。
4. 使用 `apksigner verify` 验证。
5. 在隔离环境安装并执行发布前测试。

```powershell
$env:ANDROID_KEYSTORE = 'C:\secure\release.jks'
$env:ANDROID_KEY_ALIAS = 'release-key'

zipalign -p -f 4 app-unsigned.apk app-aligned.apk
apksigner sign --ks $env:ANDROID_KEYSTORE --ks-key-alias $env:ANDROID_KEY_ALIAS app-aligned.apk
apksigner verify --verbose --print-certs app-aligned.apk
```

不要把 `--ks-pass pass:...` 或 `--key-pass pass:...` 写入脚本、流水线或命令历史。让工具安全提示输入，或通过 CI 凭据存储以受控方式提供口令。

## AAB 与 Play App Signing

面向 Google Play 发布时通常上传 Android App Bundle。启用 Play App Signing 后应区分：

- **应用签名密钥**：用于签署用户最终安装的 APK，由 Play 管理时应按平台流程备份与恢复。
- **上传密钥**：用于验证上传者，可在受控流程中申请重置。

这两类密钥不应混用。其他应用商店或企业分发渠道可能采用不同托管与轮换机制，应分别记录。

## CI/CD 安全清单

- 签名文件不进入 Git，也不放在普通制品存储中。
- 使用专用发布 Agent，并限制可以触发签名任务的人员和分支。
- 凭据由 Jenkins Credentials、云密钥管理服务或硬件安全模块提供。
- 日志关闭命令回显，不上传包含秘密的环境转储。
- 发布产物保存摘要、证书指纹、构建提交、工具版本和验证结果。
- 对密钥备份、恢复、轮换和人员离职进行演练。

## 参考资料

- [Android Developers：apksigner](https://developer.android.com/tools/apksigner)
- [Android Developers：签署应用](https://developer.android.com/studio/publish/app-signing)
