signingConfigs 是用来配置签名的信息, 该方法的参数为 NamedDomainObjectContainer<SigningConfig>

NamedDomainObjectContainer<T> 修饰的变量, 当我们在 gradle 中配置内容时, 我们可以定义一个代码块, 代码块的名字就是一个类名, 该类名会继承自T

当定义 signingConfings 时, 可以在 signingConfings 下面定义一个代码块, 名字可以随便写, 但是做好是定义一个有意义的名字

1
2
3
4
5
6
7
8
9
10
11
android {
signingConfigs {
config {
keyAlias '*****'
keyPassword '*****'
storeFile file('../keystore/BBGKeyStore(*****).keystore')
storePassword '*****'
}
}
...
}

或者可以根据不同的包定义不同的签名信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
android {
signingConfigs {
release {
keyAlias '*****'
keyPassword '*****'
storeFile file('../keystore/BBGKeyStore(*****).keystore')
storePassword '*****'
}
debug {
keyAlias '*****'
keyPassword '*****'
storeFile file('../keystore/BBGKeyStore(*****).keystore')
storePassword '*****'
}
}
...
}

这里的 releasedebug 都是 SigningConfig 的扩展类, SigningConfig 又继承自 DefaultSigningConfig, 支持的属性如下:

属性 默认值 含义
keyAlias - 签名别名
keyPassword - 签名的密码
storeFile - 签名文件的路径
storePassword - 签名文件的密码
storeType jks 签名类型
v1SigningEnabled true 是否支持v1签名
v2SigningEnabled true 是否支持v1签名
  1. keyPasswordstorePassword

    一般情况下都会将这两个密码设置为同一个

  2. 签名后的 apk文件

    签名后的 apk 文件中会出现一个文件夹META-INF, 该文件夹中包含了三个部分:

    1. MANIFEST.MF

      该文件中保存的内容就是逐一遍历 apk 中所有的条目, 如果是目录就跳过, 如果是文件, 就是用SHA1 或者 SHA256 消息摘要算法提取出该文件的摘要然后通过 BASE64 编码后, 作为“SHA1-Digest”属性的值写入到 MANIFEST.MF 文件中的一个块中.

    2. CERT.SF

      • SHA1-Digest-Manifest-Main-Attributes:对 MANIFEST.MF 头部的块做 SHA1(或者SHA256)后再用 Base64 编码
      • SHA1-Digest-Manifest:对整个 MANIFEST.MF 文件做 SHA1(或者 SHA256)后再用 Base64 编码
      • SHA1-Digest:对 MANIFEST.MF 的各个条目做 SHA1(或者 SHA256)后再用 Base64 编码
    3. CERT.RSA

      把之前生成的 CREF.SF 文件, 用私钥计算出签名, 然后将签名以及包含公钥信息的数字证书一同写入 CERF-RSA 文件中保存.

<img src="/Users/xinxin/Desktop/截屏2020-06-25 上午11.09.27.png" alt="签名过程" style="zoom:50%;" />