Android应用程序签名简介

来源:互联网 发布:ls plc编程软件 编辑:程序博客网 时间:2024/05/16 06:02
Android的应用程序APK的签名其实和一般的jar 文件签名差不多。
首先,得到keystore文件.
你可以从一些机构申请得到一个keystore;也可以自己生成一个自签的keystore文件。APK和jar签名所用的keystore文件是一致的。
因此关于生成自签keystore文件,请参照《Jar文件的数字签名
另外android本身自带一个keystore文件debug.keystore。它一般位于以下目录:C:\Documents and Settings\用户名\.android\。对于Administrator用户,位于C:\Documents and Settings\Administrator\.android\目录下
其次,签名。
我们可以直接用JDK的jarsigner工具对apk文件进行签名。
实例1:
jarsigner -keystore robin.keystore -storepass GL2009 -keypass gl2009  Hello.apk robin
这个命令用密码“GL2009”从名为“robin.keystore”的keystore文件中提出名字为“robin”、密码为“gl2009”的公钥/私钥对,并对Hello.apk 文件按照keystore文件robin.keystore中的约定进行数字签名。签名的输出文件为原apk文件,即Hello.apk
实例2:
jarsigner -keystore robin.keystore -storepass GL2009 -keypass gl2009 -signedjar Hello_signed.apk Hello.apk robin
这个命令用密码“GL2009”从名为“robin.keystore”的keystore文件中提出名字为“robin”、密码为“gl2009”的公钥/私钥对,并对Hello.apk文件按照keystore文件robin.keystore中的约定进行数字签名,签名的输出文件为Hello_signed.apk
补充
使用sun jdk的jarsigner工具来进行签名时,有时会失败出现类似如下的提示:
jarsigner: unable to sign jar: java.util.zip.ZipException: invalid entry compres
sed size (expected 9301 but got 9621 bytes)
网上有人说:这些问题主要是由于资源文件造成的,对于android开发来说应该检查res文件夹中的文件,逐个排查。这个问题可以通过升级系统的JDK和JRE版本来解决。
但是网上提供一种更直接简单而且有效的方法,即:把apk压缩包下面的文件夹META-INF删除掉再重新执行上面的签名命令
当然这种方法的缺点是,如果原apk已经是签名过,你在删除META-INF目录时,它以前的签名也删除了。

另外,关于数字签名的更多东西请参考《数字签名简介》和《Java的数字签名和数字证书