1. 为什么要签名
1) 发送者的身份认证
因为开发商或许经过运用相同的Package Name来混杂替换现已装置的程序,以此保证签名不同的包不被替换
2) 保证信息传输的完整性
签名关于包中的每个文件进行处理,以此保证包中内容不被替换
3) 避免买卖中的狡赖产生,Market对软件的要求
2. 签名的阐明
1) 一切的运用程序都有必要有数字证书,Android体系不会装置一个没有数字证书的运用程序
2) Android程序包运用的数字证书可所以自签名的,不需求一个威望的数字证书组织签名认证
3) 假如要正式发布一个Android运用,有必要运用一个适宜的私钥生成的数字证书来给程序签名,而不能运用adt插件或许ant东西生成的调试证书来发布
4) 数字证书都是有有效期的,Android只是在运用程序装置的时分才会查看证书的有效期。假如程序现已装置在体系中,即便证书过期也不会影响程序的正常功用
5) 签名后需运用zipalign优化程序
6) Android将数字证书用来标识运用程序的作者和在运用程序之间树立信赖联系,而不是用来决议最终用户能够装置哪些运用程序
3. 签名的办法
有三种打包方法:指令行手动打包、ant主动编译打包、eclipse+ADT编译打包,打包过程如下:
第一步 生成R.java类文件:
Eclipse中会主动生成R.java,ant和指令行运用android SDK供给的aapt.ext程序生成R.java。
第二步 将.aidl文件生成.java类文件:
Eclipse中主动生成,ant和指令行运用android SDK供给的aidl.exe生成.java文件。
第三步 编译.java类文件生成class文件:
Eclipse中主动生成,ant和指令行运用jdk的javac编译java类文件生成class文件。
第四步 将class文件打包生成classes.dex文件:
Eclipse中主动生成,ant和指令行运用android SDK供给的dx.bat指令行脚本生成classes.dex文件。
第五步 打包资源文件(包含res、assets、androidmanifest.xml等):
Eclipse中主动生成,ant和指令行运用Android SDK供给的aapt.exe生成资源包文件。
第六步 生成未签名的apk装置文件:
Eclipse中主动生成debug签名文件寄存在bin目录中,ant和指令行运用android SDK供给的apkbuilder.bat指令脚本生成未签名的apk装置文件。
第七步 对未签名的apk进行签名生成签名后的android文件:
Eclipse中运用Android Tools进行签名,ant和指令行运用jdk的jarsigner对未签名的包进行apk签名。
3.1 用eclipse+ADT方法签名
详见:http://jojol-zhou.iteye.com/blog/719428
a) 调试签名
eclipse插件默许赋予程序一个DEBUG权限的签名,此签名的程序不能发布到market上,此签名有效期为一年,假如过期则导致你无法生成apk文件,此刻你只需删去debug keystore即可,体系又会为你生成有效期为一年的新签名
b) 开发者生成密钥并签名
右键点击项目名,在菜单中挑选Android Tools,然后挑选Export Signed Application Package,即可经过eclipse自定义证书并签名
c) 开发者导出未签名的包
右键点击项目名,在菜单中挑选Android Tools,然后挑选Export Signed Application Package…,即可导出未签名的包,之后可经过指令行方法签名
3.2 用指令行方法签名
运用规范的java东西keytool和jarsigner来生成证书和给程序签名。
详见:http://jojol-zhou.iteye.com/blog/729254
a) 生成签名
$ keytool -genkey -keystore keyfile -keyalg RSA -validity 10000 -alias yan
注:validity为天数,keyfile为生成key寄存的文件,yan为私钥,RSA为指定的加密算法(可用RSA或DSA)
b) 为apk文件签名
$ jarsigner -verbose -keystore keyfile -signedjar signed.apk base.apk yan
注:keyfile为生成key寄存的文件,signed.apk为签名后的apk,base.apk 为未签名的apk,yan为私钥
c) 看某个apk是否经过了签名
$ jarsigner -verify my_application.apk
d) 优化(签名后需求做对齐优化处理)
$ zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
3.3 在源码中编译的签名
a) 运用源码中的默许签名
在源码中编译一般都运用默许签名的,在某源码目录顶用运转
$ mm showcommands能看到签名指令
Android供给了签名的程序signapk.jar,用法如下:
$ signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar
*.x509.pem为x509格局公钥,pk8为私钥
build/target/product/security目录中有四组默许签名可选:testkey platform shared media(详细见README.txt),运用程序中Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默许用testkey.
b) 在源码中自签名
Android供给了一个脚本mkkey.sh(build/target/product/security/mkkey.sh),用于生成密钥,生成后在运用程序中经过Android.mk中的LOCAL_CERTIF%&&&&&%ATE字段指名用哪个签名
c) mkkey.sh介绍
i. 生成公钥
openssl genrsa -3 -out testkey.pem 2048
其间-3是算法的参数,2048是密钥长度,testkey.pem是输出的文件
ii. 转成x509格局(含作者有效期等)
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 -subj ‘/C=US/ST=California/L=MountainView/O=Android/OU=Android/CN=Android/emailAddress=android@android.com’
iii. 生成私钥
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
把的格局转换成PKCS #8,这儿指定了-nocryp,表明不加密,所以签名时不必输入暗码