Android数字签名

  在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于 标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的protectionLevel为signature,那么就只有那些 跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限。Android使用Java的数字证书相关的机制来给apk加盖数字证 书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制。Android系统要求每一个安装进系统的应用程序都是经 过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决 定最终用户可以安装哪些应用程序。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。

1、同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。

  • 有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。
  • 有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。
  • 可以通过权限(permission)的方式在多个程序间共享数据和代码。Android提供了基于数字证书的权限赋予机制,应用程序可以和其他的程序共 享概功能或者数据给那那些与自己拥有相同数字证书的程序。如果某个权限(permission)的protectionLevel是signature, 则这个权限就只能授予那些跟该权限所在的包拥有同一个数字证书的程序。

2、在签名时,需要考虑数字证书的有效期

  • 数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。
  • 如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。
  • Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。

3、Android数字证书包含以下几个要点:

  • 所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
  • Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
  • 如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
  • 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
  • Android使用标准的java工具 Keytool and Jarsigner 来生成数字证书,并给应用程序包签名。
  • 使用zipalign优化程序。

4、签名模式

  Android 系统不会安装运行任何一款未经数字签名的apk程序,无论是在模拟器上还是在实际的物理设备上。Android的开发工具(ADT插件和Ant)都可以协 助开发者给apk程序签名,它们都有两种模式:调试模式(debug mode)和发布模式(release mode)。

  在调试模式下,android的开发工具会在每次编译时使用调试用的数字证书给程序签名,开发者无须关心。

  当要发布程序时,开发者就需要使用自己的数字证书给apk包签名,可以有两种方法。

  1. 在命令行下使用JDK中的和Keytool(用于生成数字证书)和Jarsigner(用于使用数字证书签名)来给apk包签名。
  2. 使用ADT Export Wizard进行签名(如果没有数字证书可能需要生成数字证书)。

5、优化APK

5.1 使用zipalign优化APK

  根据官方文档的描述,Android系统中Application的数据都保存在它的APK文件中,同时可以被多个进程访问,安装的过程包括如下几个步骤:

  • Installer通过每个apk的manifest文件获取与当前应用程序相关联的permissions信息
  • Home application读取当前APK的Name和Icon等信息。
  • System server将读取一些与Application运行相关信息,例如:获取和处理Application的notifications请求等。
  • 最后,APK所包含的内容不仅限于当前Application所使用,而且可以被其它的Application调用,提高系统资源的可复用性。

  zipalign 优化的最根本目的是帮助操作系统更高效率的根据请求索引资源,将resource-handling code统一将Data structure alignment(数 据结构对齐标准:DSA)限定为4-byte boundaries。如果不采取对齐的标 准,处理器无法准确和快速的在内存地址中定位相关资源。目前的系统中使用fallback mechanism机制处理那些没有应用DSA标准的应用程序,这的确大大的方便了普通开发者无需关注繁琐的内存操作问题。但是相反,对于这样的应用程序 将给普通用户带来一定的麻烦,不但影响程序的运行的效率,而且使系统的整体执行效率下降和占用大量不必要的内存资源,甚至消耗一定的电池资源 (battery life)。

5.2 命令行方式手动优化

  • 利用tools文件夹下的zipalign工具。首先调出cmd命令行,然后执行:zipalign -v 4 source.apk androidres.apk。这个方法不受API Level的限制,可以对任何版本的APK执行Align优化。
  • 同时可以利用zipalign工具检查当前APK是否已经执行过Align优化。命令:zipalign -c -v 4 androidres.apk

5.3 使用ADT自动优化:

  • 从 ADT 0.9.3版本开始,可以通过export wizard自动对发布的application packages执行align操作。设置方法:鼠标右键点击Project,然后选择”Android Tools” > “Export Signed Application Package…”。

6、覆盖安装

  如果你以前的程序是采用默认签名的方式(debug签名),一旦换了新的签名应用将不能覆盖安装,必须将原先的程序卸载掉,才能安装上。

  因为程序覆盖安装主要检查两点:

  1. 两个程序的入口Activity是否相同。两个程序如果包名不一样,即使其它所有代码完全一样,也不会被视为同一个程序的不同版本;
  2. 两个程序所采用的签名是否相同。如果两个程序所采用的签名不同,即使包名相同,也不会被视为同一个程序的不同版本,不能覆盖安装。

7、debug签名的应用程序

另外,可能有人可能会认为反正debug签名的应用程序也能安装使用,那也没有必要自己签名了嘛。千万不要这样想,debug签名的应用程序有这样两个限制,或者说风险:

  1. debug签名的应用程序不能在Android Market上架销售,它会强制你使用自己的签名;Debug模式下签名用的证书(默认是Eclipse/ADT和Ant编译)自从它创建之日起,1年后就会失效。
  2. debug.keystore在不同的机器上所生成的可能都不一样,就意味着如果你换了机器进行apk版本升级,那么将会出现上面那种 程序不能覆盖安装的问题。不要小视这个问题,如果你开发的程序只有你自己使用,当然无所谓,卸载再安装就可以了。但要是你的软件有很多使用客户,这就是大 问题了,就相当于软件不具备升级功能!

8、总结

  综上所述,可以使用Keytool、Jarsigner、zipalign 给程序签名并优化程序,这样就需要三个不同的工具:

  1. keytool -genkey -v -keystore android.keystore -alias android -keyalg RSA -validity 20000
  2. jarsigner -verbose -keystore android.keystore -signedjar android123_signed.apk android123.apk android
  3. zipalign -v 4 android123_signed.apk android123_signed_aligned.apk

  当然,也可以通过ADT插件中Export Signed Application Package…来执行,图形界面更为简单、形象、直观。

http://www.cnblogs.com/maxinliang/p/3169335.html

时间: 2024-07-28 18:49:58

Android数字签名的相关文章

Android 数字签名和打包

Android 数字签名学习笔记 Posted on 2010-01-17 18:38 feisky 阅读(20834) 评论(4) 编辑 收藏 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限.Android使用Java的数字证书相关的机制来给

Android Application Digital Signatures - Android 数字签名

Android 数字签名 同一个开发人员的多个程序尽可能使用同一个数字证书,这能够带来下面优点. (1)有利于程序升级,当新版程序和旧版程序的数字证书同样时,Android系统才会觉得这两个程序是同一个程序的不同版本号.假设新版程序和旧版程序的数字证书不同样,则Android系统觉得他们是不同的程序,并产生冲突,会要求新程序更改包名. (2)有利于程序的模块化设计和开发.Android系统同意拥有同一个数字签名的程序执行在一个进程中,Android程序会将他们视为同一个程序.所以开发人员能够将自

Android数字签名解析(二)

在Android数字签名解析(一)中,介绍了android进行签名的两种方式,当中用密钥对进行签名用到了signapk.jar这个java库. 以下我们就看看signapk签名实现过程,signapk的源代码在build/tools/signapk/下. 一.生成MANIFEST.MF文件 //对apk包中的每一个文件(非目录和非签名文件),生成SHA1的摘要信息.再对这个信息进行Base64编码. Manifest manifest = addDigestsToManifest(inputJa

Android数字签名解析(三)

在刚才开始学习android数字签名的相关知识点的时候,被资料中出现的keystore.x509.密钥对.debug.keystore弄的晕头 转向,经过一段时间的了解,总算明白一些. 一.make_key脚本生成密钥对 android源码中自带的工具make_key(development/tools/目录下)可以用来生成RSA密钥对. ./make_key test '/C=CN/ST=SH/L=SH/O=TEST/OU=TEST/CN=TEST' 运行以上命令将生成密钥对test.pk8和

Android 数字签名学习笔记

在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应用程序才能取得该权限.Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制.Android系统要求每一个安装进系统的

Android数字签名的学习(转)

转载地址:http://www.cnblogs.com/feisky/archive/2010/01/17/1650076.html 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个 permission的protectionLevel为signature,那么就只有那些跟该permission所在的程序拥有同一个数字证书的应 用程序才能取得该权限.Android使用Java的数字证书相关的机制来给apk加

Android数字签名解析(一)

?一.数字签名概述 所谓"数字签名"就是通过某种password运算生成一系列符号及代码组成电子password进行签名,来取代书写签名或印章. 数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的.由于别人假冒不了发送方的签名. 二是数字签名能确 定消息的完整性. 由于数字签名的特点是它代表了文件的特征.文件假设发生改变,数字签名的值也将发生变化. 二.Android系统中数字签名的使用范围 眼下在android系统中,在两个地方使用了数据签名,一是应用程序.二是OTA升级

Android数字签名和打包2

Andriod应用程序如果要在手机或模拟器上安装,必须要有签名! 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装). 2.签名的步骤 a.创建key b.使用步骤a中产生的key对apk签名 3.具体操作 方法一: 命令行下对apk签名(原理) 创建key,需要用到keytool.exe (位于j

Android面试题(2)

1.activity的生命周期 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的时候调用.这里是你做所有初始化设置的地方──创建视图.设置布局.绑定数据至列表等.如果曾经有状态记录(参阅后述Saving Activity State.),则调用此方法时会传入一个包含着此activity以前状态的包对象做为参数. 总继之以onStart(). 否 onStart() onRestart() 在activity停止后onStop(),在再次启动之前被调用. 总继之