2.6版本APK签署
问题
您需要对APK进行数字签名,才能将其发布到Google Play商店。

使用Java的keytool命令创建证书并配置其在Gradle构建文件的signingConfigs块中的使用。
讨论
所有Android软件包(APK)文件在部署之前需要进行数字签名。默认情况下,Android使用已知密钥为您签名调试APK。要看到这一点,可以使用来自Java的keytool命令。
默认情况下,调试密钥库位于主目录中名为.android的子目录中。密钥库的默认名称为debug.keystore,密钥库密码为android。例2-28显示了如何列出默认证书。
实例2-28。列出调试密钥库中的密钥(Mac OS X)

> cd ~/.android
> keytool -list -keystore debug.keystore
Enter keystore password: ("android")
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
androiddebugkey, Feb 9, 2013, PrivateKeyEntry,
Certificate fingerprint (SHA1):
B7:39:B5:80:BE:A0:0D:6C:84:4F:A1:1F:4B:A1:00:14:12:25:DA:14

密钥库类型是JKS,它代表(自然足够)Java KeyStore,用于公钥和私钥。 Java支持另一种称为JCEKS(Java Cryptography Extensions KeyStore)的类型,它可用于共享密钥,但不用于Android应用程序。


密钥库有一个自签名证书,其别名为androiddebugkey,用于在部署到连接的设备或模拟器时签署调试APK。


要重置调试密钥库,只需删除文件debug.keystore。它将在下次部署应用程序时重新创建。


您无法部署应用程序的发布版本,直到您可以对其进行签名,这意味着生成发布密钥。这也使用keytool实用程序。样品运行示于实施例2-29中。


实例2-29。生成释放密钥


keytool -genkey -v -keystore myapp.keystore -alias my_alias
-keyalg RSA -keysize 2048 -validity 10000 (all on one line)
Enter keystore password: (probably shouldn't use use "password")
Re-enter new password: (but if you did, type it again)
What is your first and last name?
[Unknown]: Ken Kousen
What is the name of your organizational unit?
[Unknown]:
What is the name of your organization?
[Unknown]: Kousen IT, Inc.
What is the name of your City or Locality?
[Unknown]: Marlborough
What is the name of your State or Province?
[Unknown]: CT
What is the two-letter country code for this unit?
[Unknown]: US
Is CN=Ken Kousen, OU=Unknown, O="Kousen IT, Inc.", L=Marlborough,
ST=CT, C=US correct?
[no]: yes
Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA)
with a validity of 10,000 days for: CN=Ken Kousen, OU=Unknown,
O="Kousen IT, Inc.", L=Marlborough, ST=CT, C=US
Enter key password for <my_alias>
(RETURN if same as keystore password):
[Storing myapp.keystore]


RSA算法用于生成2K大小的公共/私有密钥对,使用SHA256算法签名,有效期为10,000天(有点超过27年)。


您现在可以使用jarsigner和zipalign工具签署您的APK,但让Gradle更容易。


作为android闭包的一个孩子,添加一个signingConfigs块,如例2-30所示。


实例2-30。模块构建文件中的signingConfigs块


android {
// ... other sections ...
signingConfigs {
release {
keyAlias 'my_alias'
keyPassword 'password'
storeFile file('/Users/kousen/keystores/myapp.keystore')
storePassword 'password'
}
}
}

您可能不想将密码作为硬编码常量放在构建文件中。幸运的是,您可以将它们放在gradle.properties文件中或在命令行中设置它们。有关详细信息,请参阅配方2.1。


从DSL文档中,signingConfigs块委托给SigningConfig类的一个实例,它具有列出的四个常用属性:


keyAlias


签名特定密钥时在keytool中使用的值


keyPassword


签名过程中使用的特定密钥的密码


storeFile


磁盘文件包含密钥和证书,由keytool生成


storePassword


用于密钥库本身的密码


还有一个storeType属性(默认为JKS,如例2-29所示),但很少使用。


要使用新配置,请向发布构建类型添加signingConfig属性(示例2-31)。


实例2-31。在发布版本中使用签名配置


android {
// ... other sections ...
buildTypes {
release {
// ... other settings ...
signingConfig signingConfigs.release
}
}
}

当你从Gradle调用assembleRelease任务时,build将在app / build / outputs / apk文件夹中生成一个release APK(例2-32)。


实例2-32。运行assembleRelease任务


> ./gradlew assembleRelease
:app:preBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
// ... lots of tasks ...
:app:zipalignRelease UP-TO-DATE
:app:assembleRelease UP-TO-DATE
BUILD SUCCESSFUL
kousen at krakatoa in ~/Documents/AndroIDstudio/MyAndroidApp
> ls -l app/build/outputs/apk
total 12088
-rw-r--r-- 1 kousen staff 1275604 Aug 24 15:05 app-debug.apk
-rw-r--r-- 1 kousen staff 1275481 Aug 26 21:04 app-release.apk


注意 - 这是重要的 - 不要丢失密钥库。如果这样做,您将无法向应用发布任何更新,因为所有版本都必须使用相同的密钥进行签名。


所有版本的应用程式都必须以相同的钥签署。否则,新版本将被视为全新的应用程序。


将密钥库放在安全的地方。是的,您正在使用自签名证书,但这不是为了加密目的。它被用于诚信(保证APK未被修改)和不可否认(保证你是唯一可以签署它的人)。如果其他人可以访问您的密钥库,他们可以使用您的名称签署其他应用。