App Center 中的 Android 代码签名设置

重要

Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但你可以考虑迁移到几个建议的替代方法。

详细了解支持时间线和替代方案。

提示

对于 Xamarin.Android 用户,该过程略有不同。 有关详细信息,请参阅 我们的 Xamarin.Android 代码签名指南

对应用进行签名是开发过程中在真实设备上运行应用或通过 Beta 程序或在 Play Store 中分发应用的要求。 如果没有代码签名,应用只能在仿真器上运行。

当 App Center 使用调试生成类型生成 Android 应用程序时,开发人员不需要密钥存储,但可以上传。 这些生成将使用调试密钥自动进行代码签名。 对于要部署的发布版本,请将密钥存储上传到 App Center。

生成密钥存储

如果当前没有密钥存储,可以在 Android Studio 中生成一个密钥存储。 可以在 Android Studio 的官方用户指南中找到有关生成密钥存储以对 APK 进行签名的说明。

设置代码签名

App Center 支持通过三种不同的方式为 Android 应用设置代码签名。 对于所有三种方法,首先需要转到生成配置并启用代码签名:

  1. 转到 App Center 中的应用。
  2. 转到 “生成”。
  3. 通过从列表中选择要配置的分支,转到该分支。
  4. 使用右上角的“设置”菜单,或者如果你的分支尚未配置为生成,请选择“ 配置 ”。
  5. 启用 签名生成
  6. 选择 “保存”

然后,根据你的方案,使用下面部分的三个选项中最合适的选项。 第一个选项涉及将凭据签入到存储库,而其他两个选项则改用 App Center 来处理凭据。

从 Android 11 开始,如果使用 API 级别 30) 则必须使用 APK 签名者 (,因为它将设置一些额外的方案“现在需要 APK 签名方案 v2”。 App Center 自 2020 年 12 月 17 日起 (,) 在内部使用 APK 签名程序(而不是以前使用的 JAR 签名者)对 Android 应用程序进行签名。 作为在 App Center 中启用 APK 登录者的功能的一部分,Android 签名任务 V3 已实现,新签名任务的要求是更改密钥存储文件的保存方式 - 将密钥存储文件存储在 AzDO 安全文件中, (Android 签名生成和发布任务 - Azure Pipelines |Microsoft Docs) 。

警告

在 2020 年 12 月 17 日之前上传了密钥存储文件的任何生成配置仍使用 APK 签名方案 v2 签名方法 (jarsigner) 。 若要使用 APK 签名方案 v3 签名流,用户只需 重新上传其密钥存储文件保存 其分支配置。

注意

不完全支持使用 Android Gradle 插件版本 4.1.x。 若要使用此版本,必须在 文件中添加下一个选项设置 gradle.properties

 android.useNewApkCreator = false

A. 在 Gradle 配置中存储所有内容

可以在 (应用级别) 文件中指定签名详细信息build.gradle。 签名详细信息以及所有凭据和密钥存储信息将在存储库中可见。 首先,将所需的所有项添加到代码中,并将其检查到存储库中。 然后,在 App Center 的生成配置中,“启用 我的 Gradle”设置完全设置为自动处理签名

B. 将所有内容上传到 App Center

可以通过 App Center 上传密钥存储并配置签名凭据。 在这种情况下,App Center 将首先生成 Android 应用,然后在成功生成后运行签名步骤。

注意

一个生成只能签名一次。 请确保与所选生成变体的 Gradle 配置中的签名配置没有冲突。 如果 App Center 和 Gradle 文件中都有签名设置,则生成最终可能会签名两次,这会导致冲突。

在 App Center 中设置 生成配置 ,如下所示:

  1. “禁用 我的 Gradle”设置完全设置为自动处理签名
  2. 将密钥存储文件上传到 密钥存储文件 上传文件删除。 可以将文件拖到框中,或单击它并浏览文件。 密钥存储文件的扩展名 .keystore 为 或 .jks
  3. 在相应的字段中输入密钥存储密码、密钥别名和密钥密码。 这些值与签署生成时在 Android Studio 中输入的值相同。

C. 使用环境变量在存储库中存储签名详细信息

如果存储库已包含密钥存储,但不想在其中存储凭据,请使用此方法。 在生成时,凭据将作为 系统属性 提供给 Gradle 生成。 请参阅以下代码示例,了解如何使用它们:

android {
    signingConfigs {
        releaseSigningConfig {
            storeFile rootProject.file("app/testapp.jks")
            storePassword System.getProperty("APPCENTER_KEYSTORE_PASSWORD")
            keyAlias System.getProperty("APPCENTER_KEY_ALIAS")
            keyPassword System.getProperty("APPCENTER_KEY_PASSWORD")
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.releaseSigningConfig
        }
    }
}

在上面的代码中,保护注入到生成的系统属性后面的值可确保签名凭据的安全 - 值是加密的,并且仅在生成时可供生成代理使用。 可以通过 App Center 提供值。 还可以对任何值进行硬编码,并将其检查到存储库中。 若要使用 App Center 保护值,请执行以下操作:

  1. 转到 生成配置
  2. 确保名为 “我的 Gradle 设置”的复选框完全设置为自动处理未 选中的签名。
  3. 在相应的字段中输入密钥存储密码、密钥别名和密钥密码。 这些值与签署生成时在 Android Studio 中输入的值相同。

如果使用产品风格,则可能需要调整上述代码,以便所有发布配置都使用正确的签名配置。

注意

如果在 signingConfig (应用级别) 文件的 节中使用 buildTypesbuild.gradle 选项,则可能会在 App Center 生成期间遇到代码签名错误。 这尤其适用于使用 Android 版本 0.60.x 及更高版本的 React Native的应用:

 Execution failed for task ':app:validateSigningRelease'.
 Keystore file '.../android/app/debug.keystore' not found for signing config 'debug'

若要解决此问题,必须将用于签名的适当密钥存储推送到存储库,并启用 “我的 Gradle”设置完全设置为 在 App Center 门户中的生成配置中自动处理签名。

如果已将密钥存储上传到 App Center 门户中的生成配置,请注意,如果不从React Native项目模板的默认状态更新选项,则此方法需要从 buildTypes (应用级别) 文件的 部分build.gradle删除signingConfig该选项。