Android签名打包、密钥库、密钥全面解析

前言

Android要求所有的应用必须进行数字签名才可以发布,也就是我们平时所说的使用证书打包然后上传市场。这个签署的过程又包括创建和存储证书,使用不同证书签署不同的构建配置,及自动签署过程。


重要的角色:证书和密钥库
公钥证书又称为数字证书和身份证书包含公钥/私钥对的公钥,以及可以标识密钥所有者的一些其他元素,例如名称和位置,证书持有者持有对应的私钥


在签署工具签署我们的APP时,会自动将我们的公钥证书附加到APK中,并且关联到该证书的持有者及持有者拥有的对应私钥,这样就保证了应用的每次更新都来自原创者。
用于创创建此公钥证书的密钥称为应用签名密钥,也就是我们所说的密钥。


签署调试构建(即我们平时所说的Debug)

从IDE中运行或调试我们的项目时,Android Studio将自动使用通过Android SDK工具生成的调试证书签署我们的APK,当我们在 Android Studio 中首次运行或调试项目时,IDE 将自动在 $HOME/.android/debug.keystore(~/.android/(OS X 和 Linux)
C:\Documents and Settings\.android\(Windows XP)
C:\Users\.android\ (Windows Vista,Windows 7、8 和 10)) 中创建调试密钥库和证书,并设置密钥库和密钥密码。
Android Studio会自动将我们的调试签署信息存储到签署配置中,因此我们不必每次调试时都输入相关信息。签署配置是一种包含签署APK所需全部必要信息的对象,这些信息包括密钥库位置、密钥库密码、密钥名称和密钥密码
运行手后生成的APK目录:项目位置-app-build-outputs-apk下


调试证书的有效期

Google将调试签署 APK 的自签署证书的有效期设置为365天,从构建该yingyong之日起,一旦到期,将会收到一个构建错误,要想修复次问题,必须删除上面所说的第一次构建时产生的debug.keystore文件,当您下次构建和运行调试构建类型时,这些构建工具将重新生成新的密钥库和调试密钥。请注意,您必须运行应用,单纯的构建不会重新生成密钥库和调试密钥。


创建密钥和密钥库

Android Studio 生成应用签名或上传密钥,步骤如下:

  • 1.在菜单栏中 点击Build->Generate Signed APK
  • 2.点击create new创建一个新的密钥和密钥库
  • 3.在new key store窗口上,为密钥和密钥库配置以下信息

    Android签名打包、密钥库、密钥全面解析_第1张图片

  • Key store path:创建密钥库的位置

  • Password:为密钥库创建一个安全的密码
  • 密钥: Alias:为密钥输入一个标识名
  • Password:为密钥创建一个并确认安全的密码(此密码应当与密钥库的密码不同)
  • Validity (years):以年为单位设置密钥的有效时长。密钥的有效期应至少为 25
    年,以便您可以在应用的整个生命期内使用相同的密钥签署应用更新。
  • Certificate:为证书输入一些关于您自己的信息。此信息不会显示在应用中,但会作为 APK 的一部分包含在您的证书中

    然后点击OK,这样我们的密钥库和密钥就生成了,然后就可以用来签署我们的APK了


签署APK

使用Android Studio可以一次签署单个或多个APK,当然我们也可以将Gradle构建设置配置为在构建流程期间自动处理签署。

  • 1.点击 Build > Generate Signed APK 以打开 Generate Signed APK 窗口。(如果您刚刚按上述说明生成了一个密钥和密钥库,则此窗口已处于打开状态。)
  • 2.在 Generate Signed APK Wizard 窗口上,选择一个密钥库和一个私钥,并为它们输入密码。(如果您刚刚在上一部分中创建密钥库,这些字段将自动填充。)然后,点击 Next
  • 3.在下一个窗口上,为签署的 APK 选择一个目的地、选择构建类型、选择产品风味(如果适用,即我们平时所说的发布平台),然后点击 Finish 注:Android Studio 将为选择的每个产品风味生成单独的 APK。
  • Android签名打包、密钥库、密钥全面解析_第2张图片
    Android签名打包、密钥库、密钥全面解析_第3张图片

配置构建流程自动签署APK

在Android Studio中我们可以创建一个签署配置并分配至发布构建类型,这样就可以将我们的项目配置为在构建流程中自动签署并发布APK。一个签署配置包括一个密钥库(jks文件)的位置,密钥库的密码(Key Store password),密钥别名(Key alias),密钥密码(key password),要使用Android Studio创建一个签署配置并分配至发布构建类型,须按以下步骤:

  • 1.在 Project 窗口中,右键点击您的应用并点击 Open Module Settings。
  • 2.在 Project Structure 窗口左面板中的 Modules 下,点击您想要签署的模块。
  • 3.点击 Signing 标签,然后点击 Add。
  • 4.选择您的密钥库文件,为此签署配置输入一个名称(因为您可能创建多个配置),然后输入所需的信息。
  • 5.点击 Build Types 标签。
  • 6.点击 release 构建。
  • 7.在 Signing Config 下,选择您刚创建的签署配置
    Android签名打包、密钥库、密钥全面解析_第4张图片
    在您创建签署配置时,您的签署信息将以纯文本形式包含到 Gradle 构建文件中。如果您是团队协作开发或者公开分享自己的代码,那么您应当从构建文件中移除签署信息并将其单独存储,从而确保此信息的安全。

签署不同市场

如果我们的应用在发布在不同的市场并且以各自的方式签署发布,那我们可以创建更多的签署配置并分配给对应的市场:

在 Project 窗口中,右键点击您的应用并点击 Open Module Settings。

  • 1.在 Project Structure 窗口左面板中的 Modules 下,点击您想要签署的模块。
  • 2.点击 Signing 标签,然后点击 Add
  • 3.选择您的密钥库文件,为此签署配置输入一个名称(因为您可能创建多个配置),然后输入所需的信息。
  • 4.选择您的密钥库文件,为此签署配置输入一个名称(因为您可能创建多个配置),然后输入所需的信息。
  • 5.如果需要,请重复第 3 步和第 4 步,直到您完成所有签署配置的创建。
  • 6.点击 Flavors 标签。
  • 7.点击您想要配置的风味,然后从 Signing Config 下拉菜单中选择合适的签署配置。
    比如:我们使用之前配置的config签署小米市场
    Android签名打包、密钥库、密钥全面解析_第5张图片

签署注意事项

为什么在软件的生命周期内要使用相同的证书签署应用呢?原因如下:

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

从配置文件中移除签署信息

在我们创建签署信息时,Android Studio会以纯文本的形式将签署信息添加到模块的build.gradle文件中,如果您是团队协作开发或者将您的代码开源,那么您应当将此敏感信息从构建文件中移出,以免被其他人轻易获取。为此,您应创建一个单独的属性文件来存储安全信息并按以下步骤操作,在您的构建文件中引用该文件:

  • 1.创建一个签署配置,并将其分配至一个或多个构建类型。这些说明假设您已经按照上面配置构建流程以自动签署您的 APK 部分所述,为发布构建类型配置了一个签署配置。
  • 2.在项目的根目录下创建一个名为 keystore.properties 的文件。此文件应当包含您的签署信息,如下所示:
storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

Android签名打包、密钥库、密钥全面解析_第6张图片
Android签名打包、密钥库、密钥全面解析_第7张图片
- 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 {
    ...
}

Android签名打包、密钥库、密钥全面解析_第8张图片
- 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 APK 以构建您的发布构建,并确认 Android Studio 已在模块的 build/outputs/apk/ 目录中创建一个签署的 APK。
    由于您的构建文件不再包含敏感信息,您现在可以将其包含在源控制中或者上传到共享的代码库。务必保证 keystore.properties
    文件的安全。您可能需要将其从您的源控制系统中移除。

以上就是小白对签署应用做的一些总结,希望对大家有所帮助!后面小白会介绍如何从命令行签署一个应用!

你可能感兴趣的:(Android开发)