Android从零单排之签名打包

转载请注明出处:http://blog.csdn.net/crazy1235/article/details/46289803

签名介绍

什么是签名?

在现实生活中,签名就相当与合同上的签字和盖章。只有签名之后,才具有一定的效力。如果没有签名,“合同”就没有对象,也就没有法律效力了。


为什么要签名?

Android系统要求每一个应用程序必须经过数字签名才能安装到系统中,也就是说没有经过签名的app,是没有办法安装到你的android机器上的。
Android通过数字签名来标志应用程序和开发者之间的联系,它是对应用程序自我认证的一个方式。
说白了,就是为了标志一个APP的所属,区分APP。


签名的好处:

  • 程序升级带来方便。
    只有相同签名和相同包名的程序才能覆盖安装。
  • 应用程序模块化。
    android系统允许拥有同一个数字签名的程序运行在一个进程中,android程序会将他们视为同一个程序,所以可以将程序分模块开发,用户只需在需要的时候下载相应的模块即可。
  • 数据共享
    android提供了基于数字证书的权限赋予机制,应用程序可以喝其他程序共享一些数据给拥有相同签名的程序。

(最后两点好处,笔者暂时没有接触到。)


如何签名打包

对APK进行签名,有两种方式,分别是 1. 通过ADT提供的图形化界面签名打包2. 通过DOS命令来签名打包

首先需要说明的一下就是:我们一般调试程序,使用的都是debug签名(debug.keystore)。

技术分享

一般我们开发应用程序的时候,都是多人协作的,每个人的机器的debug的签名都是不一样的,所以经常会遇到你写的程序提交之后,同事更新了之后就不能正常的运行。比如百度地图的相关代码逻辑,是与签名有很大联系的。使用debug签名会导致,某些代码只能在你自己的机器上运行,这样就太LOW了。

所以一般都是共用一个release签名
最终发布apk版本的时候,用的就是release版的签名,也就是正式版的签名。


下面,笔者对这两种方式都自己讲解一下:

通过图形化界面签名打包

项目右键,你会看到:Android Tools

技术分享

Export Signed Application Package
表示导出带有签名的apk文件。
Export Unsigned Application Package
表示导出不带有签名的apk文件

我们选择第一项,然后next,

技术分享

此时你可以选择使用已经存在的keystore,也可以自己创建一个keystore。
我们选择创建一个:

技术分享

next之后,

技术分享

在此界面需要填写一些签名的信息,比如:别名,签名密码,使用期限,组织信息等。

再次下一步,就是生成带有签名的apk文件了。

技术分享

经过上面的一系列的步骤,就打包出来一个带有签名的apk文件。

下次再发布版本的时候,就可以使用已经生成的签名打包了。

技术分享

next之后,如果你的签名文件密码是正确,会自动把你设置的别名列出来:

技术分享

然后输入你的签名的密码,下一步,下一步就行了。


通过命令的方式签名打包

在使用命令的方式生成签名打包之前,我们先看一下debug.kestore都包括哪些信息。
使用如下命令,可以查看签名的信息:

keystool -list -v -keystore debug.keystore

技术分享

debug签名的口令是: android

可以看到debug.keystore中包含的信息,与我们用图形化界面创建签名填写的信息基本对应。

我们对工程进行签名打包需要用到两个工具:keytooljarsigner

  • keytool:用于生成数字签名。
    keytool不仅可以用来查看签名信息,也可以用来生成一个签名,该工具位于jdk的bin目录下。

技术分享

生成签名的命令如下:

keytool -genkey -v -keystore xxx.keystore -alias xxx -keyalg RSA -validity xxx
  1. -getkey 表示生成数字签名 -v表示将签名的信息显示在dos窗口中
  2. -keystore xxx 表示要生成签名的名称
  3. -alias xxx 表示签名的别名
  4. -keyalg RSA 表示生成密钥采用的是RSA算法
  5. -validity xxx 表示签名的有效期

执行这条命令之后,会提示你输入一些信息:

技术分享

  • jarsigner: 使用签名给apk文件签名。该用具也位于jdk的bin目录中。
    使用命令编译出一个apk文件,很繁琐,得不偿失。我们使用图形化界面来打包出一个不带签名的apk。

技术分享

使用如下命令对此apk进行签名

jarsigner -verbose -keystore xxx.keystore -signedjar xxx.apk xxx.apk xxx
  1. -verbose 表示将签名过程中的信息输出到dos上显示。
  2. -keystore xxx 表示所使用签名的地址
  3. -signedjar xxx1 xxx2 表示将xxx2签名成xxx1,xxx1是经过签名的apk文件名称。(注意顺序)
  4. 最后一个xxx表示签名的别名。(没有命令貌似不能执行)

技术分享

执行此命令之后,稍微等待一会,就会提示你打包成功。

笔者在研究签名打包的过程中,在网上看到还有一个步骤,就是使用zipalign命令对apk进行优化。

zipalign -v 4 xxx.apk xxx_aligned.apk

命令的意思就是把xxx.apk优化成为xxx_aligned.apk。针对项目比较庞大的时候,使用此命令有较大的明显,比较小的项目优化效果不是很明显。

此命令解释如下(网络):

zipalign能够是apk文件未压缩的数据在4个字节边界上对齐,这样android系统就可以使用mmap()函数读取文件,可以在读取资源文件上获取较高的性能。

总结

  • 签名不同的相同包结构的apk不能覆盖安装,在手机上安装的时候,会提示你签名冲突。在eclipse等开发工具上运行的时候,会做如下提示:

技术分享
- 未经过签名的apk不能安装到手机上。在经过Export Unsigned Application Package步骤之后,eclipse就会给你提示:在发布程序之前,需要对程序签名处理

技术分享


此篇blog到此结束~~
感谢大家支持!如有错误,请指出~~
谢谢~

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。