问题:

为了将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。


Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.6——签署发布apk的更多相关文章

  1. Android开发工具全面转向Android Studio(3)——AS project/module的目录结构(与Eclipse对比)

    如果AS完全还没摸懂的,建议先看下Android开发工具全面转向Android Studio(2)——AS project/module的CRUD. 注:以下以Windows平台为标准,AS以目前最新 ...

  2. Android开发工具全面转向Android Studio(2)——AS project/module的CRUD

    本文有些地方可能需要衔接Android开发工具全面转向Android Studio(1)——准备开发环境,读起来效果会更好. 这个世界很奇妙,所有的东西离不开CRUD,即增删改查.即使人本身也遵循这个 ...

  3. 配置cordova的android开发环境(无android studio)

    原文:配置cordova的android开发环境(无android studio) 趁元旦放假想试一下cordova,不想安装庞大的android studio,所以想最小化安装,居然花了一整天的时间 ...

  4. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

    AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...

  5. Eclipse搭建Android开发环境并运行Android项目

    Eclipse搭建Android开发环境并运行Android项目 (详细) 安装环境: window 10 64位 安装工具: JDK.Eclipse.SDK.ADT 安装步骤: 1.JAVA JDK ...

  6. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

    问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...

  7. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试

    问题: 你想要测试app中的非android部分. 解决方案: 可以使用Android Studio1.1里面增加的单元测支持和Android的Gradle插件. 讨论: ADT插件只支持集成测试,并 ...

  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App

    问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gra ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记1.2

    在android开发中会需要配置使用app的android SDK的最低版本和目标版本,这个是bulidl.gradle的android模块设置.默认有以下几个设置: applicationId,这个 ...

随机推荐

  1. django dispatch

    from django.views import View # 这里Home需要继承View class Home(View): # 这样这里就相当于一个装饰器的功能,可以自己定制化内容 def di ...

  2. EazyUI主页框架搭建纯JS样例

    採用Jfinal+EazyUI  执行起来就好能够了 眼下还未增加后台代码  纯JS代码搭建的一个二级菜单+主页 客户换肤, 给使用EazyUI的新人一个高速可用的JS 搭建界面 也给自己保存下 界面 ...

  3. iOS 程序进入后台,包含用户上拉快捷菜单导致程序失去活跃的研究

    今日在使用某App时候,突然发现上拉菜单.程序视频扔在播放,咦!引起了我的兴趣. 首先,列出两个方法, 第一个方法是AppDelegate的代理.当程序进入后台时候调用 - (void)applica ...

  4. 《Mining the Web:Transforming Customer Data into Customer Value》读后札记

    <Mining the Web:Transforming Customer Data into Customer Value> <Web数据挖掘:将客户数据转化为客户价值> — ...

  5. linux 单机跨进程通信

    一般来说通过网络通信(比如tcp,udp)或者共享内存的方式肯定可以实现跨进程通信,但现在这里要说的是比较偏但实用的几个方法:利用unix域通信(普通网络连接),利用unix域通信(socketpai ...

  6. Java 8里 Stream和parallelStream的区别

    Java中Stream和parallelStream,前者是单管,后者是多管,运行时间上做一个小对比,直接上代码: /** * * @author zhangy6 * <p>对比Strea ...

  7. Atitit. . 软件命名空间与类名命名单词的统计程序设计v2

    Atitit. . 软件命名空间与类名命名单词的统计程序设计v2 1. 要实现的目标1 1.1. Camel字符串模式的分词处理1 1.2. 多个大写的处理1 1.3. 数字与字幕的分离1 1.4.  ...

  8. jquery样式表和效果

    $("p").css({ "color": "#ff0011", "background": "blue&qu ...

  9. 敲敲SQL语句

    基本命令 查看数据库:show databases; 选择数据库:use mysql_crash; 连接数据库:需要:主机名,端口,合法用户名,用户口令 mysql -u ben -p -h loca ...

  10. MapReduce源码分析之Task中关于对应TaskAttempt存储Map方案的一些思考

    我们知道,MapReduce有三层调度模型,即Job——>Task——>TaskAttempt,并且: 1.通常一个Job存在多个Task,这些Task总共有Map Task和Redcue ...