赞
踩
Android要求所有APK在安装之前都必须使用证书进行数字签名。本文档介绍如何使用Android Studio签名APK,包括创建和存储证书,使用不同证书签署不同的构建配置,以及配置构建过程以自动签名APK。
公开密钥证书(也称为数字证书或身份证书)包含公共/私人密钥对的公共密钥以及标识密钥所有者的一些其他元数据(例如名称和位置)。证书的所有者保存相应的私钥。
当您签署APK时,签名工具将公钥证书附加到APK。公钥证书作为“APK”,将APK与您和您对应的私钥唯一相关联。这有助于Android确保您的APK的任何未来更新都是真实的,并且来自原作者。用于创建此证书的密钥称为应用程序签名密钥。
密钥库是包含一个或多个私钥的二进制文件。
每个应用程序必须在整个使用寿命期间使用相同的证书,以便用户能够将新版本作为应用程序的更新安装。有关在整个使用寿命期间为所有应用程序使用相同证书的更多信息,请参阅 下面的签名注意事项。
当您从IDE中运行或调试项目时,Android Studio会使用Android SDK工具生成的调试证书自动签名您的APK。首次在Android Studio中运行或调试项目时,IDE会自动创建调试密钥库和证书$HOME/.android/debug.keystore
,并设置密钥库和密钥密码。
由于调试证书是由构建工具创建的,并且设计不安全,所以大多数应用商店(包括Google Play商店)都不会接受使用调试证书签发的APK进行发布。
Android Studio会自动将您的调试签名信息存储在签名配置中,因此您每次调试时都不必输入。签名配置是一个对象,包括签名APK的所有必要信息,包括密钥库位置,密钥库密码,密钥名称和密钥密码。您无法直接编辑调试签名配置,但您可以配置如何签名发布版本。
有关如何构建和运行应用程序进行调试的更多信息,请参阅 构建和运行应用程序。
用于签署APK进行调试的自签名证书的创建日期为365天。当证书过期时,您将收到一个构建错误。
要解决这个问题,只需删除该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应用程序签名,使用Google的基础架构安全地管理和存储应用签名密钥,也可以管理和保护您自己的密钥库和应用签名密钥。
使用Google Play应用签名时,您将使用两个键:应用签名密钥和上传密钥。Google管理并保护您的应用签名密钥,并保留上传密钥,并使用它来签署您的应用以上传到Google Play商店。
当您选择使用Google Play应用签名功能时,您可以使用Google Play提供的Play Encrypt Private Key工具导出并加密您的应用签名密钥,然后将其上传到Google的基础设施。然后,您创建一个单独的上传密钥并将其注册到Google。准备发布时,您可以使用上传键签署您的应用,并将其上传到Google Play。Google然后使用上传证书验证您的身份,并使用您的应用程序签名密钥重新签名APK,如图1所示。(如果您还没有应用签名密钥,则可以在签名过程中生成一个密码,进程)
当您使用Google Play应用程式签名时,如果您丢失上传密钥,或者如果它被盗用,您可以联系Google撤销旧的上传密钥并生成一个新的密钥。由于您的应用签名密钥由Google保护,您可以继续将新版本的应用程序上传到原始应用的更新,即使您更改了上传密钥。
有关如何选择使用Google Play应用签名的详细信息,请参阅 管理应用签名密钥。
您可以选择管理自己的应用签名密钥和密钥库,而不是使用Google Play应用签名。如果您选择管理自己的应用程序签名密钥和密钥库,则负责保护密钥和密钥库。您应该为密钥库选择一个强密码,并为存储在密钥库中的每个私钥分别输入一个强密码。您必须将密钥库保存在安全可靠的位置。如果您无法访问您的应用签名密钥或密钥遭到入侵,Google无法为您检索应用签名密钥,您将无法将新版本的应用发布给用户,因为原始应用的更新。有关详细信息,请参阅下面的保护您的密钥。
如果您管理自己的应用程序签名密钥和密钥库,当您签署APK时,您将使用您的应用签名密码在本地签名,并将签名的APK直接上传到Google Play商店进行分发,如图2所示。
无论您如何选择管理密钥和密钥库,您都可以使用Android Studio手动签名您的APK(使用上传密钥或应用签名密钥),或者通过配置自己的构建过程来自动签名APK。
如果您选择管理和保护自己的应用程序签名密钥和密钥库,您将使用应用程序签名密钥对您的APK进行签名。如果您选择使用Google Play应用签名来管理和保护您的应用签名密钥和密钥库,您将使用上传密钥来签名您的APK。
您可以使用Android Studio生成应用程序签名或上传密钥,使用以下步骤:
单击创建新建以创建新密钥和密钥库。
在“ 新建密钥存储”窗口中,为密钥库和密钥提供以下信息,如图3所示。
密钥库
键
完成表单后,单击确定。
您可以使用Android Studio手动生成签名的APK,一次一个,或一次创建多个构建变体。而不是手动签名APK,您也可以配置您的Gradle构建设置,以便在构建过程中自动处理签名。本节介绍手动签名过程。有关在构建过程中签名应用程序的更多信息,请参阅配置构建过程以自动签名您的APK。
要在Android Studio中手动签名发布APK,请按照下列步骤操作:
在“ 生成签名的APK向导”窗口中,选择密钥库,私钥,然后输入两者的密码。(如果您刚刚在上一节中创建了密钥库,那么这些字段已经为您填充了。)然后单击下一步。
注意:如果您使用Google Play应用程式签名,则应在此处指定上传密钥。如果您正在管理自己的应用程序签名密钥和密钥库,则应指定应用程序签名密钥。有关详细信息,请参阅上述管理您的密钥。
在下一个窗口中,选择已签名的APK的目的地,选择构建类型(如果适用)选择产品风味,然后单击 完成。
注意:如果您的项目使用产品风味,您可以在Windows / Linux上按住Control键或Mac OSX上的 Command键时选择多种产品风味 。Android Studio将为每个选定的产品风格生成一个单独的APK。
进程完成后,您将在您上面选择的目标文件夹中找到已签名的APK。您现在可以通过Google Play商店等应用程式市场或使用您选择的机制发布已签名的APK。有关如何将已签名的APK发布到Google Play商店的详情,请参阅“开始使用发布”。要了解更多关于其他分发选项,阅读 另类的分布选项。
为了让用户成功安装应用程式的更新,您需要在整个应用程式的使用期限内使用相同的证书签署APK。有关使用相同密钥签名所有应用的其他好处,请参阅下面的签名注意事项。有关保护您的私钥和密钥库的更多信息,请参阅下面的保护密钥。
在Android Studio中,您可以通过创建签名配置并将其分配给发行版构建类型,在构建过程中自动配置您的项目以自动签名发行版APK。签名配置由密钥库位置,密钥库密码,密钥别名和密钥密码组成。要创建一个签名配置并使用Android Studio将其分配给您的发行版构建类型,请使用以下步骤:
选择您的密钥库文件,输入此签名配置的名称(您可能创建多个),然后输入所需的信息。
在签名配置下,选择刚刚创建的签名配置。
现在,每次使用Android Studio构建版本构建类型时,IDE将使用您指定的签名配置自动签名APK。您可以在build/outputs/apk/
您正在构建的模块的项目目录下的文件夹中找到您签名的APK 。
创建签名配置时,您的签名信息将以Gradle构建文件中的纯文本格式包含。如果您正在一个团队工作或公开分享您的代码,那么您应该通过将其从构建文件中删除并分开存储来保持您的签名信息的安全。您可以从构建文件中删除签名信息,了解如何从构建文件中 删除签名信息。有关保持签名信息安全的更多信息,请阅读 安全密钥。
如果您的应用程序使用产品风格,并且您希望以不同的方式签署每种风格,则可以创建其他签名配置,并通过口味进行分配:
选择您的密钥库文件,输入此签名配置的名称(您可能创建多个),然后输入所需的信息。
重复以配置任何其他产品风味。
您还可以在Gradle配置文件中指定您的签名设置。有关详细信息,请参阅配置签名设置。
如果您正在构建Android Wear应用,则该应用的签名过程可能与此页面上描述的过程不同。请参阅有关 打包和发布Android Wear应用程序的信息。
您应该在所有应用程序的预期使用寿命期内使用相同的证书签名所有的APK。有几个原因你应该这样做:
如果您计划支持应用程序的升级,请确保您的应用程序签名密钥的有效期超过了该应用的预期使用寿命。推荐25年以上的有效期。当您的密钥的有效期到期时,用户将无法再无缝地升级到新版本的应用。
如果您打算在Google Play上发布应用程式,则用于签署这些APK的密钥必须在2033年10月22日以后结束。Google Play强制执行此要求,以确保用户可以在新版本可用时无缝升级应用。如果您使用 Google Play应用程式签名,Google可确保您的应用程式已正确登入,并能在整个使用寿命期内接收更新。
如果您选择管理和保护您的应用签名密钥,并自行密码(而不是选择使用Google Play应用签名),则保护您的应用签名密钥对您和用户至关重要。如果您允许某人使用您的密钥,或者如果您将密钥库和密码留在不安全的位置,以便第三方可以找到并使用它们,则您的创作身份和用户的信任将受到损害。
注意:如果您使用Google Play应用签名,您的应用签名密钥将使用Google的基础架构保持安全。您仍然应如下所述保持您的上传密钥安全。如果您的上传密钥遭到入侵,您可以联系Google撤销并接收新的上传密钥。
如果第三方在未经您的认可或许可的情况下设法取代您的密钥,那么该用户可以签署并分发恶意替换您的正版应用程序或将其破坏的应用程序。这样的人也可以根据您的身份签署和分发攻击其他应用或系统本身的应用,或损坏或窃取用户数据。
您的私人密钥是签名所有未来版本的应用程序所必需的。如果丢失或错位您的密钥,您将无法发布现有应用的更新。您无法重新生成以前生成的密钥。
您作为开发人员实体的声誉取决于您在任何时候正确保护您的应用签名密钥,直到密钥过期。这里有一些提示,以保护您的钥匙安全:
一般来说,如果您在生成,使用和存储密钥时遵循常识性注意事项,则它将保持安全。
创建签名配置时,Android Studio会将您的签名信息以纯文本形式添加到模块的build.gradle
文件中。如果您正在与团队合作或开源代码,您应该将这些敏感信息从构建文件中移出,以便其他人不容易访问。为此,您应该创建一个单独的属性文件来存储安全信息,并在构建文件中引用该文件,如下所示:
keystore.properties
在项目的根目录中命名的文件。此文件应包含您的签名信息,如下所示: storePassword = myStorePassword keyPassword = mykeyPassword keyAlias = myKeyAlias storeFile = myStoreFileLocation
build.gradle
文件中,添加代码以keystore.properties
在android {}
块之前加载 文件。 ... //创建一个名为keystorePropertiesFile的变量,并在rootProject文件夹中将其初始化为// keystore.properties文件。def keystorePropertiesFile = rootProject 。file (“keystore.properties” )//初始化一个名为keystoreProperties的新的Properties()对象。def keystoreProperties = new Properties ()//将您的keystore.properties文件加载到keystoreProperties对象中。密钥库属性。load (new FileInputStream (keystorePropertiesFile ))android { ... }
注意:您可以选择将keystore.properties
文件存储 在另一个位置(例如,在模块文件夹中,而不是项目的根文件夹,或者在使用连续集成工具的情况下,在构建服务器上)。在这种情况下,您应该keystorePropertiesFile
使用实际 keystore.properties
文件的位置来修改上述代码以正确初始化 。
keystoreProperties
使用语法存储的属性。修改模块的文件块, 以引用使用此语法存储的签名信息 。keystoreProperties['propertyName']
signingConfigs
build.gradle
keystoreProperties
android { signatureConfigs { config { keyAlias keystoreProperties [ 'keyAlias' ] keyPassword keystoreProperties [ 'keyPassword' ] storeFile文件(keystoreProperties [ 'storeFile' ]) storePassword keystoreProperties [ 'storePassword' ] } } ... }
build/outputs/apk/
您的模块目录中创建了一个已签名的APK 。因为您的构建文件不再包含敏感信息,您现在可以将它们包含在源代码控制中或将其上传到共享代码库。确保保持keystore.properties
文件的安全。这可能包括从源控制系统中删除它。
您不需要Android Studio签署您的应用程序。您可以使用该apksigner
工具从命令行签名应用程序,也可以在构建过程中配置Gradle为您签名。无论哪种方式,您都需要先使用私钥生成keytool
。例如:
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA-keysize 2048 -validity 10000 -alias我的别名
注意: keytool
位于bin/
JDK 中的目录中。要从Android Studio找到您的JDK,请选择文件>项目结构,然后单击SDK位置,您将看到JDK位置。
此示例提示您输入密钥库和密钥的密码,并提供密钥的可分辨名称字段。然后,它将生成密钥库作为一个文件my-release-key.jks
,将其保存在当前目录中(您可以随意移动它)。密钥库包含一个有效期为10,000天的单个密钥。
现在,您可以构建一个未签名的APK,并手动签名,或者配置Gradle来签署APK。
assembleRelease
任务: 毕业组合
这将创建一个名为APK module_name-unsigned.apk
在 。此时APK 无符号且未对齐,只有使用私钥签名才能安装APK 。project_name/module_name/build/outputs/apk/
使用zipalign
以下命令对齐未签名的APK :
zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk
zipalign
确保所有未压缩的数据以相对于文件开头的特定字节对齐开始,这可能减少应用程序消耗的RAM量。
用您的私钥使用apksigner
以下方式签名您的APK :
apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
这个例子签署的APK在输出my-app-release.apk
与被存储在单个密钥库文件的私钥和证书签名之后:my-release-key.jks
。
该apksigner
工具支持其他签名选项,包括使用单独的私钥和证书文件签名APK文件,并使用多个签名者签名APK。有关详细信息,请参阅apksigner
参考。
注意:要使用该apksigner
工具,必须安装Android SDK Build Tools的版本为24.0.3或更高版本。您可以使用SDK Manager更新此软件包。
验证您的APK是否已签名:
apksigner验证我的app-release.apk
build.gradle
文件,并添加 signingConfigs {}
与条目块storeFile
, storePassword
,keyAlias
和 keyPassword
,再传递对象到signingConfig
您的构建类型属性。例如: android { ... defaultConfig { ... } signatureConfigs { release { storeFile file (“my-release-key.jks” ) storePassword “password” keyAlias “my-alias” keyPassword “password” } } buildTypes { release { signatureConfig signingConfigs 。发布... } } }
因为Gradle读取相对于该路径的路径build.gradle
,所以上述示例仅my-release-key.jks
在与该build.gradle
文件位于同一目录中时才起作用。
注意:在这种情况下,build.gradle
文件中可以直接看到密钥库和密钥密码。为了提高安全性,您应该从构建文件中删除签名信息。
assembleRelease
任务: 毕业组合
这将创建一个名为APK module_name-release.apk
在 。该APK文件使用您的文件中指定的私钥进行签名, 并与之对齐。project_name/module_name/build/outputs/apk/
build.gradle
zipalign
现在,您已使用签名密钥配置发布版本,“安装”任务可用于该构建类型。因此,您可以在模拟器或设备上构建,对齐,签名和安装版本APKinstallRelease
。
用您的私钥签名的APK可以分发,但您应该首先阅读有关如何发布应用程序并查看Google Play启动清单的更多信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。