Android签名V1V2,签名对齐

JDK签名,需要切换到jdk\bin目录,签名之后只有V1签名

jarsigner -verbose -keystore 签名文件 -signedjar 输出文件 输入文件 签名文件别名

例:jarsigner -verbose -keystore appkey.keystore -signedjar app_signed.apk app.apk appkeykey
例:jarsigner -digestalg SHA1 -sigalg MD5withRSA -verbose -keystore appkey.keystore -signedjar app_signed.apk app.apk appkeykey


Android SDK签名,需要切换到sdk\build-tools\25.+\lib目录,签名之后有V1V2签名

java -jar apksigner.jar sign  --ks 签名文件  --ks-key-alias 签名文件别名  --ks-pass pass:KeyStore密码  --key-pass pass:生成jks时指定alias对应的密码  --out 输出文件  需要签名的apk  

例:java -jar apksigner.jar sign  --ks appkey.keystore  --ks-key-alias appkeyalias  --ks-pass pass:password  --key-pass pass:aliaspassword  --out app_signed.apk  app.apk    



检查apk是否已经签名,需要切换到sdk\build-tools\25.+\lib目录

例:java -jar apksigner.jar verify -v app_signed.apk



使用Android SDK中的zipalign - 对齐操作 - 优化 

1、需要切换到sdk\build-tools\25.+\lib目录,(这里如果没有这个文件夹,那说明你的sdk需要更新了)
2、执行命令:zipalign -v 4 [待优化.apk路径] [优化后.apk路径]

zipalign [-f] [-v] <alignment> input.apk output.apk

例:zipalign -v 4 app_signed.apk app_signed_align.apk

3、验证一个apk文件是否对齐的方法如下:

zipalign -c -v <alignment> existing.apk 

例:zipalign -c -v 4 existing.apk 

zipalign命令选项不多:
-f : 输出文件覆盖源文件
-v : 详细的输出log
-p : outfile.zip should use the same page alignment for all shared object files within infile.zip
-c : 检查当前APK是否已经执行过Align优化。
<alignment>指的是字节对齐参数,一般来说这个参数的值均为4,否则它起不到任何作用。


一定可行的方案: 只使用 v1 方案
不一定可行的方案:同时使用 v1 和 v2 方案
对 7.0 以下一定不行的方案:只使用 v2 方案


1,如果要支持 Android 7.0 以下版本,那么尽量同时选择两种签名方式,但是一旦遇到签名问题,可以只使用 v1 签名方案
2,如果需要对签名后的信息做处理修改,那就使用v1签名方案
3,如果最后遇到各种不同的问题,可以不勾选v1和v2,直接打包签名



问题描述(v1和v2)
Android 7.0中引入了APK Signature Scheme v2,v1是jar Signature来自JDK

V1:应该是通过ZIP条目进行验证,这样APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。
V2:验证压缩文件的所有字节,而不是单个 ZIP 条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证),从而加快应用安装速度。


问题说白了就是: 
V1: 旧的验证方式 
V2: Android7.0以后新的验证方式 
可以只勾选v1,但是在Android7.0以上不会应用新的签名方式。如果只勾选V2,Android7.0以下的机子将无法安装APK!


解决方案一
v1和v2的签名使用
1)只勾选v1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式
2)只勾选V2签名7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证
3)同时勾选V1和V2则所有机型都没问题


解决方案二
在app的build.gradle的android标签下加入如下

signingConfigs { 
    debug { 
        v1SigningEnabled true 
        v2SigningEnabled true 
    } 

    release { 
        v1SigningEnabled true 
        v2SigningEnabled true 
    } 
}
### APK V1 和 V2 签名方法及差异 #### 1. V1 签名方法 V1 签名是传统的 JAR 签名方式,基于 `META-INF` 文件夹中的签名文件。这些文件包括 `.SF` 和 `.RSA`(或 `.DSA` 或 `.EC`)文件。`.SF` 文件包含整个 APK 的摘要信息,而 `.RSA` 文件则包含签名者的公钥证书和签名值。 在命令行中使用 `jarsigner` 工具可以完成 V1 签名: ```bash jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name ``` 此工具会对 APK 中的所有文件生成摘要,并将这些摘要存储在 `META-INF` 目录下的 `.SF` 文件中[^3]。 #### 2. V2 签名方法 V2 签名Android 7.0 (API 级别 24) 引入,采用增量签名的方式对 APK 的大部分内容进行签名,而不是整个文件。它使用 SHA256 哈希算法和 ECDSA 进行签名。与 V1 不同的是,V2 签名直接嵌入到 APK 文件的特定区域中,因此不需要额外的 `META-INF` 文件。 要为 APK 添加 V2 签名,需要使用 `apksigner` 工具: ```bash apksigner sign --ks my-release-key.keystore --out signed_app.apk unsigned_app.apk ``` 在运行上述命令之前,确保已使用 `zipalign` 对齐 APK 文件以提高性能和效率[^3]。 #### 3. V1 和 V2 签名的主要差异 - **覆盖范围**:V1 签名仅保护 APK 中的部分文件(即 `META-INF` 以外的内容),而 V2 签名几乎覆盖了整个 APK 文件,除了未压缩的文件和 ZIP 注释[^4]。 - **效率**:由于 V2 签名采用了增量签名机制,验证速度更快且占用更少的资源[^1]。 - **兼容性**:V1 签名适用于所有 Android 设备,而 V2 签名仅支持 Android 7.0 及更高版本的设备。为了兼容旧版设备,通常会同时添加 V1 和 V2 签名[^1]。 - **工具支持**:V1 签名可以通过 `jarsigner` 完成,而 V2 签名需要使用 `apksigner` 工具[^3]。 - **安全性**:V2 签名提供了更高的安全性,因为它能检测到任何对 APK 内容的篡改,包括文件的添加、删除或修改。 #### 4. 解决与 APK 签名相关的问题 如果在安装时遇到类似 `INSTALL_PARSE_FAILED_NO_CERTIFICATES` 的错误,可能是因为 V2 签名被移除或损坏。检查以下几点: - 确保在使用 `apksigner` 签名前已完成 `zipalign` 对齐[^3]。 - 如果同时使用 V1 和 V2 签名,确保 `META-INF/.SF` 文件中包含 `X-Android-APK-Signed` 属性,其值应为 `2` 表示支持 V2 签名[^2]。 ### 示例代码 以下是一个完整的命令流程,用于对 APK 文件进行 V1 和 V2 签名: ```bash # 对齐 APK 文件 zipalign -v -p 4 unsigned_app.apk aligned_app.apk # 使用 apksigner 添加 V1 和 V2 签名 apksigner sign --ks my-release-key.keystore --ks-key-alias alias_name --out signed_app.apk aligned_app.apk ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值