菜鸟科技网

Android命令行如何签名APK?

在Android开发中,APK签名是确保应用完整性和身份验证的关键步骤,通过命令行对APK进行签名,可以灵活集成到自动化构建流程中,尤其适合需要批量处理或CI/CD(持续集成/持续部署)场景的开发者,本文将详细介绍Android命令行签名的原理、工具、操作步骤及注意事项,帮助开发者全面掌握这一技能。

Android命令行如何签名APK?-图1
(图片来源网络,侵删)

APK签名的基本概念

APK签名本质上是使用开发者的私钥对应用进行加密,生成数字签名,当用户安装APK时,系统会使用对应的公钥验证签名是否匹配,从而确保应用未被篡改且来源可信,Android签名机制支持多种密钥算法,包括RSA和ECDSA(推荐使用ECDSA,因其安全性更高且签名更小),签名过程还会在APK中生成META-INF目录,包含签名文件(如.SF.RSA.EC)和清单文件摘要。

签名工具与准备工作

签名工具

  • jarsigner:Java SDK自带的签名工具,适用于传统签名方案,但功能有限。
  • apksigner:Android SDK提供的专用工具,支持v1(JAR签名)、v2(APK签名块)、v3(签名方案升级)等多种签名方式,是当前推荐的首选工具。

准备工作

  • 生成密钥库(KeyStore)
    使用keytool(Java工具)或apksigner生成密钥库文件(.keystore.jks)。

    keytool -genkeypair -v -keystore my-release-key.keystore -alias myalias -keyalg EC -keysize 256 -validity 10000 -storepass <password> -keypass <password>

    参数说明:

    • -keystore:密钥库文件路径。
    • -alias:密钥别名(需唯一)。
    • -keyalg:算法(EC或RSA)。
    • -validity:有效期(天)。
  • 环境配置
    确保Android SDK的build-tools版本已安装,且apksigner位于$ANDROID_HOME/build-tools/<version>/目录下,可通过以下命令验证:

    Android命令行如何签名APK?-图2
    (图片来源网络,侵删)
    apksigner version

使用apksigner签名APK

基本签名命令

apksigner sign --ks my-release-key.keystore --ks-key-alias myalias --ks-pass pass:<password> --key-pass pass:<password> --out signed.apk unsigned.apk

参数说明:

  • --ks:密钥库路径。
  • --ks-key-alias:密钥别名。
  • --ks-pass/--key-pass:密钥库和密钥的密码(若未设置,会提示输入)。
  • --out:输出APK路径。

高级选项

  • 指定签名方案

    apksigner sign --ks my.keystore --min-sdk-version 21 --v1-signing-enabled true --v2-signing-enabled true --out signed.apk unsigned.apk

    -min-sdk-version:指定最低支持版本,影响v2/v3签名兼容性。

  • 验证签名

    Android命令行如何签名APK?-图3
    (图片来源网络,侵删)
    apksigner verify --verbose signed.apk

    输出结果会显示签名是否有效及使用的方案版本。

批量签名脚本示例

使用Shell脚本批量签名APK:

#!/bin/bash
KEYSTORE="my.keystore"
ALIAS="myalias"
PASSWORD="your_password"
for apk in ./unsigned/*.apk; do
    filename=$(basename "$apk")
    apksigner sign --ks "$KEYSTORE" --ks-key-alias "$ALIAS" --ks-pass pass:"$PASSWORD" --key-pass pass:"$PASSWORD" --out "./signed/$filename" "$apk"
done

签名问题排查

常见错误及解决方案

错误提示 可能原因 解决方案
apksigner: command not found 未将build-tools添加到PATH ~/.bashrc~/.zshrc中添加export PATH=$PATH:$ANDROID_HOME/build-tools/<version>/
jarsigner is not recognized 环境变量未配置Java 确保Java JDK已安装并配置JAVA_HOME
Invalid signature 密钥库密码错误或APK已修改 检查密钥库密码,重新生成签名
v2 signature not found 未启用v2签名 添加--v2-signing-enabled true参数

签名最佳实践

  1. 密钥管理

    • 密钥库文件和密码需妥善保管,建议使用硬件安全模块(HSM)或密钥管理服务(KMS)。
    • 定期更换密钥(如每年一次),避免长期使用同一密钥。
  2. 签名方案选择

    • v1签名:兼容性好(支持Android 1.0+),但易被二次打包攻击。
    • v2签名:直接对APK整体签名,安全性更高,需Android 7.0+支持。
    • v3签名:支持密钥轮换,适用于需要动态更新密钥的场景。
      推荐组合使用:--v1-signing-enabled true --v2-signing-enabled true
  3. 自动化集成
    在Gradle构建脚本中配置签名信息(signingConfigs),实现编译时自动签名:

    android {
        signingConfigs {
            release {
                storeFile file('my.keystore')
                storePassword 'password'
                keyAlias 'myalias'
                keyPassword 'password'
            }
        }
        buildTypes {
            release {
                signingConfig signingConfigs.release
            }
        }
    }

相关问答FAQs

问题1:如何验证APK签名是否有效?
解答:可通过以下两种方式验证:

  1. 使用apksigner verify命令:
    apksigner verify --verbose your_app.apk

    若输出包含Verified using v3 schemeVerified using v2 scheme,则签名有效。

  2. 使用jarsigner检查v1签名:
    jarsigner -verify -verbose your_app.apk

问题2:签名后的APK如何重新签名?
解答:重新签名前需先对APK进行对齐处理(优化性能),再执行签名命令:

  1. 对齐处理
    zipalign -v 4 your_app_unsigned.apk your_app_aligned.apk

    参数-v 4表示按4字节对齐,优化I/O性能。

  2. 重新签名
    apksigner sign --ks your.keystore --out your_app_resigned.apk your_app_aligned.apk

    注意:直接对已签名APK重新签名会覆盖原有签名,可能导致系统验证失败。

分享:
扫描分享到社交APP
上一篇
下一篇