什么是签名、为什么要给应⽤程序签名、如何给应⽤程序签名Android应⽤程序签名相关的理论知识包括:什么是签名、为什么要给应⽤程序签名、如何给应⽤程序签名等。
1、什么是签名?
如果这个问题不是放在Android开发中来问,如果是放在⼀个普通的版块,我想⼤家都知道签名的含义。可往往就是将⼀些⽣活中常⽤的术语放在计算机这种专业领域,⼤家就开始迷惑了。计算机所做的事情,或者说编程语⾔所做的事情,不正是在尽可能地模拟现实吗?所以,计算机中所说的签名和⽣活中所说的签名在本质上是⼀样的,它所起到的作⽤也是⼀致的!
2、为什么要给Android应⽤程序签名?
如果只能⽤⼀句简单的话语来回答这个问题的话,我会说:“这是Android系统所要求的”。
Android系统要求每⼀个Android应⽤程序必须要经过数字签名才能够安装到系统中,也就是说如果⼀个Android应⽤程序没有经过数字签名,是没有办法安装到系统中的!Android通过数字签名来标识应⽤程序的作者和在应⽤程序之间建⽴信任关系,不是⽤来决定最终⽤户可以安装哪些应⽤程序。这个数字签名由应⽤程序的作者完成,并不需要权威的数字证书签名机构认证,它只是⽤来让应⽤程序包⾃我认证的。
3、为什么我开发的Android应⽤程序没有做什么签名也能在模拟器和⼿机上运⾏?
你没有给Android应⽤程序签名并不代表Android应⽤程序没有被签名。为了⽅便我们开发调试程序,ADT会⾃动的使⽤debug密钥为应⽤程序签名。debug密钥?它在哪?debug密钥是⼀个名为debug.keystore的⽂件,它的位置:
Ubuntu: ~/.android/debug.keystore (win7: c:/user/.Android/debug.keystore;  xp: C:/Documents and
Settings/user/.Android/debug.keystore)
“user”对应于你⾃⼰的windows操作系统⽤户名,这也就意味着,如果我们想拥有⾃⼰的签名,⽽不是让ADT帮我们签名的话,我们也要有⼀个属于⾃⼰的密钥⽂件(*.keystore)。
4、Android应⽤程序签名步骤
1)准备⼯作
apk的签名⼯作可以通过两种⽅式来完成:
1)通过ADT提供的图形化界⾯完成apk签名;
右键项⽬——》 Android Tools ——》Export Signed ——》打开图形界⾯
2)完全通过shell/dos命令来完成apk签名
我⽐较喜欢第2)种⽅式,所以下⾯将讲解如何通过命令的⽅式完成apk签名。
给apk签名⼀共要⽤到3个⼯具,或者说3个命令,分别是:keytool、 jarsigner、 zipalign,下⾯是对这3个⼯具的简单介绍:
1)keytool:⽣成数字证书,即密钥,也就是上⾯说到的扩展名为.keystore的那类⽂件;
2)jarsigner:使⽤数字证书给apk⽂件签名;
3)zipalign:对签名后的apk进⾏优化,提⾼与Android系统交互的效率(Android SDK1.6版本开始包含此⼯具)从这3个⼯具的作⽤也可以看出,这3个⼯具的使⽤顺序。通常我们⾃⼰所开发的所有应⽤程序,都是使⽤同样的签名,即使⽤同⼀个数字证书,这就意味着:如果你是第⼀次做Android应⽤程序签名,上⾯的3个⼯具都将⽤到;但如果你已经有数字证书了,以后再给其它apk 签名时,只需要⽤到jarsigner和zipalign就可以完成。
为了⽅便使⽤上⾯3个命令,⾸先需要将上⾯3个⼯具所在路径添加到环境变量path中(我说的是为了
⽅便使⽤,没有说必须要这么做)。怎么配置环境变量请参见我先前的博客(Windows 或 Ubuntu),这⾥需要说⼀下这3个⼯具默认所在的路径:
1)keytool:该⼯具位于jdk安装路径的bin⽬录下;
2)jarsigner:该⼯具位于jdk安装路径的bin⽬录下;
3)zipalign:该⼯具位于Android-sdk-windows/tools/⽬录下
不知道⼤家是否注意到keytool和jarsigner两个⼯具是jdk⾃带的,也就意味着⽣成数字证书和⽂件签名不是Android的专利;另外从字⾯上理解jarsigner也能猜得出该⼯具主要是⽤来给jar⽂件签名的。
2)⽣成未经签名的apk⽂件
既然我们要⾃⼰对apk进⾏签名,就不再需要ADT默认帮我们签名了。如何得到⼀个未经签名的apk⽂件呢?打开Eclipse,在Android⼯程名称上点击右键,依次选择“Android Tools” - “Export Unsigned Application Package ...”,然后选择⼀个存储位置保存即可。这样就得到了⼀个未经签名的apk⽂件。
其中,在这⼀步,我导出时候报错了,如下:
他的解决办法如下:
只要将Run full error check when exporting app前⾯的勾去掉就可以了。
3)使⽤keytool⼯具⽣成数字证书
keytool -genkey -v -keystore it-homer.keystore -alias it-homer.keystore -keyalg RSA -validity 20000
说明:
1)keytool是⼯具名称,-genkey意味着执⾏的是⽣成数字证书操作,-v表⽰将⽣成证书的详细信息打印出来,显⽰在dos窗⼝中;
2)-keystore  it-homer.keystore 表⽰⽣成的数字证书的⽂件名为“ it-homer.keystore”(it-homer可以取⾃⼰的名字);
3)-alias  it-homer.keystore 表⽰证书的别名为“ it-homer.keystore”,当然可以不和上⾯的⽂件名⼀样;
4)-keyalg RSA 表⽰⽣成密钥⽂件所采⽤的算法为RSA;
5)-validity 20000 表⽰该数字证书的有效期为20000天,意味着20000天之后该证书将失效
在执⾏上⾯的命令⽣成数字证书⽂件时,会提⽰你输⼊⼀些信息,包括证书的密码,⽰例如下:
4)使⽤jarsigner⼯具为Android应⽤程序签名
jarsigner -verbose -keystore  it-homer.keystore -signedjar notepad_signed.apk notepad.apk  it-homer.keystore
说明:
1)jarsigner是⼯具名称,-verbose表⽰将签名过程中的详细信息打印出来,显⽰在dos窗⼝中;
2)-keystore  it-homer.keystore 表⽰签名所使⽤的数字证书所在位置,这⾥没有写路径,表⽰在当前⽬录下;
3)-signedjar notepad_signed.apk notepad.apk 表⽰给notepad.apk⽂件签名,签名后的⽂件名称为notepad_signed.apk;
4)最后⾯的 it-homer.keystore 表⽰证书的别名,对应于⽣成数字证书时-alias参数后⾯的名称
5)使⽤zipalign⼯具优化已签名的apk(⾮必须但建议这么做)
zipalign -v 4 notepad_signed.apk notepad_signed_aligned.apk
说明:
1)zipalign是⼯具名称,-v表⽰在DOS窗⼝打印出详细的优化信息;
2)notepad_signed.apk notepad_signed_aligned.apk 表⽰对已签名⽂件notepad_signed.apk进⾏优
化,优化后的⽂件名为
notepad_signed_aligned.apk
说明:如果你以前的程序是采⽤默认签名的⽅式(即debug签名),⼀旦换了新的签名应⽤将不能覆盖安装,必须将原先的程序卸载掉,才能安装上。因为程序覆盖安装主要检查两点:
1)两个程序的⼊⼝Activity是否相同。两个程序如果包名不⼀样,即使其它所有代码完全⼀样,也不会被视为同⼀个程序的不同版本;    2)两个程序所采⽤的签名是否相同。如果两个程序所采⽤的签名不同,即使包名相同,也不会被视为同⼀个程序的不同版本,不能覆盖安装。
另外,可能有⼈可能会认为反正debug签名的应⽤程序也能安装使⽤,那也没有必要⾃⼰签名了嘛。千万不要这样想,debug签名的应⽤程序有这样两个限制,或者说风险:
android获取真正的签名
1)debug签名的应⽤程序不能在Android Market上架销售,它会强制你使⽤⾃⼰的签名;
2)debug.keystore在不同的机器上所⽣成的可能都不⼀样,就意味着如果你换了机器进⾏apk版本升级,那么将会出现上⾯那种程序不能覆盖安装的问题。不要⼩视这个问题,如果你开发的程序只有你⾃⼰使⽤,当然⽆所谓,卸载再安装就可以了。但要是你的软件有很多使⽤客户,这就是⼤问题了,就相当于软件不具备升级功能!
原⽂:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。