【AOSP】构建发布版本:从生成发布密钥到系统级APK签名的完整实践

发布时间:2026/9/30 21:35:47

【AOSP】构建发布版本:从生成发布密钥到系统级APK签名的完整实践
1. 为什么需要替换AOSP默认测试密钥当你第一次编译AOSP系统时可能没注意到系统默认使用的是公开的测试密钥。这些密钥存放在/build/target/product/security/目录下包括testkey、platform、shared和media四种类型。README文件里明确警告These test keys are used in development only and should NEVER be used to sign packages in publicly released images。我遇到过真实案例某厂商直接使用测试密钥发布设备结果攻击者用相同密钥签名恶意应用轻松替换了系统预装的Settings应用导致大规模数据泄露。这就是为什么所有商业设备都必须替换这些密钥。四种密钥的区别其实很有意思testkey默认签名相当于游客模式platform系统核心功能专用拥有最高权限shared联系人/家庭组共享数据使用media多媒体框架相关组件使用2. 生成自定义发布密钥2.1 密钥生成实操在AOSP根目录执行以下命令记得替换subject参数subject/CCN/STShanghai/LShanghai/OYourCompany/OUDev/CNAndroid/emailAddressdevyourcompany.com mkdir -p ~/.android-certs for x in releasekey platform shared media; do \ ./development/tools/make_key ~/.android-certs/$x $subject; \ done这里有个坑make_key会交互式询问密码直接回车表示无密码。但在生产环境我强烈建议设置强密码并配合硬件加密模块HSM保管私钥。2.2 密钥参数解析第二个参数中的DNDistinguished Name字段很有讲究/C国家代码如CN表示中国/ST省份拼音或英文/L城市建议用英文/O公司全称重要法律依据/OU部门名称如RD/Marketing/CN通用名建议用产品线名称曾经有厂商把CN设成Android结果OTA升级时与第三方应用产生签名冲突。建议采用公司名产品线的命名方式。3. 修改系统签名配置3.1 关键配置修改点设备mk文件如device/xxx/xxx.mkPRODUCT_DEFAULT_DEV_CERTIFICATE : vendor/yourcompany/security/releasekeyMakefile全局配置build/core/Makefileifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),vendor/yourcompany/security/releasekey) BUILD_KEYS : release-keys endif密钥策略文件system/sepolicy/private/keys.confENG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem USER : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem USERDEBUG : $DEFAULT_SYSTEM_DEV_CERTIFICATE/releasekey.x509.pem3.2 验证签名是否生效编译后检查以下位置adb shell getprop ro.build.tags # 应显示release-keys adb shell grep BUILD_SECURE /system/etc/build.prop # 应显示true遇到过有开发者修改配置后签名未生效最后发现是out目录未清理导致缓存问题。建议每次修改后执行make clean make -j164. 系统级APK签名实战4.1 手动签名APK使用AOSP内置工具签名java -jar out/host/linux-x86/framework/signapk.jar \ vendor/yourcompany/security/platform.x509.pem \ vendor/yourcompany/security/platform.pk8 \ input.apk output-signed.apk4.2 自动化签名流程在Android.mk中添加LOCAL_CERTIFICATE : platform # 或releasekey/shared/media如果是Android.bpandroid_app { certificate: platform, ... }4.3 生成Keystore文件方便应用开发团队使用系统签名openssl pkcs8 -inform DER -nocrypt \ -in platform.pk8 -out platform.pem openssl pkcs12 -export \ -in platform.x509.pem -inkey platform.pem \ -out platform.p12 -name platform -password pass:android keytool -importkeystore \ -deststorepass android -destkeystore platform.jks \ -srckeystore platform.p12 -srcstoretype PKCS12 \ -srcstorepass android5. 高级技巧与避坑指南5.1 签名验证强化在BoardConfig.mk中添加BOARD_AVB_ENABLE : true BOARD_AVB_ALGORITHM : SHA256_RSA40965.2 常见问题解决问题1签名后APK安装失败解决检查APK的AndroidManifest.xml是否声明了sharedUserIdmanifest xmlns:androidhttp://schemas.android.com/apk/res/android android:sharedUserIdandroid.uid.system问题2系统服务权限拒绝解决在sepolicy中添加对应权限allow system_app your_service:service_manager find;5.3 密钥轮换策略Android 9支持APK签名方案v3的密钥轮换。在signapk命令中添加--rotation-min-sdk-version 28 \ --previous-signer \ vendor/yourcompany/security/old_key.x509.pem \ vendor/yourcompany/security/old_key.pk86. 发布版本签名全流程6.1 完整构建命令make -j16 dist ./build/tools/releasetools/sign_target_files_apks \ -o --default_key_mappings ~/.android-certs \ out/dist/*-target_files-*.zip signed-target_files.zip ./build/tools/releasetools/ota_from_target_files \ -k ~/.android-certs/releasekey \ signed-target_files.zip ota_update.zip6.2 安全建议将私钥存储在独立的安全服务器构建服务器与密钥服务器间使用HSM加密通信每次发布后更新密钥备份实施双人复核机制记得某次凌晨3点紧急发布时因为密钥管理员休假导致整个团队干等8小时。后来我们实施了密钥分片保管方案避免单点故障。7. 验证与调试7.1 签名验证命令# 验证APK签名 apksigner verify -v --print-certs app.apk # 验证系统镜像 avbtool verify_image --image vbmeta.img --key releasekey_public.pem7.2 调试技巧在init.rc中添加on property:ro.boot.verifiedbootstateorange setprop ro.debuggable 1 setprop ro.adb.secure 0这样即使签名验证失败orange状态也能保留调试权限。当然生产环境记得关闭整个过程就像给系统打造一把独一无二的数字钥匙既要保证安全性又要考虑实际开发效率。建议首次实施时预留完整两天时间毕竟密钥一旦投入使用后续变更成本很高。

相关新闻

汽车摄像头SerDes设计:DS90UB933-Q1同轴电缆应用与信号完整性指南

汽车摄像头SerDes设计:DS90UB933-Q1同轴电缆应用与信号完整性指南

2026/9/30 5:10:44

1. 项目概述:为什么汽车摄像头需要SerDes? 如果你拆开过近几年的汽车,尤其是那些带有360度环视、高级驾驶辅助系统(ADAS)或者流媒体后视镜的车型,你可能会发现一个有趣的现象:从前保险杠到车身控…

(电赛)信号处理类报告撰写实战:从框架搭建到得分要点精讲

(电赛)信号处理类报告撰写实战:从框架搭建到得分要点精讲

2026/9/30 6:13:49

1. 信号处理类电赛报告的核心价值参加过电赛的同学都知道,报告在评分中往往占到30%-50%的比重。我当年第一次参赛时,硬件做得不错,但因为报告写得像实验记录本,最终与奖项擦肩而过。信号处理类题目尤其特殊——评委可能无法现场验…

Awesome Rust Streaming项目贡献指南:如何为这个社区列表添加你的发现

Awesome Rust Streaming项目贡献指南:如何为这个社区列表添加你的发现

2026/9/26 17:59:48

Awesome Rust Streaming项目贡献指南:如何为这个社区列表添加你的发现 【免费下载链接】awesome-rust-streaming A community curated list of Rust Language streamers 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-rust-streaming Awesome Rust S…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/29 22:00:59

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/30 20:35:35

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/30 20:35:38

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/30 20:35:36

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/30 20:35:33

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/30 8:20:32

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/30 20:35:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/30 20:35:34

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/30 20:35:36

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…