当我们需要接入一些三方授权功能时,提供授权的平台往往需要校验我们 App 的合法性,而应用签名,就是校验应用是否合法的手段,国内像是 QQ 和微信提供的第三方登录能力,就是通过校验签名和包名来提供授权的。

在开发调试时,我们总是习惯于修改完代码后直接 Run 项目到设备上,因为打出一个 Release 包再签名这个步骤一旦重复操作,会降低我们的效率,但调试,又免不了频繁的运行。

既然无法避免,那我们能不能像平常 Debug 一样,一键把签名和 Run 都执行了呢?

首先要明确,虽然平常 Debug 我们只需要点击工具栏的「Run」按钮,项目就会编译并运行到我们的设备上,但实际上它也是进行了签名操作的。

『Android Studio』默认为我们生成了一个用于调试的签名,目录为 ~/Users/<User>/.android/debug.keystore,这样即使我们不为项目配置任何签名,项目仍能够使用这个调试签名运行到设备中。

根据我们对应用签名的经验,除了签名文件,我们还需要另外三个参数,分别是 Key store password、Key alias 和 Key password。

当然,这个用于调试的签名文件也有。其中 Key store password 和 Key password 的值都为 android,Key alias 的值为 androiddebugkey

下面,我就使用这个用于调试的签名,来实现自动签名的操作。

首先打开「Project Structure」,选择「Modules」中选择对应的 Module 配置签名,新建一个签名配置:

然后填写对应的参数:

确认后,『Android Studio』就会在对应 Module 的「build.gradle」文件中为我们生成签名信息:

android {
    ...
    signingConfigs {
        release {
            storeFile file('/Users/liarr/.android/debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
    }
}

这里我使用的是调试的签名,实际项目中一般不会配置此签名,所以相应的参数也不会一致。

最后我们还需配置:

android {
    ...
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.release
        }
        debug {
            ...
            signingConfig signingConfigs.release
        }
    }
}

这样,当我们运行项目时,它就会通过 Gradle 配置对我们的应用签名了。

实际上,你完全可以手动在 Gradle 文件中输入以上代码进行配置而无需使用「Project Structure」。

配置完成后,你甚至可以直接使用 Gradle Task 来快速生成 Debug 和 Release 的安装包。

另外,假如我们的项目存储在代码托管平台或选择开源的话,将签名信息直接明文写在 Gradle 文件中并不是一个好主意,应当创建一个单独的属性文件来存储安全信息并在编译文件中引用该文件。

比如在项目的根目录下创建一个名为「keystore.properties」的文件。此文件应当包含您的签名信息:

storePassword=android
keyPassword=android
keyAlias=androiddebugkey
storeFile=/Users/liarr/.android/debug.keystore

然后在 Gradle 文件中配置:

def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
    ...
    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            ...
            signingConfig signingConfigs.config
        }
        debug {
            ...
            signingConfig signingConfigs.config
        }
    }
}

不要忘了将签名信息加入忽略清单:

# Ignore Signing Config
/keystore.properties

这样我们的签名信息就更安全了。


参考内容