为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)。
一般开发android的开发者都知道,在我们的Android系统中,不许可安装两个相同的包的应用
假设A应用的包名:com.xwj.appA; A应用已经在系统中存在了,这个时候再去安装一个应用B ,它的包名也叫com.xwj.appA,这时候系统就会去检查这两应用的签名是否相同。如果相同,B会把A给覆盖安装掉; 如果不相同 B安装失败;
当你把应用发布到市场时,你的应用升级了,需要替换旧的程序,安装新的程序
这时你需要两个条件:
1.包名相同 2.签名相同
当包名相同的时候,如果签名相同,替换安装(版本升级)成功。如果签名不相同,安装失败;
要想自动安装(版本升级)成功,必须保证应用程序不同版本的签名完全一样。
在我们程序员自己开发的apk中,一般会有一个默认的签名(新建一个应用,运行程序,在bin目录下apk文件,用压缩文件打开此文件,并进入META-INF目录),打开文件CERT.RSA
这个默认签名的密钥在C:\Users\admin\.android中
注意:因为不同的电脑的默认签名是不一样的,当你在A电脑开发了版本1,在B电脑开发了版本2,当在一个手机中安装了版本1,再安装版本2时是不能覆盖安装的,所以应用程序需要自己签名
接下来讲解如何签名:一般签名有两种方式
一、使用Keytool和Jarsigner给程序签名(用于android低版本1.5以下)在此就不做详解了
二、android 1.5以上暨更新版本的apk签名方式(在进行此方式签名时,一定要先clean项目)
1.打开Eclipse->选择你要签名的项目->右击->android tools->Export signed Application package...
2.跳出窗口
3.如果是已经存在keystore的就直接选择然后next 输入keystore的密码进行签名。如果没有的话选择 create new keystore 然后选择 keystore 保存的位置,设置keystore的密码,点击Next。
4.填写keystore的基本信息,分别为别名,密码,确认密码,有效期,姓名,组织,组织名称,所在城市,所在省份,国家等,点击Next
注意点:1.密码必须和上一步所设置的密码一样
· 2.有效期:Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后,所以有效期一定 要大于19年,否则当时间过了,你的程序将没办法再更新,将损失巨大
3.国家:一般写86,除非你不是中国人,哈
5.选择被签名后的APK保存位置,点击finish
6.然后就可以在你保存的位置中找到相应的被签名后的APK文件
注意点:记得一定不要把keystore文件给丢了,也不要把密码给忘了,否则以后的升级就保存不了以前的用户数据了,重新签名的话也不再是原来的了,正如无法逃脱歌词中写的:我已不是原来的我
如果你的签名丢了怎么办,有两种修复方式:
1.包名不变的情况下,改签名 -----> 牺牲用户,成全自己
优点:你在各个应用市场的排名还是原来的排名(比如你原先在应用市场排名第一,这样子改还是第一,适合应用市场排名高 的)
缺点:无法覆盖安装,即只能提醒用户把原来的程序给卸了,安装新的应用程序(用户体验差)
2.改包名 ,重新签名 -----> 牺牲自己,成全用户
签名之后,用zipalign(压缩对齐)优化你的APK文件
未签名的apk不能使用,也不能优化。签名之后的apk谷歌推荐使用zipalign.exe(位于android-sdk-tools目录下)工具对其优化
1.开始->运行->cmd
2.d: 进入你所在sdk所在盘的目录
3.cd android\sdk\tools 进入tools目录中
4.输入zipalign -v 4 a.apkfinal.apk (a.apk为你所要优化的apk,记得拷到tools目录中,final.apk为你最终生成的apk名字)