android 签名

安辉 2015-09-09

方法一:命令行下对apk签名(原理)

创建key,需要用到keytool.exe(位于jdk1.6.0_24\jre\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe(位于jdk1.6.0_24\bin目录下),把上两个软件所在的目录添加到环境变量path后,打开cmd输入

D:\>
keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore

/*说明:-genkey产生密钥

-aliasdemo.keystore别名demo.keystore

-keyalgRSA使用RSA算法对签名加密

-validity40000有效期限4000天

-keystoredemo.keystore*/

D:\>
jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore

/*说明:-verbose输出签名的详细信息

-keystoredemo.keystore密钥库位置

-signedjardemor_signed.apkdemo.apkdemo.keystore正式签名,三个参数中依次为签名后产生的文件demo_signed,要签名的文件demo.apk和密钥库demo.keystore.*/

注意事项:android工程的bin目录下的demo.apk默认是已经使用debug用户签名的,所以不能使用上述步骤对此文件再次签名。正确步骤应该是:在工程点击右键->AnroidTools-ExportUnsignedApplicationPackage导出的apk采用上述步骤签名。

使用上面的签名参数,签名以后再模拟器上安装还是提示没有签名,但是在手机上能安装成功,最后修改参数如下,模拟器上就能安装了-digestalgSHA1-sigalgMD5withRSA,好像多上这两个参数

签名

jarsigner -sigalg MD5withRSA  -digestalg SHA1  -keystore demo.keystore -storepass 123456 -signedjar aaa_signed.apk android-release-unsigned.apk demo.keystore

例子:

jarsigner-sigalgMD5withRSA-digestalgSHA1-keystoreaaa.keystore-storepass123456-signedjaraaa_signed.apkaaa.apkaaa.keystore

[-sigalg<算法>]签名算法的名称

[-keystore<url>]密钥库位置

[-storepass<口令>]用于密钥库完整性的口令

[-storetype<类型>]密钥库类型

[-keypass<口令>]专用密钥的口令(如果不同)

[-sigfile<文件>].SF/.DSA文件的名称

[-signedjar<文件>]已签名的JAR文件的名称

[-digestalg<算法>]摘要算法的名称

[-sigalg<算法>]签名算法的名称

[-verify]验证已签名的JAR文件

[-verbose]签名/验证时输出详细信息

[-certs]输出详细信息和验证时显示证书

[-tsa<url>]时间戳机构的位置

[-tsacert<别名>]时间戳机构的公共密钥证书

[-altsigner<类>]替代的签名机制的类名

[-altsignerpath<路径列表>]替代的签名机制的位置

[-internalsf]在签名块内包含.SF文件

[-sectionsonly]不计算整个清单的散列

[-protected]密钥库已保护验证路径

[-providerName<名称>]提供者名称

[-providerClass<类>加密服务提供者的名称

[-providerArg<参数>]]...主类文件和构造函数参数

优化

签名之后,用zipalign(压缩对齐)优化你的APK文件。

未签名的apk不能使用,也不能优化。签名之后的apk谷歌推荐使用zipalign.exe(位于android-sdk-windows\tools目录下)工具对其优化:

D:\>
zipalign -v 4 demo_signed.apk final.apk

如上,zipalign能够使apk文件中未压缩的数据在4个字节边界上对齐(4个字节是一个性能很好的值),这样android系统就可以使用mmap()(请自行查阅这个函数的用途)函数读取文件,可以在读取资源上获得较高的性能,

PS:1.在4个字节边界上对齐的意思就是,一般来说,是指编译器吧4个字节作为一个单位来进行读取的结果,这样的话,CPU能够对变量进行高效、快速的访问(较之前不对齐)。

2.对齐的根源:android系统中的Davlik虚拟机使用自己专有的格式DEX,DEX的结构是紧凑的,为了让运行时的性能更好,可以进一步用"对齐"进一步优化,但是大小一般会有所增加。

5.签名对你的App的影响。

相关推荐