一、为什么要签名
最简单直接的回答:系统要求的。
Android系统要求所有的程序经过数字签名才能安装,如果没有可用的数字签名,系统将不许安装运行此程序。不管是模拟器还是真实手机。因此,在设备或者是模拟器上运行调试程序之前,必须为应用程序设置数字签名。
Android签名的数字证书不需要权威机构来认证,是开发者自己产生的数字证书,即所谓的自签名。数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序。
系统仅仅会在安装的时候测试签名证书的有效期,如果应用程序的签名是在安装之后才到期,那么应用程序仍然可以正常启用。
(1)签名这时候就是起区分作用的,只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!
(2)签名能够标示应用程序,由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当名字,但是签名不同的包不被替换。APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本,这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉。
(3)签名能够标示开发者身份,签名其实也是开发者的身份标识。交易中抵赖等事情发生时,签名可以防止抵赖的发生。
二、签名的注意事项
可以使用标准工具-Keytool and Jarsigner-生成密钥,来签名应用程序的.apk文件。
签名后需使用zipalign优化程序。
模拟器开发环境,开发时通过ADB接口上传的程序会先自动被签有Debug权限,然后才传递到模拟器。Eclipse菜单的Window -> Preferences -> Android –> Build 下显示的是我们默认的调试用的签名数字证书。
正式发布一个Android应用时,必须使用一个合适的私钥生成的数字证书来给程序签名,不能使用ADT插件或者ANT工具生成的调试证书来发布。
三、生成签名文件
(1)利用Eclipse,工程-》Android Tools-》Export Signed Application Package ...-》Browse项目(next)-》create new keystore(填写相关内容即可)。
(2)利用keytool,命令行:keytool -genkey -alias XX.keystore -keyalg RSA -validity 2000 -keystore XX.keystore。
-alias 后面跟的是别名这里是alias_name;
-keyalg 是加密方式这里是RSA算法 ;
-validity 是有效期这里是20000天 ;
-keystore 就是要生成的keystore的名称这里是app.keystore;
然后按回车键,按回车后首先会提示你输入的密码:这个在签名时要用的,要记住。
然后按回车键,会再确认你的密码。
之后会依次叫你输入姓名、组织单位、组织名称、城市区域、省份名称、国家代码(CN)等。
四、签名工具
(1)利用Eclipse,直接签名打包
(2)利用jar signer,命令行:jar signer -verbose -keystore XX.keystore -signedjar app_signed.apk app.apk alias_name。
-keystore: keystone的名称;
-signedjar app_signed.apk: 指定签名后生成的APK名称;
app.apk: 目标APK
;
然后按回车,会要求输入刚才设置的密码(上面需要记住的密码,生成keystore时设置的),输入后按回车就开始签名了。
五、查看签名
(1)jarsigner -verify app_signed.apk
查看是否签名,如果已经签名会打印 "jar verified"。
(2)jarsigner -verify -verbose -certs app_signed.apk
查看签名详细信息。
六、优化apk
android自带的工具,./build/tools/zipalign
(1)zipalign -v 4 app_signed.apk androidres.apk 对apk优化
(2)zipalign -c -v 4 androidres.apk 查看apk是否经过优化