如何对自己开发的系统级APK进行签名

Android APK签名是确保APK完整性和来源可信的重要机制。签名过程使用数字证书对APK进行签名,验证时使用证书中的公钥进行验证。

Android系统在安装或者更新APK时会检查签名,如果签名不一致则不允许更新,系统应用还会检查签名是否与预置的签名一致。

对于系统应用,签名尤为重要,因为系统应用通常使用平台密钥(platform key)签名,以确保其具有系统权限。在替换系统应用时,必须使用相同的密钥进行签名,否则系统会检测到签名不匹配而拒绝加载。

签名的密钥和证书

  • 开发者使用私钥对APK进行签名,公钥包含在证书中并打包在APK内。
  • 系统在验证时使用证书中的公钥验证签名。
  • 对于系统应用,平台密钥(platform key)是用于签名系统应用的密钥,通常由设备制造商或系统集成商持有。

签名的工具

  • 使用apksigner签名(官方推荐)

系统验证的基本步骤

  1. 提取APK中的证书
  2. 验证证书链的有效性(证书链结构:应用证书(叶证书) -> 中间证书(可能多个) -> 根证书(CA证书))
  3. 用公钥解密签名得到摘要
  4. 重新计算APK的摘要
  5. 比较两个摘要是否一致

假设我们有一个AndroidStudio开发的Camera APK(camera2.apk)是一个系统级的APK,是以预安装的方式集成到Android系统镜像的。现在想单独调试这个应用程序,即通过替换.apk的方式而不是重新打包系统镜像的方式更新camera2到设备。接下来我们以这个具体例子来说明

对一个apk进行系统签名的步骤:

1.AndroidStudio中编译camera2源码,生成camera2.apk

2.准备系统签名操作的环境

bash 复制代码
#因为apksigner是aosp源码构建时生成的工具,所以我们需要有一套构建目标镜像的aosp源代码
$cd ~/android15/
$source build/envsetup.sh
$lunch <vendor>_<target>_<userdebug>
#如果aosp源代码还没编译过,需要先生成签名工具。通常在aosp/out/host/linux-x86/bin/apksigner
$make apksigner
#创建一个目录用于放签名用的密钥和签名的输入输出文件。平台密钥文件在aosp源代码构建工具目录里
$mkdir signature_apk
$cp build/make/target/product/security/platform.pk8 signature_apk
$cp build/make/target/product/security/platform.x509.pem signature_apk
$cp ?/camera2.apk signature_apk #将camera2.apk拿过来

3.进行签名操作

bash 复制代码
#进行签名操作
$apksigner sign --key platform.pk8 --cert platform.x509.pem --out camera2-signed.apk camera2.apk

注意:apksigner签名命令中的--out用于指定签名后的apk文件(即签名操作输出文件)存放位置,需要在(--in,这里省略了)输入文件的前。如果没有--out指定输出,将原地覆盖输入文件(即签名操作输入输出文件是同名)

apksigner工具是AOSP系统构建时预先生成的一个工具,通常在out/host/linux-x86/bin/apksigner这个位置。平台密钥相关文件在AOSP源代码的构建工具路径下边(build/make/target/product/security/)

对一个签名后的apk进行验证

如果是调试使用的apk签名后想验证下方法有很多,最简单的是安装到设备。此外,Android15源码构建时还有很多工具用于调试使用,例如aapt2 dump badging camera2.apk, apksigner verify --verbose camera2.apk

相关推荐
码农coding13 小时前
android12 点击桌面应用图标启动Activity流程
android
johnsong13 小时前
深度拆解:150M循环模型如何用循环推理击败大Transformer
android·深度学习·transformer
CedarQR14 小时前
云卓 G20 遥控器 Android 开发实录:从 USB 设备到读取摇杆/按键通道值
android·linux·无人机
pengyu15 小时前
【Kotlin 协程修仙录 · 炼虚境 · 初阶】 | 虚空造物:Channel 基础与协程间通信的管道艺术
android·前端·kotlin
小强闯江湖15 小时前
ViewCompose:让原生 Android View 进入声明式时代
android·开源·kotlin
摇滚侠17 小时前
《SpringBoot 3:入门与应用实战》第 6 章 Spring Boot 最佳实践 阅读笔记 12
android·spring boot·笔记
mmsx18 小时前
Android 宠物健康服务平台实战:从架构设计到主题换肤完整解析(源码和文档)
android·架构·sqlite·app·源码·宠物
、如果18 小时前
ima Skills 自进化实战:三层结构、反馈与版本验证
android·人工智能·ai编程
hunterandroid18 小时前
自定义 View 绘制与触摸冲突:从滑动卡顿到事件分发闭环
android·前端
weixin_4038101318 小时前
安卓自动化脚本 HID 硬件选购指南:蓝牙HID与OTG HID区别、成本与搭建教程
android·运维·自动化·hid·安卓自动化脚本·安卓中控