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

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

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

  示例. 列举调试密钥库(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被部署到连接的设备或者模拟器上时,其被用于签名调试用的 APK。

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

你不能部署一个发布版本的 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?

What is the name of your State or Province?

What is the two-letter country code for this unit? 

Is CN=Ken Kousen, OU=Unknown, O="Kousen IT, Inc.", L=Marlborough,
 ST=CT, C=US correct? 

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]

What is the two-letter country code for this unit?  

Is CN=Ken Kousen, OU=Unknown, O="Kousen IT, Inc.", L=Marlborough,
 ST=CT, C=US correct? 

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算法被用于生成公私钥对,大小为 2KB,使用 SHA256进行签名,10 000(27年多)天有效期。

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

  添加 signingConfigs块作为 Android闭包的一个子块,如下所示。

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

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属性(默认为 JKS, 如示例 2-29所示),但是这个属性很少使用。 为了使用新的配置,添加一个 signingConfig属性到 release构建类型。

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

android {
     //其他段

buildTypes {
   release {
           //其他设置
           signingConfig signingConfigs.release
       }
     }
}

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

  示例. 运行assembleRelease任务

> ./gradlew assembleRelease
:app:preBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
//...太多任务
: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

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

  本文选自《巧用Gradle构建Android应用》,点此链接可在博文视点官网查看。

                      

  想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。

                       

为你的APK进行数字签名的更多相关文章

  1. 【转】Android APK的数字签名的作用和意义

    1. 什么是数字签名? 数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的     2. 为什么要数字签名? 最简单直接的回答: 系统要求的.  Andr ...

  2. 【Android自动化打包】03. APK的数字签名

    1. 什么是数字签名?   数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的   2. 为什么要数字签名?    最简单直接的回答: 系统要求的.   ...

  3. Android 比对APK的签名信息

    https://www.jianshu.com/p/8583f6a966e2 在做App的时候经常会有验证apk是否为正版的需求,比如一些接入第三方支付的app,接入微信sdk也是需要apk签名信息的 ...

  4. [转] Java的打包apk, jar、war、ear包

    apk, war, ear可用zip压缩,看起来这四个包都是用简单方式zip/jar即可生成. ---------------------------------------------------- ...

  5. Android 签名证书

    Android APK的数字签名的作用和意义 http://blog.csdn.net/gaomatrix/article/details/6568191 http://jingyan.baidu.c ...

  6. Android基本认识

    AndroidManifest.xml file missing! 是因为开始想当然的用中文当project名 no launcher activity found 第一次运行出了点问题,no lau ...

  7. Android开发中的安全

    根据Android四大框架来解说安全机制 代码安全 java不同于C/C++,java是解释性语言,存在代码被反编译的隐患: 默认混淆器为proguard,最新版本为4.7: proguard还可用来 ...

  8. 百度地图插件(百度地图AK申请配置指南)

    百度地图AK申请配置指南     [LBS云] 百度地图AK申请配置指南 1. 该文档是详细版,图文并茂: 2. 该指南是针对browser-mobile-sever三种终端开发的申请与配置说明: 3 ...

  9. Android之安全机制

    根据android四大框架来解说安全机制 代码安全 java不同于C/C++,java是解释性语言,存在代码被反编译的隐患: 默认混淆器为proguard,最新版本为4.7: proguard还可用来 ...

随机推荐

  1. 使用postMessage实现跨域 解决'Failed to execute 'postMessage' on 'DOMWindow''

    使用iframe+postMessage解决跨域问题,首先来过一遍其中的原理咯 原理: 发送方使用postMessage方法向接收方推送消息,第一个参数为推送的内容,第二个参数是允许被访问的域名: 接 ...

  2. [JavaScript]自执行函数

    最近在接触mui的时候,遇到了一段代码: (function($, doc) { $.init({ statusBarBackground: '#f7f7f7' }); $.plusReady(fun ...

  3. linux基本语法和常用运维命令

    linux上的操作一般是命令行操作,看起来很高大上,让人畏而远之. Help!Help! 忽然间闯入的linux黑黑的世界,怎么办,不要慌.赶紧敲出一个help命令,然后回车,黑色的窗口就会展示一些常 ...

  4. 初识Python装饰器

    python中,一切皆对象.做为面向对象开发中非常重要的一个环节,函数有着无可替代的作用. 函数可以作为对象赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的 ...

  5. 使用mongoose和bcrypt实现用户密码加密

    前面的话 最近在做的个人项目中,需要对密码进行加密保存,对该操作的详细步骤记录如下 介绍 关于mongoose已经写过博客就不再赘述,下面主要介绍bcrypt bcrypt是一个由两个外国人根据Blo ...

  6. java对象序列化、反序列化

    平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...

  7. CF 716E. Digit Tree [点分治]

    题意:一棵树,边上有一个个位数字,走一条路径会得到一个数字,求有多少路径得到的数字可以整除\(P\) 路径统计一般就是点分治了 \[ a*10^{deep} + b \ \equiv \pmod P\ ...

  8. 夏令营讲课内容整理 Day 2.

    本日主要内容是并查集和堆. 并查集 并查集是一种树型的数据结构,通常用来处理不同集合间的元素之间的合并与查找问题.一个并查集支持三个基本功能:合并.查找和判断.举一个通俗的例子,我和lhz认识,lhz ...

  9. Azure ARM (21) Azure订阅的两种管理模式

    <Windows Azure Platform 系列文章目录> 熟悉Azure平台的读者都知道,Microsoft Azure服务管理,分为三个层次: 1.企业服务合同 (Enterpri ...

  10. JDK8的新特性——Lambda表达式

    JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知. ...