【转】Android APK的数字签名的作用和意义

摘要:
Android使用数字签名来识别应用程序的作者并在应用程序之间建立信任关系,而不是确定最终用户可以安装哪些应用程序。Android系统允许具有相同数字签名的程序在一个进程中运行,Android程序会将它们视为同一程序。我们都知道,无论是在模拟器上还是在实际的物理设备上,Android系统都不会在没有数字签名的情况下安装和运行任何apk程序。
1. 什么是数字签名?
数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的
 
 
2. 为什么要数字签名?

最简单直接的回答: 系统要求的。

 Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!
Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。
这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。 

3.数字证书的机制?
Android使用Java的数字证书相关的机制来给apk加盖数字证书,要理解android的数字证书,需要先了解以下数字证书的概念和java的数字证书机制。


4.程序使用相同的数字证书的好处
(1)有利于程序升级
当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。
 
(2)有利于程序的模块化设计和开发。
Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。

(3)可以通过权限(permission)的方式在多个程序间共享数据和代码。
Android提供了基于数字证书的权限赋予机制,应用程序可以和其他的程序 共享概功能或者数据给那那些与自己拥有相同数字证书的程序。如果某个权限(permission)的protectionLevel是 signature,则这个权限就只能授予那些跟该权限所在的包拥有同一个数字证书的程序。

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

(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。

(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。

(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。

6. 数字证书的要点:

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

             (1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序

             (2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证

             (3)如果要正式发布一个Android,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。

             (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

             (5)Android使用标准的java工具 Keytool
andJarsigner
 来生成数字证书,并给应用程序包签名。

           
6)使用zipalign优化程序。


数字签名的两种模式

我们都知道Android系统不会安装运行任何一款未经数字签名的apk程序,无论是在模拟器上还是在实际的物理设备上。所以我们会有一个疑问,为何在日常开发过程中我没有进行任何签名的操作,程序都会在模拟器和真机上运行?下面我们来讲讲

APK程序的两种模式: 调试模式(debugmode)和发布模式(release mode)


1. 调试模式(debug mode) : 在调试模式下,ADT会自动的使用debug密钥为应用程序签名,因此我们可以直接运行程序。


debug密钥:  一个名为debug.keystore的文件

存放位置:    C:UsersXiaopeng.androiddebug.keystore  
   Xiaopeng对应替换为自己操作系统的用户名

两个风险:
     debug签名的应用程序有这样两个风险:

     1)debug签名的应用程序不能在Android Market上架销售,它会强制你使用自己的签名;

     2)debug.keystore在不同的机器上所生成的可能都不一样,就意味着如果你换了机器进行apk版本升级,那么将会出现上面那种程序不能覆盖安装的问题。
          不要小视这个问题,如果你开发的程序只有你自己使用,当然无所谓,卸载再安装就可以了。但要是你的软件有很多使用客户,这就是大问题了,就相当于软件不具备升级功能! 

所以一定要有自己的数字证书来签名;

2. 发布模式(release mode): 当要发布程序时,开发者就需要使用自己的数字证书给apk包签名

使用自己的数字证书给APK签名的两种方法:

(1)通过DOS命令来对APK签名。

(2)使用ADT Export Wizard进行签名

免责声明:文章转载自《【转】Android APK的数字签名的作用和意义》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Spark官方文档翻译(一)~OverviewMFC中的CString类下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android中AppWidget的分析与应用:AppWidgetProvider .

from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrvodier在整个AppWidget体系中所扮演的角色。分析了AppWidgetProvider如何被AppWidget系统所识别;AppWidgetProvi...

使用百度地图API进行Android地图应用开发(Eclipse)

随着基于位置的服务的兴起,地图类App呈现爆发趋势。随着而来的是地图供应商开放大量的API。供开发人员开发基于PC或者移动端的应用程序。 如今我们研究使用百度地图SDK进行Android项目的开发。 本文讨论怎样导入百度地图SDK。 主要分为server端配置和client配置。 (1)首先要有一个百度账号,账号能够去百度官网申请,然后登陆:http:/...

Android应用的电量消耗和优化的策略

 对于Android移动应用的开发者来说,耗电量的控制一直是个老大难问题。      我们想要控制耗电量,必须要有工具或者方法比较准确的定位应用的耗电情况。下面,我们先来分析下如何计算android应用的耗电量。    在android自带的设置里面有电量计算的界面,如下图: <ignore_js_op>    我们看下是如何实现的:​    ...

Android 开发环境搭建

JDK配置 安装完成之后: 我的电脑——右键属性——高级系统设置——环境变量——系统变量新建——变量名JAVA_HOME   变量值为所安装JDK的根文件夹,如F:Javajdk1.7.0_60——确定 系统变量PATH——编辑——末尾加上; %JAVA_HOME%in;%JAVA_HOME%jrein;——确定 确认: 控制台java –versio...

教你高速高效接入SDK——Unity统一接入渠道SDK(Android篇)

U8SDK的设计之初,就是为了可以支持各种游戏引擎开发的游戏,而不不过Android的原生平台。眼下一大半的手游,都是採用Unity3D和Cocos2dx开发,那么这里,我们就先来一步步给大家演示,用Unity开发的游戏,怎样通过U8SDK来高速地完毕多家渠道SDK的接入。 Unity研发的手游,仅仅须要调用U8SDK抽象层就可以完毕多家渠道SDK的接...

使用adb命令安装安卓apk包

   虽然网上也有许多adb安装安卓包的教程,但经过自己亲自试了一下后,觉得自己写下来的才是自己的收获。 一、下载安装adb工具         下载地址有很多,这里是我下载的地址:https://pan.baidu.com/s/1mgGkNZM,下载文件比较齐全。         下载后是个压缩包,解压后一共有5个文件,如下图:这里我都是解压到当前文件夹...