Android应用如何进行数字签名与优化

来源:互联网 发布:iphone改铃声软件 编辑:程序博客网 时间:2024/06/03 16:00

 

文章目录:

签名的意义

签名的注意事项

签名的方法

签名对你的App的影响

使用zipalign优化APK

 

1.签名的意义:

  • 总的来说,数字签名的目的是为了对Android App进行区分,在已经装入Android手机中的App相互区分的唯一依据就是通过AndroidManifext.xml中的<manifest>标签中的 package属性(即完整包名),因此两个包名相同的App是不能同时共存的,而数字签名是为了防止当两个不同的App但包名相同时,在安装后者的时候将已经安装的App覆盖掉。
  • 例如:由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当包名,但是签名不同的App不被替换。

2.签名的注意事项

  • 所有的Android应用都必须有数字签名,没有不存在数字签名的应用,包括模拟器上运行的。Android系统不会安装没有数字证书的应用。
  • 签名的数字证书不需要权威机构来认证,是开发者自己产生的数字证书,即所谓的自签名。
  • 模 拟器开发环境,开发时通过ADB接口上传的程序会先自动被签有Debug权限,然后才传递到模拟器。如下图所示,Eclipse菜单的Window -> Preferences -> Android –> Build 下显示的是我们默认的调试用的签名数字证书。

  • 正式发布一个Android应用时,必须使用一个合适的私钥生成的数字证书来给程序签名,不能使用ADT插件或者ANT工具生成的调试证书来发布。
  • 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
  • 签名后需使用zipalign优化程序。(见文章尾部)
  • Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序。

3.签名的方法

方法一:使用Eclipse工具

此方法适用于Android1.5及以上版本。

步骤一:打开Eclipse->选择你要签名的项目->右击->android tools->Export signed Application package(或者 选择你要签名的项目->右击->Export->选择Android中的Export Android Application)


步骤二,在出现的窗口确认是不是这个项目要签名,然后选择下一步:


步骤三:在Export Android Application 这一步,如果这个应用的之前版本已经有了keystore,那么我们应该选择Use existing keystore,并选择与之前版本相同的keystore,否则我们新建一个keystore。

如下,选择需要保存这个证书文件的目录,以及这个证书文件的一个密码。

注:证书文件的名称没有任何限制,并非一定要以.keystore作为扩展名,例如可以命名为myProject.keystore2,以.keystore作为扩展名只是一种好习惯。


步骤四,点击下一步后,我们需要填写keystore的基本信息,如,别名(Alias),密码,有效期(Validity),姓名,组织,组织名称,所在城市,所在省份,国家等,点击Next


步骤五、选择将被签名后的APK保存的位置。点击finish。

注:apk的命名可以任意取。

 

 之后我们在刚才选择的目录下就可以看到生成的签名后的APK文件。

方法二:使用命令行方式签名。

使用Keytool和jarsigner命令给程序进行签名:

这两个命名都是JDK中自带的,因此使用之前应该首先安装JDK,两个命名的可执行文件都在jdk1.6.0_24\bin目录下,把bin所在的路径添加到环境变量path后,打开cmd输入

D:\>keytool -genkey -alias demo.keystore-keyalg RSA -validity 40000 -keystore  demo.keystore

/*说明:-genkey 产生密钥

       -aliasdemo.keystore  alias表示别名

       -keyalg RSA 使用RSA算法对签名加密

       -validity40000 有效期限40000天

       -keystoredemo.keystore  此为密钥名   */

D:\>jarsigner  -verbose  -keystore  demo.keystore  -signedjar  demo_signed.apk  demo.apk  demo.keystore

/*说明:-verbose 输出签名的详细信息

       -keystore  demo.keystore 密钥库位置

       -signedjar  demo_signed.apk  demo.apk  demo.keystore 正式签名,三个参数中依次为签名后产生的文件demo_signed,要签名的文件demo.apk和密钥库demo.keystore.*/

  注意事项:android工程的bin目录下的demo.apk默认是已经使用debug用户签名的,所以不能使用上述步骤对此文件再次签名。正确步骤应该是: Eclipse->选择你要导出的项目->右击->Anroid Tools-Export Unsigned Application Package导出未签名的apk,如下图所示:


4.签名对你的App的影响。
   你不可能只做一个APP,你可能有一个宏伟的战略工程,想要在生活,服务,游戏,系统各个领域都想插足的话,你不可能只做一个APP,谷歌建议你把你所有的APP都使用同一个签名证书。
   使用你自己的同一个签名证书,就没有人能够覆盖你的应用程序,即使包名相同,所以影响有:
  1) App升级。 使用相同签名的升级软件可以正常覆盖老版本的软件,否则系统比较发现新版本的签名证书和老版本的签名证书不一致,不会允许新版本安装成功的。
  2) App模块化。android系统允许具有相同的App运行在同一个进程中,如果运行在同一个进程中,则他们相当于同一个App,但是你可以单独对他们升级更新,这是一种App级别的模块化思路。
  3) 允许代码和数据共享。android中提供了一个基于签名的Permission标签。通过允许的设置,我们可以实现对不同App之间的访问和共享,如下:

AndroidManifest.xml:<permission android:protectionLevel="normal" />

其中protectionLevel标签有4种值:normal(缺省 值),dangerous, signature,signatureOrSystem。简单来说,normal是低风险的,所有的App不能访问和共享 此App。dangerous是高风险的,所有的App都能访问和共享此App。signature是指具有相同签名的App可以访问和共享此App。signatureOrSystem是指系统image中App和具有相同签名的App可以访问和共享此App,谷歌建议不要使用这个选项,因为签名就足 够了,一般这个许可会被用在在一个image中需要共享一些特定的功能的情况下。

 

5.使用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)。

相关文章:http://blog.csdn.net/hssdw25172008/article/details/6948313


参考文章:

参考文章:

Android学习系列(1)--为App签名(为apk签名)

http://www.cnblogs.com/qianxudetianxia/archive/2011/04/09/2010468.html

给Android 应用程序签名

http://www.oschina.net/question/163910_27292

Android如何进行数字签名与优化

http://blog.csdn.net/huxinli/article/details/7403255