Android 的代码符号

本文将介绍如何手动为 Android (APK) 进行代码签名。 如果您在创建和构建整合项目时选择了 Android 作为平台之一,您需要为 Android 应用签名。

重要提示

如果您希望签署 AAB 应用以进行 Google Play 分发,请参阅签署您的应用

准备您的 PC

您需要以下信息才能开始:

先决条件

  • 用于创建哈希键的应用程序名称。
  • 最新的 APK 文件,以便在过程中进行签名。

生成密钥

备注

如果您在创建应用注册时已经生成了密钥和签名哈希,请直接跳到签署 APK 包

我们将使用 keytool.exe(安装 Android Studio 后可用,从文件夹位置“Drive:\Program Files\Android\Android Studio\jre\bin\keytool.exe”)创建证书来签署应用程序包。 Keytool 用于管理加密密钥、X.509 证书链和可信证书的密钥库(数据库)。

如果没有环境变量,请打开命令提示符并运行以下命令以生成密钥:

  1. 下载 Android Studio、openssl
  2. 添加 keytool 和 openssl 作为环境变量。 添加 C:\Program Files\Android\Android Studio\jbr\bin 作为 env 变量。 在环境变量(C:\Program Files\OpenSSL-Win64\bin)中添加 openssl.exe 路径
  3. 运行以下命令 ---keytool -genkey -alias powerappswrap -keyalg RSA -keystore powerappswrap.jks -keysize 2048 -validity 10000 生成密钥
  4. 在 cmd - keytool -exportcert -alias powerappswrap -keystore powerappswrap.jks | openssl sha1 -binary | openssl base64 Generate Signature Hash 中运行此命令

使用上面示例中的参数的 keytool 命令的屏幕截图。

如果您有环境变量,请打开命令提示符并运行以下命令以生成密钥:

keytool -genkey -alias SIGNATURE_ALIAS -keyalg RSA -keystore PATH_TO_KEYSTORE -keysize 2048 -validity 10000

参数:

  • genkey - 生成密钥的命令。
  • alias - 指示要在将来使用的别名引用包含将要生成的密钥的密钥库条目。
  • keyalg - 密钥算法名称。
  • keystore - 您正在使用的密钥库的名称。
  • keysize - 要生成的每个密钥的大小。
  • validity - 密钥的有效期,以天数计。

示例:

  • 如果正在准备密钥保管库,PATH_TO_KEYSTORE 应该有 .pfx 扩展名。

    keytool -genkey -alias powerappswrap -keyalg RSA -keystore powerappswrap.pfx -keysize 2048 -validity 10000

  • 如果您在准备进行手动签名,PATH_TO_KEYSTORE 应该有 .jks 扩展名。

    keytool -genkey -alias powerappswrap -keyalg RSA -keystore \Users\name\Desktop\powerappswrap.jks -keysize 2048 -validity 10000

使用上面示例中的参数的 keytool 命令的屏幕截图。

生成签名哈希

备注

如果您在创建应用注册时已经生成了密钥和签名哈希,请直接跳到签署 APK 包

生成密钥后,将使用 keytool 中的 exportcert 命令导出密钥库证书。

keytool -exportcert -alias SIGNATURE_ALIAS -keystore PATH_TO_KEYSTORE | openssl sha1 -binary | openssl base64

参数:

  • exportcert - 从密钥库中读取与别名关联的证书并将其存储在 cert_file 文件中。 未指定文件时,证书输出到 stdout。
  • alias - 早期生成密钥时使用的别名。
  • keystore - 您正在使用的密钥库的名称。
  • openssl - 为 Android 生成 SHA1 密钥。

注册应用时将生成的签名哈希添加到重定向 URI 中。

手动将 SHA1 十六进制转换为 Base64 编码的签名哈希

如果您的签名哈希在 Azure 门户中未正确编码或不可接受,您可能会看到以下错误:

“签名哈希必须是 base64 编码的 SHA1。”

出现此错误时,请尝试使用以下步骤生成签名哈希:

  1. 运行 keytool -list -v -alias SIGNATURE_ALIAS -keystore PATH_TO_KEYSTORE 以详细模式列出证书信息。
  2. 从输出中复制证书指纹部分的 SHA1 值。 确保只复制十六进制值。
    例如:EF:11:45:3D:F1:72:D9:8C:43:32:CD:0A:49:C2:E4:75:2D:B3:2D:9F
  3. 使用任何可用的“十六进制到 Base64”转换器将复制的证书指纹十六进制值转换为 Base64 编码值。
    Base64 编码值的示例:8CPPeLaz9etdqQyaQubcqsy2Tw=
  4. 注册应用时,复制生成的 Base64 编码值作为 Azure 门户中的签名哈希

手动签署 APK 包

备注

如果您尚未使用自动登录功能打包应用,或者正在尝试上传 Play 商店的 AAB 文件,则需要执行这些步骤。 为避免重复此步骤,建议使用自动登录。

要签署 APK 包,我们使用 apksigner 工具。 此工具允许您签署 APK 并确保 APK 包签名将在 APK 支持的所有 Android 平台上成功验证。

查找您的 apksigner

  1. 检查 Android Studio 中的 Android SDK 路径。

  2. 选择工具>SDK 管理器>Android SDK 位置

    如果使用 iOS,检查 buildTools 版本目录中的 apksigner 文件:

    转到 SDK 目录 >构建工具>buildToolsVersion>lib 并检查 apksigner.jar 文件

包含 apksigner 位置信息的屏幕截图。

使用 apksigner 文件

运行以下命令来使用 apksigner 并对包进行签名:

apksigner.bat sign --ks PATH_TO_KEYSTORE --ks-key-alias KEY_ALIAS PATH_TO_APK

参数:

  • ks - 密钥库的路径。
  • ks-key-alias - APK 文件的密钥别名路径。

出现提示时,输入密码。

详细信息:Android Studio 命令行工具:apksigner

分发应用

您可以在 App Center 等分发服务上托管包。 要使用 Microsoft Intune 进行分发,请参阅将 Android 业务线应用添加到 Microsoft Intune。 若要了解有关向 Intune 应用保护服务提供应用访问权限的信息,请参阅向 Intune 应用保护服务提供应用访问权限

另请参见