概览

Android要求所有已安装的应用程序都使用数字证书做数字签名, 数字证书的私钥由应用开发者持有. Android使用证书作为标识应用程序作者的一种方式, 并在应用程序之间建立信任关系. 证书并不用来控制用户能否安装哪个应用. 证书不需要由证书认证中心签名: 完全可以使用自签名证书(self-signed certificates).

理解Android应用签名的要点有:

  • 所有应用程序都必须签名. 系统将不会安装一个没签名的应用.
  • 可以用自签名证书来签名应用程序. 并不需要证书认证中心.
  • 当准备好向最终用户发布应用时, 必须用一个合适的私钥对其签名. 不能发布用SDK工具生成的debug key签名的应用.
  • 系统仅在安装时检查签名者的证书的过期时间. 如果应用程序签名者的证书在安装后的时间过期, 该应用将仍然正常工作.
  • 可以使用标准工具 — Keytool 和 Jarsigner — 生成key并为应用的 .apk 文件签名.
  • 当应用签名完成, 使用 zipalign 工具来优化最终的 APK 包.

没有正确签名的应用, Android系统不会安装或运行. 此规则适用于在任何地方运行的Android系统, 不管是在模拟器还是真实设备上. 因为这个原因, 在真机或模拟器上运行或者调试应用前, 必须为其设置好签名.

在调试期间, Androi SDK工具协助你为应用做好签名工作. Eclipse的ADT插件和Ant build工具都提供2种签名模式 – debug 模式和 release 模式.

  • 开发和调试的时候, 可在debug模式下编译. 在debug模式下, build工具使用Keytool工具, 它被包含在JDK中, 用于创建一个keystore和key, 别名和密码. 在每个编译过程中, 工具使用debug key来签名应用的.apk文件. 因为事先知道密码, 所以在每一次编译keystore/key需要密码的时候不会提示.
  • 当应用准备好发布时, 必须在release模式下编译,然后用你的私钥对.apk文件签名.
  • 有2种方法:
    • 在命令行下使用 Keytool 和 Jarsigner.
    • 使用此方法, 首先需要将应用编译成一个未签名的 .apk . 然后必须手动使用Jarsigner(或类似工具)和你的私钥为.apk签名. 如果没有合适的私钥, 可以手动运行Keytool来生成你自己的 keystore/key ,然后用Jarsigner给应用签名.
    • 使用ADT的Export Wizard.
    • 如果在Eclipse下使用ADT插件开发, 可以使用Export Wizard来编译应用, 生成私钥(如果有必要), 以及为.apk签名, 使用Export Wizard可以简单地在几个步骤中完成所有的事情.

一旦应用完成签名, 不要忘了为APK运行zipalign来完成额外的优化.

签名策略

应用程序签名的一些方面可能会影响应用程序的开发过程, 尤其是当你计划发布多个应用时. 通常情况下, 对于所有开发者而言, 推荐的策略是:在应用程序的整个生命周期,所有的应用程序使用相同的证书签名.

为什么这么做的原因:

  • 应用程序升级 – 当发布应用的更新时, 如果想让用户无缝地升级到新版本, 需要继续使用相同的某个或者某一套证书来签名更新包. 当系统安装应用的更新时, 它会比较现有版本和新版本的证书. 如果证书吻合, 包括证书数据和顺序都吻合, 那么系统允许更新. 如果新版本所做的签名不是匹配的, 那么将需要给应用起一个不同的包名 — 在这种情况下, 用户相当于安装了一个完全的新程序.
  • 应用程序模块化 – Android允许由相同证书签名的应用程序运行在相同的进程中, 此时系统会将它们作为单个应用程序对待. 在这种方式中, 可以按模块化的方式部署应用, 用户可以根据需要独立地更新每一个模块.
  • 代码/数据 的授权共享 – Android 提供模式匹配的权限控制机制, 因此一个应用可以暴露功能给另一个用指定证书签名的应用. 通过用相同证书签名多个应用,以及使用模式匹配的权限检查, 应用程序可以以安全的方式共享代码和数据.

另一个影响签名策略的重要考量是, 如何设置签名应用的key的有效期.

  • 如果计划为某个单独的应用程序提供更新支持, 那么应该确认key的有效期要比应用的寿命长. 推荐25年或者更长的有效期. 当key的有效期过期, 用户将再也不能无缝地更新到应用程序的新版本.
  • 如果要使用相同的key为多个不同的应用签名, 应当确认key的有效期比所有这些应用的所有版本的生命周期还长, 包括要比将来加到这个套件中的额外的关联应用的生命周期更长.
  • 如果计划将应用程序发布到Android Market, 为应用签名的key的有效期必须在2033年10月22日以后. Market服务器强制执行这个规则, 来保证当新版本可用时, 用户可以无缝地更新Market应用.

当设计的时候, 须牢记这些要点, 以确保使用合适的证书来签名应用程序.

签名基础设置.

在开始之前, 应当确保Keytool对 SDK build tools 可用. 在大多数情况下, 我们可以通过设置JAVA_HOME环境变量来引用一个合适的JDK, 告诉SDK build tools如何找到Keytool. 或者, 可以添加 Keytool的JDK版本到 PATH 环境变量.

如果在某个自带GNU Java编译器版本的Linux下开发, 请确认系统使用的是JDK版本的Keytool, 而不是 gcj 版本. 如果 Keytool 已经存在于 PATH, 它可能会指向一个 /usr/bin/keytool 的符号链接. 在这种情况下, 检查符号链接目标, 确保它指向JDK中的Keytool.

如果将公开发布应用程序, 还需要 Jarsigner 工具. Jarsigner 和 Keytool 都包含在 JDK 中.

Debug模式下的签名

Android build tools 提供了debug签名模式, 帮助简化应用的开发和调试, 而仍然符合Android系统签名.apk的需求. 当使用debug模式来构建app时, SDK 工具调用 Keytool来自动创建一个用于debug的 keystore 和 key. 然后这个debug key被用来自动签名 .apk, 所以不必用自己的key来签名包.

SDK 工具使用预定义的 名称/密码 来创建keystore/key :

  • Keystore name: "debug.keystore"
  • Keystore password: "android"
  • Key alias: "androiddebugkey"
  • Key password: "android"
  • CN: "CN=Android Debug,O=Android,C=US"

如有必要, 可以更改 debug keystore/key 的 location/name 或自己提供一个自定义的 debug keystore/key. 然而, 任何自定义的debug keystore/key必须使用和默认debug key(如之前所述)相同的debug keystore/key 名称和密码. (Eclipse/ADT中, Windows > Preferences > Android > Build)

注意: 当用debug证书签名时, 应用程序不能对外发布.

Eclipse用户

如果使用 Eclipse/ADT (并且根据之前"签名基础设置"一节所述设置好了Keytool), debug模式下的签名是默认开启的. 运行或者调试程序时, ADT自动使用debug证书对.apk进行签名, 并对安装包使用zipalign, 然后将它安装到选定的模拟器或者连接的设备上. 这一切不用我们亲自动手, ADT可以自行访问Keytool.

Ant用户

如果使用Ant来构建.apk文件, debug签名模式通过ant命令(假设使用由android tool生成的build.xml文件)下使用debug选项开启. 当运行ant debug来编译app时, build脚本生成一个 keystore/key 并为.apk做签名. 然后脚本也会使用zipalign工具优化.apk. 仍然不需要你做额外的事情.

更多相关文章

  1. Android 应用程序窗体显示状态操作(requestWindowFeature()的应用
  2. android 渗透测试必备工具
  3. Android 应用程序之间数据共享—ContentProvider 保时被访问
  4. 为Android应用程序读取/dev下设备而提权(二)
  5. Android中应用程序drawable图片资源占用内存的统计
  6. Android应用程序打包签名、加固、二次打包(图形/命令行)

随机推荐

  1. flutter +Android(安卓)studio+Xcode 调
  2. TabHost 置于底部 顶部的方法
  3. Android中解析xml文件的接口
  4. Android -- 再来一发Intent
  5. Android 广播大全
  6. Java(Android)线程池
  7. Android 调用相册 拍照 实现系统控件缩放
  8. Android LCD(二):LCD常用接口原理篇
  9. android textView 加入连接方式
  10. Android的ProgressBar自定义入门