签署您的应用
Android 要求所有 APK 必须先使用证书进行数字签署,然后才能安装。 此外,您需要先签署您的Android App Bundle,才能将其上传到Play 管理中心。
本文档介绍如何使用Android Studio 签署您的 APK 或应用软件包,包括创建和存储证书、使用不同证书签署不同的构建配置,以及配置构建流程以自动签署您的 APK。
证书和密钥库
公钥证书(也称为数字证书或身份证书)包含公钥/私钥对的公钥,以及标识密钥所有者的一些其他元数据(例如名称和位置)。 证书的所有者持有对应的私钥。
在您签署 APK 时,签署工具会将公钥证书附加到 APK(在签署应用软件包时也是如此)。 公钥证书充当“指纹”,用于将 APK 或应用软件包唯一关联到您及您的对应私钥。 这有助于 Android 确保应用将来的所有更新都是原版更新且来自原始作者。 用于创建此证书的密钥称为应用签名密钥。
密钥库是一种包含一个或多个私钥的二进制文件。
每个应用在其整个生命周期内必须使用相同证书,以便用户能够以应用更新的形式安装新版本。 如需了解有关所有应用在其整个生命周期内使用相同证书的好处的详细信息,请参阅下面的签署注意事项 。
签署您的调试构建
从 IDE 中运行或调试您的项目时,Android Studio会使用 Android SDK 工具所生成的调试证书自动签署您的应用。 首次在 Android Studio 中运行或调试您的项目时,IDE 会在 $HOME/.android/debug.keystore
中自动创建调试密钥库和证书,并设置密钥库和密钥密码。
由于调试证书是由构建工具创建并且设计上不安全,因此大多数应用商店(包括 Google Play 商店)都不接受使用调试证书签署发布的 APK 或应用软件包。
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)
下次构建和运行调试构建类型时,这些构建工具将重新生成新的密钥库和调试密钥。 请注意,您必须运行应用,只进行构建不会重新生成密钥库和调试密钥。
管理您的密钥
由于您的应用签名密钥用于验证您作为开发者的身份,并确保为您的用户进行无缝而安全的更新,因此,管理和保护您的密钥对于您和您的用户而言都非常重要。 您可以选择使用 Google Play 的 App Signing 以利用 Google 的基础架构安全地管理和存储您的应用签名密钥,也可以选择自行管理和保护您的密钥库和应用签名密钥。
选择使用 Google Play 的 App Signing,您将获得以下好处:
- 确保应用签名密钥不会丢失。 应用签名密钥丢失,意味着无法更新应用,因此切勿丢失密钥。
- 确保应用签名密钥不被泄露。 恶意攻击者会利用泄露的密钥以已安装应用更新的形式部署应用的恶意版本。 使用 Play App Signing 时,开发者只需管理上传密钥即可,密钥可在丢失和泄露时进行重置。 若密钥泄露,攻击者还需访问开发者帐号才能执行恶意操作。
使用 Google Play 的 App Signing
使用 Google Play 的 App Signing 时,Google 会为您管理和保护应用签名密钥,并使用此密钥签署要分发的 APK。 而且,由于应用软件包会延迟在 Google Play 商店上构建和签署 APK,您需要先注册 Google Play 的 App Signing 才能上传您的应用软件包。
使用 Google Play 的 App Signing 时,您将使用两个密钥:应用签名密钥和上传密钥。 您需要保管上传密钥,并用其签署您的应用,以便将应用上传到 Google Play 商店。
当您选择使用 Google Play 的 App Signing 时,需要使用 Google Play 提供的 Play Encrypt Private Key 工具导出您的应用签名密钥并对其加密,然后将其上传到 Google 的基础架构。 然后,您可创建一个单独的上传密钥并向 Google 注册该密钥。 当您准备发布应用时,可使用上传密钥签署您的应用并将其上传到 Google Play。 Google 随后会使用上传证书验证您的身份,并使用您的应用签名密钥签署要分发的 APK,如图 1 所示。(如果您还没有应用签名密钥,可在注册过程中生成密钥。)
图 1. 使用 Google Play 的 App Signing 签署应用
当您使用 Google Play 的 App Signing 时,如果丢失上传密钥,或者泄露此密钥,可以联系 Google 撤销您原来的上传密钥并生成一个新的上传密钥。 由于您的应用签名密钥受 Google 保护,因此即使您更改了上传密钥,也可以继续以原始应用更新的形式上传应用的新版本。
如需了解有关如何选择使用 Google Play 的 App Signing 的详细信息,请参阅管理您的应用签名密钥。
自行管理您的密钥和密钥库
您可以选择自行管理您的应用签名密钥和密钥库,而不必使用 Google Play 的 App Signing。 如果您选择自行管理您的应用签名密钥和密钥库,则需负责保护该密钥和密钥库的安全。 此外,如果不注册 Google Play 的 App Signing,则无法上传 Android App Bundle。
如果准备自行创建密钥和密钥库,请确保先为密钥库选择一个强密码,然后为密钥库中存储的每个私钥选择一个单独的强密码。 您必须将密钥库存放在安全可靠的地方。 如果您无法访问您的应用签名密钥,或者已泄露您的密钥,Google 无法为您检索此应用签名密钥,并且您将无法以原始应用更新的形式向用户发布应用的新版本。 如需了解详细信息,请参阅下面的保护您的密钥。
如果您自行管理您的应用签名密钥和密钥库,则在签署您的 APK 时,您需使用您的应用签名密钥在本地进行签署,并将已签署的 APK 直接上传到 Google Play 商店进行分发,如图 2 所示。
图 2. 自行管理应用签名密钥时签署应用
生成密钥和密钥库
如果尚无应用签名密钥或上传密钥,您可使用 Android Studio 生成密钥,步骤如下:
- 在菜单栏中,点击 Build >Build > Generate Signed Bundle/APK。
- 在 Generate Signed Bundle or APK 对话框中,选择Android App Bundle 或 APK,然后点击 Next。
在 Key store path 字段下面,点击 Create new。
在 New Key Store 窗口上,为您的密钥库和密钥提供以下信息,如图 3 所示。
图 3. 在 Android Studio 中创建新的密钥库。
密钥库
- Key store path:选择创建密钥库的 位置。
Password:为您的密钥库创建并确认安全的密码。
密钥Alias:为您的密钥输入一个标识名。
- Password:为您的密钥创建并确认安全的密码。此密码应当与您为密钥库选择的密码不同。
- Validity (years):以年为单位设置密钥的有效时长。密钥的有效期应至少为 25 年,以便您可以在应用的整个生命期内使用相同的密钥签署应用更新。
- Certificate:为证书输入一些关于您自己的信息。此信息不会显示在应用中,但会作为 APK 的一部分包含在您的证书中。
填写完表单后,请点击 OK。
- 如果您想生成使用您的新密钥签署的 APK,则继续转到签署要发布的应用,如果您只想生成密钥和密钥库而不签署 APK,则点击 Cancel。
- 如果您想选择使用 Google Play 的 App Signing,则转到管理您的应用签名密钥,并按照说明设置 Google Play 的 App Signing。
签署要发布的应用
不管您选择如何管理您的密钥和密钥库,或者是否想要构建 APK 或应用软件包,都可以使用 Android Studio 通过上传密钥或应用签名密钥签署您的应用:
- 如果您选择自行管理和保护您的应用签名密钥和密钥库,则应使用您的应用签名密钥签署您的应用。
如果您选择使用 Google Play 的 App Signing 管理和保护您的应用签名密钥和密钥库,则应使用您的上传密钥签署您的应用。
要在 Android Studio 中签署要发布的 APK,请按以下步骤操作:点击 Build > Generate Signed Bundle/APK。
- 在 Generate Signed Bundle or APK 对话框中,选择Android App Bundle 或 APK,然后点击 Next。
- 从下拉菜单中选择一个模块。
- 如果您已准备好签署信息,则选择一个密钥库、一个私钥,然后输入二者的密码。 否则,请先生成密钥和密钥库,然后返回完成此步骤。
注:如果是使用 Google Play 的 App Signing,则应在此指定您的上传密钥。 如果是自行管理您的应用签名密钥和密钥库,则应指定您的应用签名密钥。 如需了解详细信息,请参阅上面的管理您的密钥。
图 4. 在 Android Studio 中选择一个私钥。
- 如果是构建应用软件包,则可通过勾选 Export encrypted key 旁的方框,让 Android Studio 将您的签名密钥也另存为加密文件。 为能上传您的应用软件包并利用动态交付,您需要将此加密文件上传到 Play 管理中心,并注册 Google Play 的 App Signing。
- 点击 Next。
- 在下一个窗口上,为签署的 APK 或应用软件包选择目的地,选择构建类型,选择产品风格(如果适用),然后点击 Finish。
图 5. 针对所选产品风格生成签署版应用。
注:如果您的项目使用多种产品风格,则可在按住 Control 键(在 Windows/Linux 上)或按住 Command 键(在 Mac OSX 上)的同时选择多种产品风格。 Android Studio 会针对您选择的每种产品风格生成单独的 APK 或应用软件包。
在 Android Studio 构建完您的签名应用后,您可通过在弹出通知中点击相应的选项来找到或分析您的应用。 如果已选择导出签名密钥的选项,则可通过点击弹出窗口右下角的下拉箭头将其展开,然后点击 Show Exported Key File,快速导航至该密钥,如图 6 所示。
图 6. 在 IDE 生成您的签名应用软件包后,点击弹出窗口中的链接可分析或找到您的应用软件包,或找到导出的签名密钥。
您现可通过 Google Play 商店等应用市场,或使用您选择的机制分发您签署的应用。 如需了解有关如何将签署的 APK 发布到 Google Play 商店的详细信息,请参阅开始发布。 如需了解有关其他分发选项的详细信息,请参阅替代分发选项。
为让用户将更新成功安装到您的应用中,您需要在应用的生命周期内使用相同的证书签署应用。 如需了解有关使用相同密钥签署所有应用的各种好处的详细信息,请参阅下面的签署注意事项。 如需了解有关保护您私钥和密钥库的详细信息,请参阅下面的保护您的密钥。
配置构建流程以自动签署您的应用
在 Android Studio 中,您可以通过创建签署配置并将其分配至您的发布构建类型,将您的项目配置为在构建流程中自动签署应用的发布版本。 签署配置包含密钥库位置、密钥库密码、密钥别名和密钥密码。 要使用 Android Studio 创建签署配置并将其分配至您的发布构建类型,请完成以下步骤:
- 在 Project 窗口中,右键点击您的应用,然后点击 Open Module Settings。
- 在 Project Structure 窗口左侧面板的 Modules 下,点击您要签署的模块。
- 点击 Signing 标签,然后点击 Add。
选择您的密钥库文件,为此签署配置输入一个名称(因为您可以创建多个配置),然后输入所需信息。
图 7. 用于创建新签署配置的窗口。点击 Build Types 标签。
- 点击 release 构建。
在 Signing Config 下,选择您刚创建的签署配置。
图 8. 在 Android Studio 中,选择一个签署配置。点击 OK。
现在,您每次在 Android Studio 中选择Build > Build Bundle(s) / APK(s) 下的选项构建您的发布构建类型时,IDE都会使用您指定的签署配置自动签署您的应用。 您可以在所构建模块项目目录内的build/outputs/
目录中找到签署的 APK 或应用软件包。在创建签署配置时,您的签署信息以纯文本形式包含在 Gradle 构建文件中。 如果是团队协作开发或者公开分享自己的代码,您应从构建文件中移除签署信息并将其单独存储,从而确保此信息的安全。 如需了解有关如何从构建文件中移除您的签署信息的详细信息,请参阅从您的构建文件中移除签署信息。 如需了解有关保证签署信息安全的详细信息,请参阅保护您的密钥。
以不同方式签署每种产品风格
如果您的应用使用多种产品风格并且您想要以不同方式签署每种风格,则可以创建更多签署配置并将其按风格分配:
- 在 Project 窗口中,右键点击您的应用,然后点击 Open Module Settings。
- 在 Project Structure 窗口左侧面板的 Modules 下,点击您要签署的模块。
- 点击 Signing 标签,然后点击 Add。
选择您的密钥库文件,为此签署配置输入一个名称(因为您可以创建多个配置),然后输入所需信息。
图 9. 用于创建新签署配置的窗口。如果需要,请重复第 3 步和第 4 步,直到您创建完所有签署配置。
- 点击 Flavors 标签。
点击您想要配置的风格,然后从 Signing Config 下拉菜单中选择合适的签署配置。
图 10. 按产品风格配置签署设置。重复操作以配置任何其他产品风格。
点击 OK。
您还可以在 Gradle 配置文件中指定您的签署设置。 如需了解详细信息,请参阅配置签署设置。
签署 Wear OS 应用
如果您构建的是 Wear OS 应用,则签署此应用的流程不同于本页面上介绍的流程。 如需了解相关信息,请参阅打包和发布 Wear OS 应用。
签署注意事项
在应用的预期生命周期内,您应使用相同证书签署应用。 这样做有多种原因:
- 应用升级:当系统安装应用的更新时,会比较新版本和现有版本中的证书。 如果证书匹配,则系统允许更新。 如果您使用不同的证书签署新版本,则必须为应用分配不同的软件包名称,在此情况下,用户将新版本作为全新应用进行安装。
- 应用模块化:Android 允许通过相同证书签署的多个 APK 在同一进程中运行(如果应用这样请求),以便系统将其视为单个应用。 通过此方式,您可以在模块中部署您的应用,且用户可以独立更新每个模块。
通过权限共享代码/数据:Android 提供强制执行基于签名的权限功能,以便应用可以将功能展示给使用指定证书签署的其他应用。 通过使用相同证书签署多个 APK 并使用基于签名的权限检查功能,您的应用可采用安全的方式共享代码和数据。
如果您计划支持升级应用,请确保您的应用签名密钥的有效期超出该应用的预期生命周期。 建议有效期为 25 年或更长时间。 当密钥有效期过期后,用户不能再无缝升级到应用的新版本。如果您计划在 Google Play 上发布您的应用,则用于签署应用的密钥的有效期必须在 2033 年 10 月 22 日之后结束。Google Play 强制执行此要求,以确保在新版本可用时,用户可以无缝升级应用。 如果使用 Google Play 的 App Signing,则 Google 可确保正确签署您的应用,并且这些应用在其整个生命周期内均可收到更新。
保护您的密钥
如果您选择自行管理和保护您的应用签名密钥和密钥库(而不是选择使用 Google Play 的 App Signing),则保护您的应用签名密钥对于您和用户而言都非常重要。 如果您允许某人使用您的密钥,或者将您的密钥库和密码放在不安全的地方,以致第三方可以找到和使用它们,则会损害您的作者身份以及用户对您的信任。
注:如果使用 Google Play 的 App Signing,则可使用 Google 的基础架构保障您应用签名密钥的安全。 您还应按以下所述方式保证您上传密钥的安全。 如果您的上传密钥被泄露,您可以联系 Google 撤销密钥,并且您会收到一个新的上传密钥。
如果某第三方未经您确认或授权而设法取得您的密钥,此人可能会签署和分发应用,恶意替换或损坏您的原版应用。 另外,此人还可能以您的身份签署和分发应用,从而攻击其他应用或系统本身,或者损坏或窃取用户数据。
签署您应用的所有未来版本时都需要使用私钥。 如果您的密钥丢失或存放不当,您将无法发布现有应用的更新。 您无法重新生成之前生成的密钥。
作为开发者实体,您的声誉取决于您能否始终正确保护您的应用签名密钥,直至密钥过期。 下面是保证密钥安全的一些提示:
- 为密钥库和密钥选择强密码。
- 勿将您的私钥给予或借给任何人,也不要让未经授权的人员知道您的密钥库和密钥密码。
- 将包含私钥的密钥库文件存放在安全可靠的地方。
通常情况下,只要您在生成、使用和存储密钥时遵循通用的注意事项,就可以保障密钥的安全。
从您的构建文件中移除签署信息
在创建签署配置时,Android Studio 会以纯文本形式将您的签署信息添加到模块的 build.gradle
文件中。 如果是团队协作开发或者将您的代码开源,您应将此敏感信息从构建文件中移出,以免他人轻易获取。 为此,您应按以下步骤创建单独的属性文件来存储安全信息,并在您的构建文件中引用该文件:
- 创建一个签署配置,并将其分配至一个或多个构建类型。 这些说明假设您已按上文配置构建流程以自动签署您的应用中所述,为发布构建类型配置一个签署配置。
- 在项目的根目录下创建一个名为
keystore.properties
的文件。 此文件应包含您的签署信息,如下所示:
- storePassword=myStorePassword
- keyPassword=mykeyPassword
- keyAlias=myKeyAlias
- storeFile=myStoreFileLocation
- 在模块的
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
。
- 您可以使用语法
keystoreProperties['propertyName']
引用 存储在keystoreProperties
中的属性。 您可以修改模块build.gradle
文件的signingConfigs
块,以便使用此语法引用存储在keystoreProperties
中的签署信息。
- android {
- signingConfigs {
- config {
- keyAlias keystoreProperties['keyAlias']
- keyPassword keystoreProperties['keyPassword']
- storeFile file(keystoreProperties['storeFile'])
- storePassword keystoreProperties['storePassword']
- }
- }
- ...
- }
- 打开 Build Variants 工具窗口,并确保选择发布构建类型。
- 选择 Build > Build Bundle(s) / APK(s) 下的选项,以构建您发布构建的 APK 或应用软件包。 您应看到此构建输出显示在您模块的
build/outputs/
目录下。
由于您的构建文件不再包含敏感信息,您现在可以将其加入源代码控制系统或者上传到共享代码库。 请务必保证keystore.properties
文件的安全。 您可能需要从您的源控制系统中移除此文件。
从命令行签署您的应用
不需要 Android Studio 也可以签署您的应用。 您可以通过对 APK 使用 apksigner
或对应用软件包使用 jarsigner
,从命令行签署您的应用,也可以在构建期间配置 Gradle 来签署您的应用。 无论使用哪种方式,您都需要先使用keytool
生成私钥。例如:
- keytool -genkey -v -keystore my-release-key.jks
- -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
注:keytool
位于 JDK 的 bin/
目录中。 要从 Android Studio 中查找您的 JDK,请选择 File > Project Structure,然后点击 SDK Location,您将看到 JDK location。
本示例会提示您输入密钥库和密钥的密码,并为您的密钥提供 Distinguished Name 字段。 随后会以文件形式生成名为 my-release-key.jks
的密钥库,并将其保存在当前目录中(您可以根据需要移动该密钥库)。 此密钥库包含一个有效期为 10,000 天的密钥。
现在,您可以构建一个未签署的 APK 或应用软件包并对其进行手动签署,也可以配置 Gradle 来签署您的应用。
从命令行手动签署您的应用
如果您尚未构建应用,请从命令行构建您的应用。如果您想要从命令行签署应用软件包,则可使用jarsigner
。如果您想要签署 APK,则需按以下所述使用 zipalign
和 apksigner
。
- 打开命令行(在 Android Studio 中,选择 View > Tool Windows > Terminal),然后导航至未签署 APK 所在的目录。
- 使用
zipalign
对齐未签署的 APK:
- zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk
zipalign
可以确保所有未压缩的数据首先相对于文件开头部分对齐特定字节,这样可减少应用占用的内存量。
- 使用
apksigner
通过您的私钥签署您的 APK:
- apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
在本例中,使用单密钥库文件 my-release-key.jks
中存储的私钥和证书签署 APK 后,以 my-app-release.apk
形式输出签署的 APK 。
apksigner
工具支持其他签署选项,包括使用单独的私钥和证书文件签署 APK 文件,以及通过多个签署人签署 APK。 如需了解详细信息,请参阅 apksigner
参考。
注:要使用 apksigner
工具,必须安装 Android SDK 构建工具的修订版 24.0.3 或更高版本。 您可以使用 SDK 管理器更新此软件包。
- 验证您的 APK 是否已签署:
- apksigner verify my-app-release.apk
配置 Gradle 来签署您的应用
打开模块级 build.gradle
文件,并添加带有storeFile
、storePassword
、keyAlias
和keyPassword
条目的signingConfigs {}
块,然后将该对象传递到您的构建类型中的signingConfig
属性。 例如:
android {
...
defaultConfig { ... }
signingConfigs {
release {
// You need to specify either an absolute path or include the
// keystore file in the same directory as the build.gradle file.
storeFile file("my-release-key.jks")
storePassword "password"
keyAlias "my-alias"
keyPassword "password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
...
}
}
}
注:在此情况下,可直接在 build.gradle
文件中查看密钥库和密钥密码。 为提升安全性,您应从您的构建文件中移除签署信息。
现在,通过调用 Gradle 任务从命令行构建您的应用时,Gradle 可为您签署应用(并运行 zipalign)。
此外,由于您已使用您的签名密钥配置发布构建,该构建类型还可完成“安装”任务。 因此,您可以通过 installRelease
任务在模拟器或设备上构建、对齐、签署和安装发布版 APK。
使用您的私钥签署的应用已做好分发准备,但您首先应阅读有关如何发布您的应用的详细信息,并审核 Google Play 发布核对清单。