签名介绍

什么是签名?

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

为什么要签名?

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

签名的好处:

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

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

如何签名打包

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

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

Android apk 签名总结_第1张图片

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

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

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

通过图形化界面签名打包

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

Android apk 签名总结_第2张图片

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

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

Android apk 签名总结_第3张图片

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

Android apk 签名总结_第4张图片

next之后,

Android apk 签名总结_第5张图片

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

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

Android apk 签名总结_第6张图片

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

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

Android apk 签名总结_第7张图片

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

Android apk 签名总结_第8张图片

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

通过命令的方式签名打包

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

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">keytool <span class="hljs-attribute" style="box-sizing: border-box;">-list</span> <span class="hljs-attribute" style="box-sizing: border-box;">-v</span> <span class="hljs-attribute" style="box-sizing: border-box;">-keystore</span> debug<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>keystore</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

Android apk 签名总结_第9张图片

debug签名的口令是:android

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

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

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

Android apk 签名总结_第10张图片

生成签名的命令如下:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">keytool <span class="hljs-attribute" style="box-sizing: border-box;">-genkey</span> <span class="hljs-attribute" style="box-sizing: border-box;">-v</span> <span class="hljs-attribute" style="box-sizing: border-box;">-keystore</span> xxx<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>keystore <span class="hljs-attribute" style="box-sizing: border-box;">-alias</span> xxx <span class="hljs-attribute" style="box-sizing: border-box;">-keyalg</span> RSA <span class="hljs-attribute" style="box-sizing: border-box;">-validity</span> xxx</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
  1. -getkey 表示生成数字签名 -v表示将签名的信息显示在dos窗口中
  2. -keystore xxx 表示要生成签名的名称
  3. -alias xxx 表示签名的别名
  4. -keyalg RSA 表示生成密钥采用的是RSA算法
  5. -validity xxx 表示签名的有效期

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

Android apk 签名总结_第11张图片

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

Android apk 签名总结_第12张图片

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

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">jarsigner -verbose -keystore xxx<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.keystore</span> -signedjar xxx<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.apk</span> xxx<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.apk</span> xxx</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
  1. -verbose 表示将签名过程中的信息输出到dos上显示。
  2. -keystore xxx 表示所使用签名的地址
  3. -signedjar xxx1 xxx2 表示将xxx2签名成xxx1,xxx1是经过签名的apk文件名称(注意顺序)
  4. 最后一个xxx表示签名的别名。(没有命令貌似不能执行)

这里写图片描述

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

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

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">zipalign -v <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> xxx<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.apk</span> xxx_aligned<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.apk</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

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

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

<code class="hljs scss has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">zipalign能够是apk文件未压缩的数据在4个字节边界上对齐,这样android系统就可以使用<span class="hljs-function" style="box-sizing: border-box;">mmap()</span>函数读取文件,可以在读取资源文件上获取较高的性能。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

总结

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

Android apk 签名总结_第13张图片
- 未经过签名的apk不能安装到手机上。在经过Export Unsigned Application Package步骤之后,eclipse就会给你提示:在发布程序之前,需要对程序签名处理

Android apk 签名总结_第14张图片

更多相关文章

  1. Java乔晓松-android中获取图片的缩略图(解决OutOfMemoryError)内
  2. Android手机端使用Zipalign优化apk应用程序
  3. Android的无边界程序设计理念
  4. 管理Android应用程序的资源
  5. Android 打开相册,选择一张图片并返回
  6. android恶意程序分析 (二)
  7. android 加载图片的三种方式

随机推荐

  1. android 使用contentobserver监听数据库
  2. android系统
  3. iPhone和Android,谁将成为赢家?
  4. Android(安卓)HAL 开发 (1)
  5. sdcardFS(android sdcard存储方案---基于w
  6. Android中如何修改编译的资源ID值(默认值
  7. Android与设计模式浅谈
  8. 最新!!Android(安卓)状态栏详细开发,5分钟精
  9. Android(安卓)Opengl开发一
  10. 打造android万能上拉下拉刷新框架——XRe