新闻中心

EEPW首页>嵌入式系统>设计应用> Android签名详解(debug和release)

Android签名详解(debug和release)

作者: 时间:2016-09-12 来源:网络 收藏

1. 为什么要签名

本文引用地址://m.amcfsurvey.com/article/201609/304715.htm

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_CERTIFICATE字段指名用哪个签名

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,表示不加密,所以签名时不用输入密码


上一页 1 2 3 下一页

关键词:

评论


相关推荐

技术专区

关闭