前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为你的APK进行数字签名

为你的APK进行数字签名

作者头像
博文视点Broadview
发布2020-06-11 17:55:29
6300
发布2020-06-11 17:55:29
举报

小编说:我们需要为 APK进行数字签名,这样才能发布到 Google Play商店。解决方法很简单,使用 Java的 keytool命令创建证书并在 Gradle构建文件的 signingConfigs块中使用就可以办到。下面让我们看看详细讨论。 本文选自《巧用Gradle构建Android应用》

所有 Android包(APK)文件在部署之前都需要被数字签名,Android使用一个已有的密钥签发调试用的 APK。你可以使用 Java提供的 keytool命令来查看。

默认情况下,调试用的密钥存储库在你的用户目录下的 .Android子目录下面。默认的名字叫作 debug.keystore,并且其密码是 Android。下面示例显示了怎么列举默认的证书。

示例. 列举调试密钥库(Mac OS x)

代码语言:javascript
复制
> cd ~/.android
> keytool -list -keystore debug.keystore
Enter keystore password: ("android")Keystore type: JKS
Keystore provider: SUNYour keystore contains 1 entryandroiddebugkey,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被部署到连接的设备或者模拟器上时,其被用于签名调试用的 APK。

为了重设调试用的密钥库,简单地删除 debug.keystore文件,下次部署 app时会重新创建。

你不能部署一个发布版本的 app除非你对其签名了,意味着生成一个发布用的密钥。这也需要使用 keytool工具。一次很简单的运行如下所示。

示例. 生成发布密钥

代码语言:javascript
复制
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][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]: yesGenerating 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算法被用于生成公私钥对,大小为 2KB,使用 SHA256进行签名,10 000(27年多)天有效期。

你现在可以使用 jarsigner和 zipalign工具来为你的 APK签名了,但是让 Gradle来做会更容易。

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

示例. 在模块构建文件中的signingConfis块

代码语言:javascript
复制
android {
   // ... other sections ...
   signingConfigs {
      release {
          keyAlias 'my_alias'
          keyPassword 'password'
          storeFile file('/Users/kousen/keystores/myapp.keystore')
          storePassword 'password'
       }
   }
}

你可能不想将密码硬编码在构建文件中。幸运的是,你可以把它们放到 gradle.properties文件中,或者从命令行指定。

从 DSL文档中,signingConfigs块委托给一个 SigningConfig的类,其包含四个常用的属性:

keyAlias: 当签发一个特定的密钥时在 keytool中被使用。

keyPassword: 在签发过程中使用的一个特定密钥的密码。

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

storePassword: 密钥库文件自身使用的密码。

还有一个 storeType属性,但是这个属性很少使用。

为了使用新的配置,添加一个 signingConfig属性到 release构建类型。

示例. 在发布构建中使用签名配置

代码语言:javascript
复制
android {
   //其他段buildTypes {
   release {
       //其他设置
       signingConfig signingConfigs.release
       }
   }
 } android {
   //其他段
   buildTypes {
       release {
           //其他设置
           signingConfig signingConfigs.release
       }
   }
 }

当你在 Gradle中调用 assembleRelease任务的时候,构建为在 app/build/outpu/apk目录下生成一个发布版本的 APK。

示例 . 运行assembleRelease任务

代码语言:javascript
复制
> ./gradlew assembleRelease
:app:preBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
//...太多任务:app:zipalignRelease UP-TO-DATE
:app:assembleRelease UP-TO-DATEBUILD SUCCESSFULkousen 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

注意——这很重要— —不要丢失密钥库。如果丢了,你将不能发布任何关于你的 app的更新,因为所有的版本都必须要用同样的密钥签名。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博文视点Broadview 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档