如何对自己开发的系统级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

相关推荐
方白羽10 小时前
Android Gradle 缓存与文件目录深度解析
android·gradle·android studio
曲幽13 小时前
Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
android·termux·nohup·services·wake-lock
plainGeekDev14 小时前
单例模式 → object 声明
android·java·kotlin
程序员陆业聪14 小时前
读者点单·03|Compose 与传统 View 混用的 12 个真实坑
android
程序员陆业聪15 小时前
读者点单·02|Android 启动优化实战:Trace 抓取→Application 编排→冷启动全流程拆解
android
Coffeeee15 小时前
帮你快速理解AI Agent之我想招个Android实习生
android·人工智能·agent
恋猫de小郭16 小时前
苹果 AirPods 协议,Android 也可以使用完整版 AirPods 能力
android·前端·flutter
黄林晴16 小时前
告别无效重建:Gradle 9.6.0 解决 CI 构建缓存失效痛点告别无效重建:Gradle 9.6.0 解决 CI 建筑缓存失效痛点
android·gradle
张风捷特烈17 小时前
Flutter 类库大揭秘#01 | path_provider架构与设计
android·flutter
_阿南_1 天前
Android文件读写和分享总结
android