{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/android-app-signing-key-management/",
  "atlas": "https://www.pystone.net/?node=android-app-signing-key-management#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/android-app-signing-key-management.md",
  "context": "https://www.pystone.net/notes/android-app-signing-key-management.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:android-app-signing-key-management",
  "slug": "android-app-signing-key-management",
  "title": "Android 应用签名与密钥管理",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "Android 应用签名与密钥管理",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "7c1a7c01ab517adf28c6e8af2ad6169891e46593a1c6d24a63cc210ed1c6f25a",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "Android 应用签名与密钥管理",
      "anchor": "android-应用签名与密钥管理",
      "citation": "https://www.pystone.net/notes/android-app-signing-key-management/#android-%E5%BA%94%E7%94%A8%E7%AD%BE%E5%90%8D%E4%B8%8E%E5%AF%86%E9%92%A5%E7%AE%A1%E7%90%86"
    },
    {
      "depth": 2,
      "text": "签名解决什么问题",
      "anchor": "签名解决什么问题",
      "citation": "https://www.pystone.net/notes/android-app-signing-key-management/#%E7%AD%BE%E5%90%8D%E8%A7%A3%E5%86%B3%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98"
    },
    {
      "depth": 2,
      "text": "基本流程",
      "anchor": "基本流程",
      "citation": "https://www.pystone.net/notes/android-app-signing-key-management/#%E5%9F%BA%E6%9C%AC%E6%B5%81%E7%A8%8B"
    },
    {
      "depth": 2,
      "text": "AAB 与 Play App Signing",
      "anchor": "aab-与-play-app-signing",
      "citation": "https://www.pystone.net/notes/android-app-signing-key-management/#aab-%E4%B8%8E-play-app-signing"
    },
    {
      "depth": 2,
      "text": "CI/CD 安全清单",
      "anchor": "cicd-安全清单",
      "citation": "https://www.pystone.net/notes/android-app-signing-key-management/#cicd-%E5%AE%89%E5%85%A8%E6%B8%85%E5%8D%95"
    },
    {
      "depth": 2,
      "text": "参考资料",
      "anchor": "参考资料",
      "citation": "https://www.pystone.net/notes/android-app-signing-key-management/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:software-engineering-and-quality",
      "title": "软件工程与质量保障",
      "url": "https://www.pystone.net/notes/software-engineering-and-quality/",
      "atlas": "https://www.pystone.net/?node=software-engineering-and-quality#knowledge-atlas",
      "label": "软件工程与质量保障",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "CI-CD与质量保障/CI-CD工具链中的“安卓签名相关”导航项",
      "citation": "https://www.pystone.net/notes/software-engineering-and-quality/#ci-cd%E4%B8%8E%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9Cci-cd%E5%B7%A5%E5%85%B7%E9%93%BE"
    }
  ],
  "contentMarkdown": "# Android 应用签名与密钥管理\n\n> [!note] 通用化说明\n> 本文已移除真实工程路径、别名、口令和内部发布信息。示例中的变量均为占位符。\n\n## 签名解决什么问题\n\nAndroid 要求 APK 在安装或更新前经过签名。签名用于确认更新包与已安装应用属于同一签名身份，并参与系统权限、应用更新和商店发布流程。签名不能证明应用没有漏洞，也不能替代代码与依赖安全审查。\n\n## 基本流程\n\n对 APK 的典型顺序是：\n\n1. 构建未签名 APK。\n2. 使用 `zipalign` 对齐；签名后再修改 APK 会使签名失效。\n3. 使用 `apksigner` 签名。\n4. 使用 `apksigner verify` 验证。\n5. 在隔离环境安装并执行发布前测试。\n\n```powershell\n$env:ANDROID_KEYSTORE = 'C:\\secure\\release.jks'\n$env:ANDROID_KEY_ALIAS = 'release-key'\n\nzipalign -p -f 4 app-unsigned.apk app-aligned.apk\napksigner sign --ks $env:ANDROID_KEYSTORE --ks-key-alias $env:ANDROID_KEY_ALIAS app-aligned.apk\napksigner verify --verbose --print-certs app-aligned.apk\n```\n\n不要把 `--ks-pass pass:...` 或 `--key-pass pass:...` 写入脚本、流水线或命令历史。让工具安全提示输入，或通过 CI 凭据存储以受控方式提供口令。\n\n## AAB 与 Play App Signing\n\n面向 Google Play 发布时通常上传 Android App Bundle。启用 Play App Signing 后应区分：\n\n- **应用签名密钥**：用于签署用户最终安装的 APK，由 Play 管理时应按平台流程备份与恢复。\n- **上传密钥**：用于验证上传者，可在受控流程中申请重置。\n\n这两类密钥不应混用。其他应用商店或企业分发渠道可能采用不同托管与轮换机制，应分别记录。\n\n## CI/CD 安全清单\n\n- 签名文件不进入 Git，也不放在普通制品存储中。\n- 使用专用发布 Agent，并限制可以触发签名任务的人员和分支。\n- 凭据由 Jenkins Credentials、云密钥管理服务或硬件安全模块提供。\n- 日志关闭命令回显，不上传包含秘密的环境转储。\n- 发布产物保存摘要、证书指纹、构建提交、工具版本和验证结果。\n- 对密钥备份、恢复、轮换和人员离职进行演练。\n\n## 参考资料\n\n- [Android Developers：apksigner](https://developer.android.com/tools/apksigner)\n- [Android Developers：签署应用](https://developer.android.com/studio/publish/app-signing)\n"
}
