Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

为您的应用签名

Android 系统要求所有 APK 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。如果您使用的是 Android App Bundle,则只需先为 app bundle 签名,然后即可将其上传到 Play 管理中心,其余操作均由 Google Play 应用签名功能完成。不过,您也可以手动为应用签名以将其上传到 Google Play 和其他应用商店。

本页将向您介绍与应用签名和安全相关的一些重要概念、如何使用 Android Studio 为您的应用签名以将其发布到 Google Play,以及如何选择加入 Google Play 应用签名计划。

下面将简要介绍在为新应用签名并将其发布到 Google Play 时可能需要采取的步骤:

  1. 生成上传密钥和密钥库
  2. 使用上传密钥为应用签名
  3. 选择加入 Google Play 应用签名计划
  4. 将应用上传到 Google Play
  5. 准备和发布应用版本

而如果您的应用已使用现有的应用签名密钥发布到 Google Play 商店,或者您想要为新应用选择应用签名密钥,而不是让 Google 生成,请按以下步骤操作:

  1. 使用应用的签名密钥为应用签名,然后选择加密并导出其签名密钥
  2. 上传应用的签名密钥,以便选择加入 Google Play 应用签名计划
  3. (推荐)生成并注册上传证书,以便未来对应用进行更新
  4. 将应用上传到 Google Play
  5. 准备和发布应用版本

本页还将介绍如何管理您自己的密钥,以备在将应用上传到其他应用商店时使用。如果您不使用 Android Studio 或希望从命令行为应用签名,请了解如何使用 apksigner

Google Play 应用签名

借助 Google Play 应用签名功能,Google 会管理和保护您应用的签名密钥,并使用此密钥为您的 APK 签名以进行分发。此外,由于在采用 app bundle 时,会在上传后由 Google Play 商店负责编译 APK 并进行签名,因此您需要先选择加入 Google Play 应用签名计划,然后才能上传您的 app bundle。这样做可以让您从以下方面受益:

  • 使用 Android App Bundle 并支持 Google Play 的 Dynamic Delivery 功能。Android App Bundle 可以缩减您应用的体量、简化应用版本、实现动态功能和免安装体验。
  • 提高签名密钥的安全性,让您能够使用单独的上传密钥为您上传到 Google Play 的 app bundle 签名。

Google Play 应用签名计划会使用两个密钥:应用签名密钥和上传密钥,有关密钥和密钥库的部分中进一步详细介绍了这些密钥。您需要保管上传密钥并使用它为您的应用签名,以便将应用上传到 Google Play 商店。使用单独的上传密钥的好处在于,您可以在密钥丢失或被盗时请求重置上传密钥。相比之下,如果您未选择加入 Google Play 应用签名计划,而在丢失了自己的应用签名密钥后,就无法更新自己的应用。

当准备发布应用时,您可以使用 Android Studio 为您的应用签名并将其上传到 Google Play。您为此应用签名时使用的密钥会成为此应用的上传密钥。然后,Google 会使用上传证书验证您的身份,并使用您的应用签名密钥为 APK 签名以进行分发,如图 1 所示。

如果还没有应用签名密钥,您可以在注册过程中生成一个。

图 1. 通过 Google Play 应用签名计划为应用签名

系统会将您的密钥存储在 Google 用来存储自身密钥的基础架构中,因此您的密钥可享受到 Google 密钥管理服务的严密保护。您可以阅读 Google Cloud 安全白皮书详细了解 Google 的技术基础架构。

当您使用 Google Play 应用签名功能时,如果上传密钥丢失或被盗,您可以与 Google 联系以撤消旧上传密钥,然后生成一个新上传密钥。由于您的应用签名密钥受 Google 保护,因此,即使您更改了上传密钥,仍可以继续以原始应用更新的形式上传应用的新版本。要了解详情,请参阅重置丢失或被盗的私有上传密钥

下一部分将介绍与应用签名和安全性相关的一些重要术语和概念。如果您想跳过这一部分,直接去了解如何准备将您的应用上传到 Google Play 商店,请转到签署要发布的应用

密钥、证书和密钥库

在为应用签名时,您必须理解下述概念和定义。

证书

公钥证书.der.pem 文件,也称为数字证书或身份证书)包含公钥/私钥对中的公钥,以及可以标识持有对应私钥的所有者的一些其他元数据(例如名称和位置)。

在为您的应用签名时,签名工具会将此证书附加到应用。此证书会将 APK 或 app bundle 与您和您对应的私钥相关联。这有助于 Android 确保您应用日后的所有更新都真实可靠,并且来自原始作者。用于创建此证书的密钥称为应用签名密钥

您可以从 Play 管理中心的“应用签名”页面下载您的应用签名密钥和上传密钥的证书,以便向 API 提供商注册您的密钥。您可以与任何人共享此证书。公钥证书不包含您的私钥。

每个应用在其整个生命周期内必须使用同一证书,以便用户能够以应用更新的形式安装新版本。要详细了解为所有应用在其整个生命周期内使用同一证书的好处,请参阅下面的签名注意事项

证书指纹是证书独一无二的简短表示形式,通常 API 提供商会要求同时提供证书指纹和软件包名称,以注册使用其服务的应用。您可以在 Play 管理中心的“应用签名”页面上找到上传证书和应用签名证书的 MD5、SHA-1 和 SHA-256 指纹。您还可以从同一页面下载原始证书 (.der) 来计算其他指纹。

以下是您应该了解的不同类型的密钥和密钥库:

  • 应用签名密钥:用于为用户设备上安装的 APK 签名的密钥。作为 Android 安全更新模型的一部分,应用签名密钥在应用的整个生命周期内保持不变。应用签名密钥属于私钥,因此必须保密。不过,您可以与他人共享使用应用签名密钥生成的证书。
  • 上传密钥:在上传 app bundle 或 APK 以通过 Google Play 应用签名计划进行签名之前,您可以使用上传密钥为其签名。您必须为上传密钥保密。不过,您可以与他人共享使用上传密钥生成的证书。您可以通过以下其中一种方式生成上传密钥:

    • 如果要让 Google 在您选择加入计划时为您生成应用签名密钥,则您用于为应用签名以进行发布的密钥将被指定为上传密钥。
    • 如果您在将新应用或现有应用加入计划时向 Google 提供应用签名密钥,则可以在选择加入计划的过程中或之后生成新的上传密钥,以提高安全性。
    • 如果您没有生成新的上传密钥,则继续将您的应用签名密钥用作上传密钥来为每个版本签名。

    提示:为确保您的密钥安全无虞,最好确保应用签名密钥和上传密钥各不相同。

  • Java 密钥库(.jks 或 .keystore):一个二进制文件,用作证书和私钥的存储区。

  • Play Encrypt Private Key (PEPK) 工具:使用此工具可从 Java 密钥库中导出私钥,并对私钥加密以便传输到 Google Play。在提供供 Google 使用的应用签名密钥时,请选择从 Java 密钥库导出并上传密钥选项,并按说明下载和使用此工具。或者,您也可以选择导出并上传密钥(不使用 Java 密钥库)选项,以下载、查看和使用 PEPK 工具的开放源代码。

为您的调试版本签名

从 IDE 中运行或调试您的项目时,Android Studio 将自动使用通过 Android SDK 工具生成的调试证书为您的应用签名。当您首次在 Android Studio 中运行或调试项目时,IDE 会自动在 $HOME/.android/debug.keystore 中创建调试密钥库和证书,并设置密钥库和密钥密码。

由于调试证书由编译工具创建并且在设计上不安全,因此大多数应用商店(包括 Google Play 商店)都不接受使用调试证书为要发布的应用签名。

Android Studio 会自动将您的调试签名信息存储在签名配置中,因此您不必在每次调试时都输入此信息。签名配置是一种包含为应用签名所需全部必要信息的对象,这些信息包括密钥库位置、密钥库密码、密钥名称和密钥密码。您无法直接修改调试签名配置,不过可以配置如何为您的发布版本签名

要详细了解如何针对调试用途来编译和运行应用,请参阅编译和运行应用

调试证书的有效期

针对调试用途为应用签名的自签名证书的有效期为 30 年,从其创建日期算起。当此证书到期后,您将遇到编译错误。

要解决此问题,只需删除存储在以下其中一个位置的 debug.keystore 文件即可:

  • ~/.android/(OS X 和 Linux)
  • C:\Documents and Settings\user\.android\(Windows XP)
  • C:\Users\user\.android\(Windows Vista 以及 Windows 7、8 和 10)

当您下次编译和运行应用的调试版本时,Android Studio 会重新生成新的密钥库和调试密钥。

为您的应用签名以将其发布到 Google Play

当准备发布应用时,您需要为您的应用签名并将其上传到应用商店(例如 Google Play)。在将您的应用发布到 Google Play 时,您还应选择加入 Google Play 应用签名计划。本部分将向您介绍如何正确地为您的应用签名以进行发布,以及如何选择加入 Google Play 应用签名计划。

生成上传密钥和密钥库

如果还没有上传密钥(选择加入 Google Play 应用签名计划时需要使用),您可以使用 Android Studio 生成一个,具体步骤如下所示:

  1. 在菜单栏中依次点击 Build > Build > Generate Signed Bundle/APK
  2. Generate Signed Bundle or APK 对话框中,选择 Android App BundleAPK,然后点击 Next
  3. Key store path 字段下,点击 Create new
  4. New Key Store 窗口中,为您的密钥库和密钥提供以下信息,如图 2 所示。

    图 2. 在 Android Studio 中创建新的上传密钥和密钥库。

  5. 密钥库

    • Key store path:选择创建密钥库的位置。
    • Password:为您的密钥库创建并确认一个安全的密码。
  6. 密钥

    • Alias:为您的密钥输入一个标识名。
    • Password:为您的密钥创建并确认一个安全的密码。此密码应该与您为密钥库选择的密码不同。
    • Validity (years):以年为单位设置密钥的有效时长。密钥的有效期应至少为 25 年,以便您可以在应用的整个生命期内使用同一密钥为应用更新签名。
    • Certificate:为证书输入一些关于您本人的信息。此信息不会显示在应用中,但会作为 APK 的一部分包含在您的证书中。
  7. 填写完表单后,请点击 OK

  8. 如果您想要使用上传密钥来编译您的应用并为其签名,请转到介绍如何使用上传密钥为应用签名的部分。如果只想生成密钥和密钥库,请点击 Cancel

使用密钥为应用签名

如果有上传密钥,您可以使用它为您的应用签名。而如果您的应用已使用现有的应用签名密钥签名并发布到 Google Play 商店,请使用此应用签名密钥为您的应用签名,然后确保加密并导出此应用,以选择将其加入 Google Play 应用签名计划。您以后可以生成单独的上传密钥,并通过 Google Play 注册上传密钥的公钥证书,以便为您应用的后续更新签名并进行上传。

要使用 Android Studio 为您的应用签名,并导出现有的应用签名密钥,请按以下步骤操作:

  1. 如果您目前没有打开 Generate Signed Bundle or APK 对话框,请依次点击 Build > Generate Signed Bundle/APK
  2. Generate Signed Bundle or APK 对话框中,选择 Android App BundleAPK,然后点击 Next
  3. 从下拉菜单中选择一个模块。
  4. 指定密钥库的路径、密钥的别名,然后输入二者的密码。如果您尚未准备好上传密钥库和密钥,请先生成上传密钥和密钥库,然后返回完成此步骤。

    图 3. 使用上传密钥为应用签名

  5. 如果您要使用现有的应用签名密钥为 app bundle 签名,并且想要以后再选择将您的应用加入 Google Play 应用签名计划,请选中 Export encrypted key 旁边的复选框,并指定一个路径以将签名密钥保存为加密的 *.pepk 文件。然后,您可以使用此加密的应用签名密钥选择将现有应用加入 Google Play 应用签名计划

  6. 点击 Next

  7. 在下一个窗口(如图 4 所示)中,为签名的应用选择一个目标文件夹、选择版本类型,然后选择产品变体(如果适用)。

  8. 如果要编译 APK 并为其签名,您需要选择您想让相应应用支持的签名版本。要了解详情,请参阅 APK 签名方案 v2

  9. 点击 Finish

    图 4. 针对所选产品变体生成应用的签名版本。

图 5. 点击弹出式窗口中的链接即可分析或找到您的 app bundle,或找到您导出的签名密钥。

在 Android Studio 编译完您的签名应用后,您可以通过点击弹出式通知中的相应选项来找到分析您的应用。如果选择了导出签名密钥的选项,您可以通过点击弹出式窗口右下角的下拉箭头将其展开,然后点击 Show Exported Key File(如图 5 所示)快速导航到此密钥。

现在,您可以随时选择将您的应用加入 Google Play 应用签名计划并上传应用以进行发布。如果不熟悉应用发布流程,您可能需要参阅发布概览。否则,请转到介绍如何将您的应用上传到 Play 管理中心的页面。

选择加入 Google Play 应用签名计划

如本页前面所述,我们建议您通过 Google Play 应用签名的方式为您的应用签名以通过 Google Play 进行分发。选择将您的应用加入此计划所需的步骤取决于您的应用是否尚未发布到 Google Play,或者您是否已使用现有的应用签名密钥为您的应用签名并将其发布。

选择将新应用加入计划

要将尚未发布到 Google Play 的应用加入应用签名计划,请按以下步骤操作:

  1. 生成上传密钥,然后使用此上传密钥为您的应用签名(如果您以前尚未执行此步骤)。
  2. 登录您的 Play 管理中心
  3. 准备和发布版本的步骤创建新版本。
  4. 选择发布轨道后,请在让 Google 创建并管理我的应用签名密钥部分下配置应用签名,具体步骤如下所示:
    • 要让 Google Play 为您生成应用签名密钥并使用此密钥为您的应用签名,请选择继续。您用于为第一个版本签名的密钥将成为上传密钥,并且日后的应用版本也应使用此密钥进行签名。
    • 要使用与开发者帐号中的另一个应用相同的密钥,请依次选择高级选项 > 使用与此帐号中的其他应用相同的密钥,选择相应的应用,然后点击继续
    • 要提供您自己的签名密钥供 Google 为应用签名,请选择高级选项,然后选择一个可让您安全上传私钥及其公开证书的选项。

在名为要添加的 Android App Bundle 和 APK 的部分中,点击浏览文件以找到并上传您使用上传密钥签名的应用。要详细了解如何发布应用,请参阅准备和发布版本。当您在选择加入 Google Play 应用签名计划后发布应用时,Google Play 会为您生成和管理应用的签名密钥。您只需使用应用的上传密钥为其后续更新签名,然后再将相应更新上传到 Google Play 即可。

如果您需要为应用创建新的上传密钥,请转到介绍如何重置丢失或被盗的私有上传密钥的部分。

选择将现有应用加入计划

如果您要使用现有的应用签名密钥更新已发布到 Google Play 的应用,则可以按以下步骤选择加入 Google Play 应用签名计划:

  1. 使用现有的应用签名密钥为您的应用签名,并确保选中 Export encrypted key 旁边的复选框以将签名密钥保存为加密的 *.pepk 文件(如果您以前尚未执行此步骤)。您在后续步骤中会用到此文件。
  2. 登录您的 Play 管理中心,然后导航到您的应用。
  3. 在左侧菜单中,依次点击版本管理 > 应用签名
  4. 如果适用,请查看《服务条款》并选择接受
  5. 选择与您要上传到 Google Play 的签名密钥最相符的一个选项,然后按照显示的说明操作。例如,如果您使用 Android Studio 导出了应用的签名密钥(如本文所述),请选择上传从 Android Studio 导出的密钥,然后上传密钥的 *.pepk 文件。
  6. 点击注册

您现在应该会看到一个页面,其中包含您应用的签名和上传证书的详细信息。现在,Google Play 在向用户部署您的应用时,会使用您的现有密钥为您的应用签名。不过,加入 Google Play 应用签名计划最重要的好处之一,就是能够将您在为上传到 Google Play 的工件签名时使用的密钥与 Google 在为您的应用签名以将其分发给用户时使用的签名分开。因此,请考虑按照下一部分中的步骤生成并注册单独的上传密钥。

生成并注册上传证书

在发布尚未使用上传密钥签名的应用时,Google Play 管理中心会提供注册上传密钥的选项,以便日后发布应用更新。虽然这是一个可选步骤,但还是建议您在发布应用时使用单独的密钥,此密钥最好不要与 Google Play 向用户分发应用时所用的密钥相同。这样一来,Google 便可以确保您的签名密钥安全无虞,而您也可以选择重置丢失或被盗的私有上传密钥。本部分将介绍如何创建上传密钥、如何根据上传密钥生成上传证书,以及如何通过 Google Play 注册此证书以供未来发布应用更新时使用。

下面将介绍您在哪些情况下会在 Play 管理中心中看到用于注册上传证书的选项:

  • 当您发布使用签名密钥签名的新应用,并选择将其加入 Google Play 应用签名计划时。
  • 当您即将发布已选择加入 Google Play 应用签名计划的现有应用,但您已使用此应用的签名密钥为其签名时。

如果您不是要发布已选择加入 Google Play 应用签名计划的现有应用的更新,并且您想注册上传证书,请完成以下步骤,然后转到介绍如何重置丢失或被盗的私有上传密钥的部分。

生成上传密钥和密钥库(如果您以前尚未执行此步骤)。

创建上传密钥和密钥库后,您需要使用 keytool 根据上传密钥生成公钥证书;为此,您需要使用以下命令:

    $ keytool -export -rfc
      -keystore your-upload-keystore.jks
      -alias upload-alias
      -file output_upload_certificate.pem
    

现在您已获得上传证书,请在 Play 管理中心中提示时通过 Google 注册此证书,或参阅以下部分以通过 Google Play 支持团队进行注册。

升级应用签名密钥

在某些情况下,您可能需要更改应用签名密钥,例如,由于您需要加密强度更高的密钥或您的签名密钥已被盗。不过,由于仅当使用相同的签名密钥为您的应用更新签名时,用户才能更新您的应用,因此很难更改已发布应用的签名密钥。

如果将应用发布到 Google Play,您可以通过 Play 管理中心升级已发布应用的签名密钥;更新后,对于新安装的应用或其更新,将使用此新密钥进行签名,而对于在签名密钥升级之前便已安装您应用的用户,应用更新仍将使用旧版应用签名密钥来签名。

要了解详情,请参阅针对新安装应用升级应用签名密钥

重置丢失或被盗的私有上传密钥

如果丢失了自己的私有上传密钥或私钥被盗,您可以创建一个新密钥,然后与 Google Play 支持团队联系以重置密钥

配置编译流程以自动为应用签名

在 Android Studio 中,您可以通过创建一个签名配置并将其分配到您的发布版本类型,将您的项目配置为在编译流程中为应用的发布版本自动签名。签名配置包含密钥库位置、密钥库密码、密钥别名和密钥密码。要使用 Android Studio 创建签名配置并将其分配到您的发布版本类型,请完成以下步骤:

  1. Project 窗口中,右键点击您的应用并点击 Open Module Settings
  2. Project Structure 窗口左面板中的 Modules 下,点击您想要签名的模块。
  3. 点击 Signing 标签,然后点击 Add 图标
  4. 选择您的密钥库文件,为此签名配置输入一个名称(因为您可能要创建多个配置),然后输入所需信息。

    图 7. 用于创建新签名配置的窗口。

  5. 点击 Build Types 标签。
  6. 点击 release 版本。
  7. Signing Config 下,选择您刚创建的签名配置。

    图 8. 在 Android Studio 中选择一项签名配置。

  8. 点击 OK

现在,在您每一次通过在 Android Studio 中选择 Build > Build Bundle(s) / APK(s) 下的选项来编译发布版本类型时,IDE 都会使用您指定的签名配置自动为您的应用签名。您可以在所编译模块的项目目录内的 build/outputs/ 目录中找到已签名的 APK 或 app bundle。

在您创建签名配置时,您的签名信息将以纯文本形式包含到 Gradle 编译文件中。如果您是通过团队协作开发项目或者要公开共享自己的代码,那么您应该从编译文件中移除签名信息并将其单独存储,从而确保此信息安全无虞。您可以参阅从编译文件中移除签名信息,详细了解如何从编译文件中移除签名信息。要详细了解如何保证签名信息安全无虞,请参阅保护您的密钥

以不同的方式为每个产品变体签名

如果您的应用有多个产品变体并且您想要以不同方式为每个变体签名,则可以创建更多签名配置并将其按变体分配:

  1. Project 窗口中,右键点击您的应用并点击 Open Module Settings
  2. Project Structure 窗口左面板中的 Modules 下,点击您想要签名的模块。
  3. 点击 Signing 标签,然后点击 Add 图标
  4. 选择您的密钥库文件,为此签名配置输入一个名称(因为您可能要创建多个配置),然后输入所需信息。

    图 10. 用于创建新签名配置的窗口。

  5. 根据需要重复第 3 步和第 4 步,直到您完成所有签名配置的创建。
  6. 点击 Flavors 标签。
  7. 点击您想要配置的变体,然后从 Signing Config 下拉菜单中选择合适的签名配置。

    图 11. 按产品变体配置签名设置。

    重复操作以配置任何其他产品变体。

  8. 点击 OK

您还可以在 Gradle 配置文件中指定您的签名设置。要了解详情,请参阅配置签名设置

管理您自己的签名密钥

如果您选择不加入 Google Play 应用签名计划,可以管理自己的应用签名密钥和密钥库。请注意,您需要自行负责保障密钥和密钥库的安全。此外,您的应用也将无法支持 Android App Bundle 和 Google Play 的 Dynamic Delivery。

如果您准备创建自己的密钥和密钥库,请确保先为密钥库选择一个安全系数高的密码,然后为密钥库中存储的每个私钥分别选择一个单独的安全系数高的密码。您必须将密钥库保存在安全可靠的地方。如果您无法访问您的应用签名密钥,或者您的密钥被盗,Google 将无法为您恢复应用签名密钥,并且您将无法以原始应用更新的形式向用户发布您应用的新版本。要了解详情,请参阅下面的保护您的密钥部分。

如果您自行管理自己的应用签名密钥和密钥库,那么,当您为 APK 签名时,将使用自己的应用签名密钥在本地对其进行签名,并直接将已签名的 APK 上传到 Google Play 商店以进行分发,如图 10 所示。

图 12. 在自行管理您的应用签名密钥时为应用签名

当您使用 Google Play 应用签名时,Google 会保障您签名密钥的安全,还会确保您的应用具有正确的签名,并能够在其整个生命周期内收到更新。不过,如果决定自行管理您的应用签名密钥,您应该注意以下几点事项:

签名注意事项

在应用的预期生命周期内,您应该使用同一证书为应用签名。这么做的原因有多个:

  • 应用升级:当安装应用的更新时,系统会比较新版本和现有版本中的证书。如果证书匹配,则系统允许更新。如果使用不同的证书为新版本签名,您必须为应用分配另一个软件包名称 - 在此情况下,用户会将新版本作为全新应用进行安装。
  • 应用模块化:Android 允许通过同一证书签名的多个 APK 在同一个进程中运行(如果应用请求这样),以便系统将其视为单个应用。通过此方式,您可以按模块部署您的应用,并且用户可以独立更新每个模块。
  • 通过权限共享代码/数据:Android 提供基于签名的权限执行,以便应用可以将功能展示给使用指定证书签名的另一应用。通过使用同一个证书为多个 APK 签名并使用基于签名的权限检查功能,您的应用可以采用安全的方式共享代码和数据。

如果您计划支持应用升级,请确保您的应用签名密钥的有效期超出此应用的预期生命周期。建议有效期为 25 年或以上。当密钥有效期过期后,用户将不能再无缝升级到新版本。

如果您计划在 Google Play 上发布您的应用,您用于为这些应用签名的密钥的有效期必须在 2033 年 10 月 22 日以后结束。Google Play 强制执行此要求,以确保在新版本可用时,用户可以无缝升级应用。

保障密钥的安全

如果您选择自行管理和保护自己的应用签名密钥和密钥库(而不是选择加入 Google Play 应用签名计划),则保障应用签名密钥的安全对于您和用户而言都非常重要。如果您允许某人使用您的密钥,或者将您的密钥库和密码放在了不安全的地方,以致于第三方可以找到和使用相应信息,则会损害您的作者身份和用户对您的信任。

如果某个第三方在您不知情或未经授权的情况下设法取得您的密钥,此人可能会为应用签名并进行分发,从而恶意替换您的原版应用或损坏它们。另外,此人还可能利用您的身份为应用签名并进行分发,从而攻击其他应用或系统本身,或者损坏或窃取用户数据。

您应用的所有将来版本都需要使用您的私钥签名。如果密钥丢失或存放不当,您将无法发布现有应用的更新。您无法重新生成以前生成的密钥。

您作为开发者实体的声誉取决于您能否每时每刻正确保护您的应用签名密钥,直至密钥过期。以下是有关如何保障密钥安全的一些提示:

  • 为密钥库和密钥选择安全系数高的密码。
  • 请勿将您的私钥赠与或借给任何人,也不要让未经授权的人员知道您的密钥库和密钥密码。
  • 将包含私钥的密钥库文件存放在安全可靠的地方。

通常情况下,只要您在生成、使用和存储密钥时遵循通用的注意事项,就可以保障密钥的安全。

从编译文件中移除签名信息

在您创建签名配置时,Android Studio 会以纯文本形式将您的签名信息添加到模块的 build.gradle 文件中。如果您通过团队协作开发项目或者要将您的代码开源,那么您应该将此敏感信息从编译文件中移出,以免被其他人轻易获取。为此,您应该创建一个单独的属性文件来存储安全信息并在您的编译文件中引用此文件,具体步骤如下所示:

  1. 创建一个签名配置,并将其分配到一个或多个编译类型。这些说明假设您已经按照上面配置编译流程以自动为应用签名部分所述,为发布版本类型配置了一个签名配置。
  2. 在项目的根目录下创建一个名为 keystore.properties 的文件。此文件应该包含您的签名信息,具体代码如下所示:
        storePassword=myStorePassword
        keyPassword=mykeyPassword
        keyAlias=myKeyAlias
        storeFile=myStoreFileLocation
        
  3. 在模块的 build.gradle 文件中,在 android {} 块的前面添加用于加载 keystore.properties 文件的代码。
        ...
    
        // Create a variable called keystorePropertiesFile, and initialize it to your
        // keystore.properties file, in the rootProject folder.
        def keystorePropertiesFile = rootProject.file("keystore.properties")
    
        // Initialize a new Properties() object called keystoreProperties.
        def keystoreProperties = new Properties()
    
        // Load your keystore.properties file into the keystoreProperties object.
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
        android {
            ...
        }
    
        

    注意:您可以选择将 keystore.properties 文件存储在其他位置(例如,存储在模块文件夹中而不是项目的根文件夹中,或者如果您使用持续集成工具,也可以存储在编译服务器上)。在这种情况下,您应该修改上面的代码,以使用实际的 keystore.properties 文件的位置正确初始化 keystorePropertiesFile

  4. 您可以使用语法 keystoreProperties['propertyName'] 引用存储在 keystoreProperties 中的属性。修改模块的 build.gradle 文件的 signingConfigs 块,以便使用此语法引用存储在 keystoreProperties 中的签名信息。
        android {
            signingConfigs {
                config {
                    keyAlias keystoreProperties['keyAlias']
                    keyPassword keystoreProperties['keyPassword']
                    storeFile file(keystoreProperties['storeFile'])
                    storePassword keystoreProperties['storePassword']
                }
            }
            ...
          }
        
  5. 打开 Build Variants 工具窗口,并确保已选择发布版本类型。
  6. 选择 Build > Build Bundle(s) / APK(s) 下的选项,编译您的发布版本的 APK 或 app bundle。您应该会在模块的 build/outputs/ 目录中看到相应编译输出。

由于您的编译文件不再包含敏感信息,您现在可以将其包含在源代码控制系统中或者上传到共享的代码库。请务必保障 keystore.properties 文件的安全。您可能需要将其从您的源代码控制系统中移除。