问题:
为了将APK发布到google市场,需要对APK数字签名。
解决方案:
可以使用java的keytoll命令去创建一个证书,并且在gradle配置文件的signingConfigs块使用。
讨论:
所有的APK在发布之前都必须签名。默认的,Android用一个已知的key对测试的APK进行签名。你可以使用java的keytool命令行看到。
debug的密钥存储在home目录下的一个叫.android的目录下。密钥的默认名叫debug.keysore,并且有一个android密码。
在命令行输入 cd ~/.android/,然后输入keytool -list -keystore debug.keystore,默认密码android,可以看到密钥信息:
密钥类型是JKS(Java KeyStore,公钥和私钥)。java支持另一种叫JCEKS(Java Cryptography Extensions KeyStore)的类型,这是用于共享密钥,但不是用于android应用。
这个密钥有一个别名叫androiddebugkey的用于给测试APK签名的证书。
PS:重置测试密钥,只需要删除debug.keystore,在你下次部署应用的时候,会重新生成。
你不可以发布一个没有签名的app。这也可以使用keytool。如下:
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]
你可以使用jarsigner和zipalign工具去签名APK,但是使用gradle会更简单。如:
你也许不想讲密码硬编码到build文件,你可以将它们放在gradle.properties文件中或者在命令行中设置。
在DSL文档中,signingConfigs块被委托给SigningConfig类,里面有四个常用的属性:
keyAlias:这个值在keytool签署特定的密钥时使用
keyPassword:在签名进程中使用的key的密码
storeFile:磁盘文件,包含keytool生成的keys和证书
storePassword:密钥自己使用的密码
另外有个storeType属性设置算法(默认是JKS),但是很少使用。
为了是这些配置生效,在releas下增加signingConfig属性,如下:
当你运行assembleRelease任务时,会在app/build/outputs/apk目录下生成一个发行版的APK。
有一个重要的注意事项,你必须保留密钥,否则你就不能对应用发布任何更新,因为所有版本必须要使用同一个签名。
将keystore放在一个安全的地方。这样做并不是为了加密的目的。而是为了完整性(确保APK没有被修改)和不可否认性(确保你是为一个可以对它签名的人)。如果别人得到了你的keystore,他们可以以你的名义签名别的app。