Android开发 给APK生成系统签名

给APK生成系统签名(signapk.jar)

环境准备

编译过AOSP源码,并且执行过source build/envsetup.sh命令

拷贝库文件libconscrypt_openjdk_jni.so到aosp根目录下

machine:~/aosp$ cp prebuilts/sdk/tools/linux/lib64/libconscrypt_openjdk_jni.so  .

在aosp根目录下,通过系统签名文件给apk进行系统签名

**将需要签名的apk放在aosp根目录下,在aosp根目录下执行以下命令:

machine:~/aosp$
java -Xmx2048m -Djava.library.path="out/host/linux-x86/lib64" \
    -jar out/host/linux-x86/framework/signapk.jar \
    build/target/product/security/platform.x509.pem \
    build/target/product/security/platform.pk8 \
    app-debug.apk app-debug-signed.apk

-Djava.library.path 用于指定本地库的路径, 本地库通常是使用Java Native Interface (JNI) 来调用本地代码的库文件。
这里主要是用到libconscrypt_openjdk_jni.so这个库。

命令执行成功后,会在aosp根目录下生成app-debug-signed.apk 就是签名后的apk。

查看APK的签名信息

machine:~/aosp$
keytool -printcert -jarfile app-debug-signed.apk

四种key介绍

可以看到在Android系统中,有四种常见的签名密钥,分别是testkey、platform、shared和media。每个密钥用于签署不同类型的应用或组件,具有不同的权限和用途。

  • testkey:
    类型: 开发和测试使用。
    特点: 通常用于开发和测试阶段,不是用于生产环境。应用使用 testkey 签名时,系统会将其标记为测试版本,通常会有一些限制,例如无法安装在未解锁的设备上。
  • platform:
    类型: Android平台的系统应用。
    特点: 用于签署Android平台的系统应用,这些应用是由设备制造商提供的预装应用。这种签名允许应用访问系统的一些敏感权限和功能,而这些权限通常不允许其他应用获得。
  • shared:
    类型: 平台的共享系统库。
    特点: 主要用于签署Android平台上的共享系统库,这些库可以由多个应用共享。共享库可以提供一组通用的功能,供系统上的多个应用使用。这使得库可以更好地重用,减少重复的代码。
  • media:
    类型: 用于签署媒体库。
    特点: 主要用于签署Android平台上的媒体库,这些库提供音频和视频处理功能。这样的签名允许库访问系统上的音频和视频资源,这对于多媒体应用和功能非常重要。

应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定哪个key签名,未指定的默认用testkey。Android.bp中为:certificate: “platform”。

在aosp build/target/product/security目录下查看key:

在这里插入图片描述

.pk8代表私钥,.x509.pem公钥,它们都是成对出现。

使用脚本工具给APK生成系统签名(signapk.jar)

将签名资源放在同一个文件夹下

新建systemsign文件夹,放入以下资源:

在这里插入图片描述

需要进行签名的APK:Fragment.apk

签名密钥:platform.pk8和platform.x509.pem

脚本文件:sign.bat

签名工具:signapk.jar

编写脚本文件:sign.bat

在这里插入图片描述

批处理使用::注释

pause
::给APK生成系统签名  
java -jar signapk.jar *.x509.pem *.pk8 *.apk signed.apk
pause
::查看APK的签名信息
keytool -printcert -jarfile signed.apk
pause

双击执行脚本文件,生成signed.apk即签名APK

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

给APK生成系统签名(apksigner.jar)

在aosp根目录下,通过系统签名文件给apk进行系统签名

将需要签名的apk放在aosp根目录下,在在aosp根目录下执行以下命令:

apksigner sign --key build/target/product/security/platform.pk8 --cert build/target/product/security/platform.x509.pem app-debug.apk

命令执行成功后,会在aosp根目录下重新生成app-debug.apk 就是签名后的apk。

查看APK的签名信息

在aosp根目录下执行以下命令:

apksigner verify -print-certs app-debug.apk

使用signapk.jar签名和apksigner.jar签名的区别

signapk.jar 是早期的 Android 签名工具,而 apksigner.jar 是更新的版本,它们都用于给 Android 应用程序(APK)文件签名。
主要区别如下:

  • signapk.jar 是基于 JAR 文件的签名,而 apksigner.jar 是基于 APK 文件的签名。

  • apksigner.jar 支持对 APK 文件进行验证签名操作,而 signapk.jar 不支持。

  • apksigner.jar 是 Android SDK Build-Tools 的一部分,而 signapk.jar 随 SDK 一起提供。

  • apksigner.jar 支持 V2 和 V3 签名方案,而 signapk.jar 仅支持 V1 签名方案。

  • apksigner.jar 是用 Java 编写的,而 signapk.jar 是用 Python 编写的。

推荐使用 apksigner.jar 进行 APK 签名,因为它是更现代、更强大的工具,并且是 Android SDK Build-Tools 的一部分,方便管理和更新。

  • 35
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿陌名!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值