【Android】Android签名解析

文章目录


前言

目前项目上需要给手机端apk签名,出于上架的需要,出现一些问题,顺手整理总结Android签名相关的知识。

在Android平台上,有两种主要的签名方案:V1方案和V2方案。V1方案是较早引入的,它通过给APK的各个部分分别签名,并将签名信息存储在META-INF目录中。V2方案则是Android 7.0(Nougat)中引入的,它在整个APK文件上进行签名,而不是单独对各个部分签名,这可以提供更快的验证速度,并且支持更多的优化。

在开始签名APK之前,开发者需要准备一个签名密钥。签名密钥通常包含在一个称为密钥库(keystore)的文件中,这个文件以 .keystore 或 .jks (Java密钥库)为扩展名。生成密钥库时,开发者需要指定密钥库的密码、密钥别名以及密钥的密码。

一、什么是JKS?

‌JKS签名‌(Java KeyStore签名)是一种在Android开发中常用的签名方式,主要用于对APK文件进行数字签名,以确保APK的完整性和安全性。JKS是Java KeyStore的缩写,是一种存储密钥和证书的二进制文件,常用于Java平台上对应用程序进行签名‌

生成JKS签名文件

android studio创建

在 Build >> generate Signed bundle or apk >> create new >> 根据引导创建即可

命令行创建

在Android系统中使用openssl工具从platform.pem生成platform.p12,并设置别名和密码,最后通过keytool将platform.p12导入为platform.jks,全程涉及密钥转换与安全管理。

  1. 生成platform.pem
java 复制代码
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem
  1. 生成platform.p12文件,并设置别名(eric)和密码(123456)
java 复制代码
openssl pkcs12 -export -in platform.x509.pem -out platform.p12 -inkey platform.pem -password pass:123456 -name eric
  1. 生成platform.jks文件 (密码:123456)
java 复制代码
keytool -importkeystore -deststorepass 123123 -destkeystore ./platform.jks -srckeystore ./platform.p12 -srcstoretype PKCS12 -srcstorepass 123456

配置签名

gradle文件配置签名

傻瓜式配置,但是明文显示不安全

java 复制代码
        release {
            keyAlias '1234'
            keyPassword '1234'
            storeFile file("../app/doc/jks.jks")
            storePassword '1234'
            v1SigningEnabled true
            v2SigningEnabled true
            println("sign file = " + storeFile)
        }

引用签名信息

java 复制代码
        debug {
            minifyEnabled true
            signingConfig signingConfigs.release
        }

命令行手动签名

推荐使用命令行签名,使用jarSigner签名工具或apkSigner签名工具来手动签名

二、jarSigner签名

简介

jarsigner 是 Java Development Kit (JDK) 提供的一个用于对 JAR 文件进行签名和验证的命令行工具。它主要通过使用密钥库(keystore)和别名(alias)来识别私钥。

签名

jarsigner -verbose -keystore my-release-key.jks -storepass your-keystore-password -keypass your-key-password -signedjar output.apk original.apk my-key-alias

命令详细参数介绍:

java 复制代码
-verbose :显示详细信息。
-sigalg SHA1withRSA :指定签名算法为SHA1withRSA。
-digestalg SHA1 :指定摘要算法为SHA1。
-keystore my-release-key.keystore :指定密钥库文件路径。
-output.apk :签名后的apk
-original.apk :要签名的APK文件。
-my-key-alias :指定密钥库中的密钥别名。

验证签名是否成功

jarsigner -verify -verbose -certs '***.apk'

V1签名问题

安装报错:Failure INSTALL_PARSE_FAILED_NO_CERTIFICATES: Scanning Failed.: No signature found in package of version 2 or newer for package com.lion.lionlink

jarsigner只能签名V1的包,导致android11以上的无法安装,推荐使用apkSigner签名。

三、apkSigner签名

简介

apkSigner 是 Android 开发中用于签名 APK 文件的工具,它属于 Android SDK build-tools 的一部分。自从 Android 7.0 (API 级别 24) 引入了 V2 签名方案后,apksigner 成为了官方推荐的签名工具,用以替换旧的 jarsigner 工具。apksigner 支持 V1、V2、V3 和 V4 签名方案,提供了更多的灵活性和安全性。

签名

apksigner sign --ks my-release-key.keystore --ks-key-alias my-key-alias --ks-pass pass:password --key-pass pass:password --out signed.apk my-application.apk

命令详细参数介绍:

java 复制代码
--ks :指定密钥库文件。
--ks-key-alias :指定密钥库中的密钥别名。
--ks-pass :指定密钥库的密码。
--key-pass :指定密钥对的密码(与密钥库密码不同的情况)。
--out :指定输出的签名后的APK文件。
--my-application.apk :要签名的APK文件。

验证签名是否成功

-certs 参数会输出证书链的信息,这有助于开发者了解签名证书的相关细节,例如证书的发行者和有效期。开发者应确保这些信息与预期相符,以防止证书伪造或滥用。

验证结果打印签名的相关信息

apksigner verify --print-certs '******_V2.3.3.apk'

验证结果如下:

java 复制代码
Signer #1 certificate DN: C=cn, ST=jiangsu,*****
Signer #1 certificate SHA-256 digest: fc6af0873dd433c830e0*****
Signer #1 certificate SHA-1 digest: b85fdb5a0ffb5cc*****
Signer #1 certificate MD5 digest: a521361d2a*****

四、适配API等级30

通过上述的打包、重签名的过程中,如果API Level >= 30的情况下,使用adb命令来安装apk包,就会出现如下报错:

Failure -124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary

官网资料建议

1、先进行zipalign对齐

java 复制代码
cd /Users/xxx_ios/Library/Android/sdk/build-tools/33.0.0

// 加固apk文件  会生成一个新的apk文件 的路径
./zipalign -p -f -v 4 /原apk文件路径/20240221175241.apk  /Users/新apk文件路径/.apk

1 ZIPalign工具的作用和重要性

ZIPalign是一个专门用于对APK文件进行优化的工具,它确保所有的非代码文件(如图片、音频文件等资源文件)都按照对齐值进行对齐。这个对齐值通常是4字节(4字节对齐)。ZIPalign的使用在Android应用发布流程中非常关键,因为它不仅优化了应用的性能,还减少了应用占用的内存大小。

对齐操作的实质是修改APK文件中的资源文件偏移量,以便它们从文件的4字节边界开始。这一改动使得Android系统在访问这些文件时更加高效,因为它可以直接从内存地址读取这些数据,而无需进行额外的字节拷贝操作。这种优化对内存使用和运行性能有显著的提升。

2 ZIPalign与APK性能优化的关系

应用性能优化是一个涉及多个方面的复杂过程,而ZIPalign工具是其中不可或缺的一个环节。正确使用ZIPalign可以在应用运行时减少内存的使用,提高应用的启动速度和运行效率。对齐后的APK文件在安装时会被Android系统自动识别,并利用优化过的文件结构进行加载。

ZIPalign的使用有助于减少设备的CPU负载,因为文件访问变得更为高效。此外,正确的对齐还有助于降低电量消耗,因为不需要频繁地执行读写操作。因此,使用ZIPalign不仅对用户体验有直接的正面影响,也对设备的能耗管理有间接的益处。

2、使用apkSigner签名

五、参考链接

相关推荐
xcl09257 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
吴声子夜歌7 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
小小猪的春天7 小时前
Java 手写第一个 MCP Server:Spring AI MCP 半小时跑通
java·人工智能·spring boot·ai编程
find1star7 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
今天AI了吗8 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
许彰午8 小时前
27-AuthService登录链路
java·低代码·架构
泡海椒8 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
Rain的Java大神之路10 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
自动化监测Learner10 小时前
Navicat Premium 17 中文版安装教程(2026最新版)
java·linux·数据库
那个松鼠很眼熟w10 小时前
4.Spring-Ai入门案例
java·人工智能·spring