Android 要求所有应用在安装前必须使用证书进行数字签名。Android 使用该证书来确定一个应用以及其作者身份,该证书不要求由证书发行机构颁发,因此 Android 应用经常使用自我签名的证书,而开发者保管证书的私钥。

  你可以使用调试和发行两种模式进行签名。在调试模式下 Android SDK 负责自动生成证书并对应用签名,在发行模式下你需要自行生成属于你自己的证书。

调试模式签名

  在该模式下,Android SDK 会自动生成一个调试用的证书,并且使用默认密码对应用进行签名,因此当你需要调试你的应用程序时,构建过程无需输入任何密码。

  Android Studio 和 Eclipse + ADT 在调试模式下能自动对应用进行签名。

  你可以通过 USB 连接到你的安卓设备来调试你的应用,但调试模式签名的应用无法用于公开发行。

发行模式签名

  在该模式下,你使用自己的证书对应用进行签名:

  1. 创建 keystore。keystore 是指一个二进制文件,它包含了一系列私钥。你需要将你的 keystore 保存在一个安全可靠的地方。

  2. 创建私钥。私钥代表着可以确认应用身份的实体,例如某个人或者公司。

  3. 构建项目。生成一个未签名的 .apk。

  4. 应用签名。使用你的私钥对未签名的 .apk 进行签名。

  完成以上四个步骤后,你就可以在 Google Play 上发行你的应用了[1]

签名注意事项

  在应用的整个生命周期,你都需要使用相同的证书对其进行签名,因为:

  ● 升级:当安卓系统对一个应用进行更新安装时,会首先比较新旧两个版本的证书,只有二者吻合系统才允许升级。如果在新版本应用中你使用了新的证书,你必须重新命名你的包名,那么对用户而言,他们其实是安装了另外一个应用。

  ● 模块性:安卓系统允许具有相同证书签名的应用在同一个进程中运行,对系统而言它们是同一个应用。这样的话你就可以按模块部署你的应用,用户可以独立升级各个模块。

  ● 按权限分享代码和数据:安卓系统提供了一套基于签名的权限管理系统,因此当一个应用使用了特定的证书签名,那么另一个应用就可以为其提供指定的功能支持。通过这套权限管理系统和对多个应用使用相同证书签名,你的应用就可以安全的共享代码和数据。

  如果你想要对应用进行后续升级,你就必须保证证书的有效期大于应用的生命周期。一般推荐有效期为 25 年或者更长。一旦你的密钥过期,用户将无法顺利升级你的应用。

  如果你想要在 Google Play 上发行你的应用,你用以签名应用的密钥有效期必须超过 2033 年 10 月 22 日。这是 Google Play 为了保证用户可以顺利升级他们的应用而采取的强制措施。

妥善保管私钥

  安全妥善的保管你的私钥,无论对你还是用户都是非常重要的。如果你允许其他人使用你的密钥,或者将 keystore 和密码保管在一个不安全的地方,那将危害你作为应用所有者身份的认定以及用户的信任。

  如果其他人设法在你不知情或未许可的情况下获取了你的密钥,那他就可以恶意发行应用来取代你的应用。他还可以以你的名义攻击其他应用或者系统,盗取用户数据。

  你的应用未来所有版本都将使用你的私钥进行签名。如果你丢失私钥,你将无法对已发行应用推送更新,你也不能重新生成私钥。

  你作为一名开发者的声誉取决于你是否妥善保管你的密钥,以下是保障密钥安全的几个建议:

  ● 为 keystore 和密钥设置一个健壮的密码。

  ● 不把私钥交给其他任何人,不告诉任何未授权的人你的 keystore 和私钥密码。

  ● 将 keystore 和私钥文件保管在一个安全可靠的地方。

  一般来说,只要在生成、使用和保管密钥时遵循一个普世安全意识,那么一切就都是安全的。

调试证书过期

  调试模式使用的证书有效期为 365 天,当证书过期时,你会得到一个构建错误。

  要修复这个问题只要删除 debug.keystore 文件即可。该文件默认保存路径为 ~/.android/ (OS X 或 Linux)或者 C:\Documents and Settings\<user>\.android\ (Windows XP),或 C:\Users\<user>\.android\ (Windows Vista 和 Windows 7)

  在你下次构建时,构建工具会自动生成一个新的 keystore 和调试密钥[2]

手动签名应用

  你可以使用 Android SDK 和 JDK 提供的标准工具来手动签名你的应用。以下演示如何在命令行以发行模式进行签名:

  1. 使用 keytool 工具(由 JDK 提供)生成私钥:

$ keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize -validity

  

  以上示例会要求你输入 keystore 和私钥密码,并要求输入一些个人信息,最后生成一个名为 my-release-key.keystore 的文件。这个 keystore 包含一个私钥,有效期为 10000 天。-alias 选项提供的别名在稍后签名应用时会用到。

  2. 在发行模式下编译一个未签名的 .apk。

  3. 使用 jarsigner 工具(由 JDK 提供) + 私钥来签名应用:

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1
-keystore my-release-key.keystore my_application.apk alias_name

  以上示例会要求输入 keystore 和私钥密码,它会修改 APK 文件以完成签名。你可以使用不同的密钥对 APK 文件进行多次签名。

  4. 确认 APK 是否已签名:

$ jarsigner -verify -verbose -certs my_application.apk

  5. 使用 zipalign 工具(由 Android SDK 提供)调整最终的 APK 包:

$ zipalign -v  your_project_name-unaligned.apk your_project_name.apk

  zipalign 工具确保所有未压缩的数据都以一个特别的字节开始,使其与文件起始点保持相对整齐。这样可以减少应用的 RAM 占有率。

注:

[1] 你应该将 keystore 和私钥保存在一个安全可靠的地方,同时保管一份安全的备份。如果你丢失了它们,你将无法在 Google Play 上更新你的应用,因此你必须使用相同的密钥来签名同一个应用的所有版本。

[2] 如果你的开发环境不是使用公历纪年(准确说是格里高利历),构建工具可能会错误地生成一个已经过期的调试证书,从而导致无法编译应用。要解决这个问题,参见 I can't compile my app because the build tools generated an expired debug certificate

附:

1. Signing Your Applications

[Android] 基于 Linux 命令行构建 Android 应用(六):Android 应用签名的更多相关文章

  1. [Android] 基于 Linux 命令行构建 Android 应用(七):自动化构建

    本章将演示如何基于 Linux 命令行构建 Android 应用,在开始本章之前,希望你已经阅读之前几章内容. 本文环境为 RHEL Sandiego 32-bits,要基于 Linux CLI 构建 ...

  2. [Android] 基于 Linux 命令行构建 Android 应用(四):命令行构建

    谷歌提供的 Android SDK 支持 Ant 自动构建[1],你可以使用调试和发行两种模式进行构建,两种模式不同之处在于调试模式 Ant 会调用内置的调试密钥,而发行模式调用你提供的私钥. 首先安 ...

  3. [Android] 基于 Linux 命令行构建 Android 应用(二):命令行管理项目

    创建 Android 项目 在命令行创建 Android 项目需要用到 android 工具(该工具由 Android SDK 提供,位于 <sdk>/tools/ 目录下.).它能自动生 ...

  4. [Android] 基于 Linux 命令行构建 Android 应用(三):构建流程

    Android 应用的构建过程就是将 Android 项目中的文件和资源进行编译和打包,最后将结果输出到 .apk 文件..apk 文件是保存二进制文件的容器,它包含了运行安卓应用所需的所有信息,例如 ...

  5. [Android] 基于 Linux 命令行构建 Android 应用(五):Ant 构建命令

    Android SDK 提供的 android 工具可以在项目根目录自动生成 Ant 构建文件 build.xml[1].进入项目根目录后,你可以使用以下 Ant 命令[2]. ant clean 清 ...

  6. [Android] 基于 Linux 命令行构建 Android 应用(一):关于 Android 项目

    关于 Android 项目 项目是保存源代码和资源文件的容器. 谷歌提供的 Android SDK 工具只能对具有固定目录结构的项目进行编译和打包.因此强烈建议使用 Eclipse + ADT 或者 ...

  7. 7个基于Linux命令行的文件下载和网站浏览工具

    7个基于Linux命令行的文件下载和网站浏览工具 时间:2015-06-01 09:36来源:linux.cn 编辑:linux.cn 点击: 2282 次 Linux命令行是GNU/Linux中最神 ...

  8. 【转载】基于Linux命令行KVM虚拟机的安装配置与基本使用

    基于Linux命令行KVM虚拟机的安装配置与基本使用 https://alex0227.github.io/2018/06/06/%E5%9F%BA%E4%BA%8ELinux%E5%91%BD%E4 ...

  9. Android Developers:在命令行构建和运行

    使用Ant构建脚本构建你的应用程序有两种方式:一种用于测试/调试你的引用程序—debug模式—另一种用于构建你最终发布的包-release模式.无论你使用哪种方式构建你的应用程序,它必须在安装在模拟器 ...

随机推荐

  1. [原创]PostMan接口测试神器

    [原创]PostMan接口测试神器 1 PostMan是什么?  Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 2 Postman工具下载及安装 官方网站: htt ...

  2. windows Server 2008 R2 添加新用户时密码不满足密码策略的要求

    ---------------------------本地用户和组---------------------------在计算机 WINSERVER2008R2 上创建用户 lintx 时,出现了以下 ...

  3. iOS 7设计备忘单

    With the release of iOS 7, app designers and developers will need to adjust their visual language to ...

  4. Long polling failed, will retry in 16 seconds. appId: zeus-guard, cluster: default, namespaces: application, long polling url: null, reason: Get config services failed from···

    当dubbo应用启动之前, 如果apollo 未启动好,那么我们dubbo应用会一直等待,直到apollo准备就绪,注意其中轮询时间是从1,2,3,4,8,14,32, 方式一直增长,单位是s.

  5. 转 全面理解Javascript闭包和闭包的几种写法及用途

    转自:http://www.cnblogs.com/yunfeifei/p/4019504.html 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说ja ...

  6. [转]数据库性能优化之SQL语句优化1

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  7. SNF快速开发平台--规则引擎整体介绍及使用说明书

    一.设计目标 a)规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b)能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c)运算速度快 ...

  8. springboot集成redis缓存

    1.pom.xml增加redis缓存起步依赖(spring-boot-starter-parent包含许多starter版本) <dependency> <groupId>or ...

  9. javascript es6 箭头函数

    1.箭头函数示例 let add = (a,b) => a + b         //没有语句块时,默认作为返回值 add(1,2); var multi = (a,b) => {ret ...

  10. openwrt 水星mw4530r-v1 搞搞搞

    感觉周围最实用的搞硬件非路由器莫属,可惜配置都不咋的高,选择水星这款就是看中它的性价比和openwrt的支持,真乃刷机神器啊,还可以挂载usb就更绝了,价格没得说. 另外128mb的rom对大部分功能 ...