Android签名知识小结
一、为什么要签名
开发android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。
由于开发商可能通过使用相同的package name来混淆替换已经安装的程序,签名可以保证相当名字,但是签名不同的包不被替换。
apk如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本,这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉。
这样签名其实也是开发者的身份标识。交易中抵赖等事情发生时,签名可以防止抵赖的发生。
二、签名的注意事项
android系统要求所有的程序经过数字签名才能安装,如果没有可用的数字签名,系统将不许安装运行此程序。不管是模拟器还是真实手机。因此,在设备或者是模拟器上运行调试程序之前,必须为应用程序设置数字签名。
android签名的数字证书不需要权威机构来认证,是开发者自己产生的数字证书,即所谓的自签名。数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序。
系统仅仅会在安装的时候测试签名证书的有效期,如果应用程序的签名是在安装之后才到期,那么应用程序仍然可以正常启用。
可以使用标准工具-keytool and jarsigner-生成密钥,来签名应用程序的.apk文件。
签名后需使用zipalign优化程序。
模拟器开发环境,开发时通过adb接口上传的程序会先自动被签有debug权限,然后才传递到模拟器。eclipse菜单的window -> preferences -> android –> build 下显示的是我们默认的调试用的签名数字证书。
正式发布一个android应用时,必须使用一个合适的私钥生成的数字证书来给程序签名,不能使用adt插件或者ant工具生成的调试证书来发布。
不止一次有用到android签名相关的知识,每次都几乎从零开始在google上搜索找,不想在继续这样了,找了个时间好好整理了一下自己用到的一些碎片知识,于是乎放到这里,一是备忘,二是帮助别人。
从apk文件中获取签名信息
使用方法
keytool -list -printcert -jarfile your_apk_file
输出信息
签名owner,issuer等信息
签名的fingerprints,如md5及sha1等值
签名有效期等信息
示例效果
16:29 $ keytool -list -printcert -jarfile akoi_1.2.apk
signer #1:
signature:
owner: cn=andrew wallace, ou=droidyue.com, o=droidyue.com, l=beijing, st=beijing, c=86 issuer: cn=andrew wallace, ou=droidyue.com, o=droidyue.com, l=beijing, st=beijing, c=86 serial number: 11a8a4a3 valid from: tue feb 10 18:07:43 cst 2015 until: sun jun 13 18:07:43 cst 3013 certificate fingerprints: md5: 46:c5:be:ef:b5:c9:00:e1:fa:42:50:50:57:54:ca:15 sha1: c1:14:5d:0a:c2:bf:f6:06:43:20:ae:2c:07:12:97:58:c2:1b:39:d1 sha256: 0e:88:7d:c2:4c:d6:84:a7:58:d4:24:1e:9d:38:f9:05:98:1e:b2:a2:d7:cb:0f:81:74:60:5b:38:89:ff:21:1c signature algorithm name: sha256withrsa version: 3
从签名文件中获取签名信息
使用方法
keytool -list -v -keystore your_kestore_file
注意,上述命令执行后,会提示输入密码,其实输入错误也没有关系,不影响结果。
输出信息
签名owner,issuer等信息
签名的fingerprints,如md5及sha1等值
签名有效期等信息
示例效果
keystore type: jks keystore provider: sun your keystore contains 1 entry alias name: droidyue.com creation date: feb 10, 2015 entry type: privatekeyentry certificate chain length: 1 certificate[1]: owner: cn=andrew wallace, ou=droidyue.com, o=droidyue.com, l=beijing, st=beijing, c=86 issuer: cn=andrew wallace, ou=droidyue.com, o=droidyue.com, l=beijing, st=beijing, c=86 serial number: 11a8a4a3 valid from: tue feb 10 18:07:43 cst 2015 until: sun jun 13 18:07:43 cst 3013 certificate fingerprints: md5: 46:c5:be:ef:b5:c9:00:e1:fa:42:50:50:57:54:ca:15 sha1: c1:14:5d:0a:c2:bf:f6:06:43:20:ae:2c:07:12:97:58:c2:1b:39:d1 sha256: 0e:88:7d:c2:4c:d6:84:a7:58:d4:24:1e:9d:38:f9:05:98:1e:b2:a2:d7:cb:0f:81:74:60:5b:38:89:ff:21:1c signature algorithm name: sha256withrsa version: 3
重新签名apk
在没有源码情况下,我们就能对apk进行更换签名。
脚本
signapk.sh
备用地址
使用方法
bash signapk.sh your_apk_file your_keystore_file keystore_pass keystore_alias
示例效果
16:57 $ bash signapk.sh weixin6313android740.apk ~/documents/baidu_disk/百度云同步盘/droidapp/mykiki 123456 droidyue.com param1 weixin6313android740.apk param2 /users/androidyue/documents/droidapp/mykiki param3 123456 param4 droidyue.com deleting: meta-inf/manifest.mf deleting: meta-inf/droidyue.sf deleting: meta-inf/droidyue.rsa adding: meta-inf/manifest.mf adding: meta-inf/droidyue.sf adding: meta-inf/droidyue.rsa ...... verification succesful
生成的文件会放在当前目录,其文件名相对输入文件,增加了signed_前缀,比如对weixin6313android740.apk进行上述操作得到的输出文件是signed_weixin6313android740.apk
gradle build生成签名apk
想要在执行gradle build时生成指定签名的apk,需要在build.gradle中如下修改
android { signingconfigs { release { storefile file("myrelease.keystore") storepassword "********" keyalias "******" keypassword "******" } } buildtypes { release { signingconfig signingconfigs.release } } }
以上所述是小编给大家介绍的android签名知识小结,希望对大家有所帮助!
上一篇: MyBatis的嵌套查询解析
推荐阅读
-
Eclipse下配置Ant脚本并自动打包带签名的Android apk
-
Android签名知识小结
-
Android中闪屏实现方法小结(普通闪屏、倒计时闪屏、倒计时+动画闪屏)
-
Android自定义FloatingActionButton滑动行为只隐藏不出现的问题小结
-
Android实现延迟的几种方法小结
-
Android应用UI开发中Fragment的常见用法小结
-
Android的APK应用签名机制以及读取签名的方法
-
给Android的APK程序签名和重新签名的方法
-
Android中闪屏实现方法小结(普通闪屏、倒计时闪屏、倒计时+动画闪屏)
-
Android自定义FloatingActionButton滑动行为只隐藏不出现的问题小结