Android签名详解(debug和release)
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提供的程序⽣成R.java。
第⼆步将.aidl⽂件⽣成.java类⽂件:
Eclipse中⾃动⽣成,ant和命令⾏使⽤android SDK提供的⽣成.java⽂件。
第三步编译.java类⽂件⽣成class⽂件:
Eclipse中⾃动⽣成,ant和命令⾏使⽤jdk的javac编译java类⽂件⽣成class⽂件。
第四步将class⽂件打包⽣成classes.dex⽂件:
Eclipse中⾃动⽣成,ant和命令⾏使⽤android SDK提供的dx.bat命令⾏脚本⽣成classes.dex⽂件。
第五步打包资源⽂件(包括res、assets、l等):
Eclipse中⾃动⽣成,ant和命令⾏使⽤Android SDK提供的⽣成资源包⽂件。
第六步⽣成未签名的apk安装⽂件:
Eclipse中⾃动⽣成debug签名⽂件存放在bin⽬录中,ant和命令⾏使⽤android SDK提供的apkbuilder.bat命令脚本⽣成未签名的apk安装⽂件。
第七步对未签名的apk进⾏签名⽣成签名后的android⽂件:
Eclipse中使⽤Android Tools进⾏签名,ant和命令⾏使⽤jdk的jarsigner对未签名的包进⾏apk签名。
3.1 ⽤eclipse+ADT⽅式签名
详见:
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来⽣成证书和给程序签名。
详见:
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(具体见),应⽤程序中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’
iii. ⽣成私钥ant安装包
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt
把的格式转换成PKCS #8,这⾥指定了-nocryp,表⽰不加密,所以签名时不⽤输⼊密码
4. 签名的相关⽂件
1) apk包中签名相关的⽂件在meta_INF⽬录下
CERT.SF:⽣成每个⽂件相对的密钥
MANIFEST.MF:数字签名信息
xxx.SF:这是JAR⽂件的签名⽂件,占位符xxx标识了签名者
xxx.DSA:对输出⽂件的签名和公钥
2) 相关源码
development/tools/jarutils/src/com.anroid.jarutils/SignedJarBuilder.java
frameworks/base/services/java/com/android/server/PackageManagerService.java
frameworks/base/core/java/android/content/pm/PackageManager.java
frameworks/base/cmds/pm/src/com/android/commands/pm/Pm.java
dalvik/libcore/security/src/main/java/java/security/Sign*
build/target/product/security/platform.*
build/tools/signapk/*
5. 签名的相关问题
⼀般在安装时提⽰出错:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
1) 两个应⽤,名字相同,签名不同
2) 升级时前⼀版本签名,后⼀版本没签名
3) 升级时前⼀版本为DEBUG签名,后⼀个为⾃定义签名
4) 升级时前⼀版本为Android源码中的签
5.1 查看默认签名
不同的机⼦上或不同的设备上,利⽤eclipse编译出的apk签名是不⼀样的。eclipse都有⼀个默认的签名。查看签名路径:
1)打开EclipseàWindowàAndoridàBuild,在这个Build界⾯,到Default debug keysore这个编辑框,⾥⾯的值则为本台设备中Eclipse的keystore的默认路径。
2)如果出现因签名不同⽽导致应⽤程序未安装,可以将原先的keystore替换掉当前设备上的keystore。并重新启动Eclipse。否则只能完全卸载掉移动设备上的apk,重新安装了。
5.2 ⽆法覆盖安装
1、通过签名的⽅式⽣成你的APK,⽽不是直接从Bin⽬录底下去拷贝,每个Android可执⾏程序的APK都有⾃⼰的签名,只要签名⼀致,就可以覆盖安装,⽽不需要卸载;
2、数据库表结构的变化(增加⼀个字段,减少⼀个字段,新表的建⽴)。正常升级数据库的⽅法 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
3、sharepreferences的数据有改变,这个跟数据库差不多,⽐如原来的sharepreferences保存的⼀数据是boolean,在后⼀版本把保存的数据改为string,问题就出现了。
5.3 导出签名
1)打开cmd控制台,输⼊命令:keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore,按照提⽰依次填写内容,并记住密码,后⾯会⽤到;
2)⽣成好keystore后,就可以导出签名apk了。Eclipse中,右击需要签名的⼯程àandroid toolsàexport signed application
package,location为⽣成的keystore所在的位置,密码为创建keystore时设置的密码,然后按照提⽰,next,最后finish,成功导出签名apk。
详见:
5.4 debug签名和release签名的区别
1)debug签名的应⽤程序不能在Android Market上架销售,它会强制你使⽤⾃⼰的签名;Debug模式下签名⽤的证书(默认是Eclipse/ADT和Ant编译)⾃从它创建之⽇起,1年后就会失效。
2)debug.keystore在不同的机器上所⽣成的可能都不⼀样,就意味着如果你换了机器进⾏apk版本升级,那么将会出现上⾯那种程序不能覆盖安装的问题,相当于软件不具备升级功能!
6. Zipalign简单优化
6.1 为什么要优化
Android SDK中包含⼀个“zipalign”的⼯具,它能够对打包的应⽤程序进⾏优化。在你的应⽤程序上运⾏zipalign,使得在运⾏时Android 与应⽤程序间的交互更加有效率。因此,这种⽅式能够让应⽤程序和整个系统运⾏得更快。我们强烈推荐在新的和已经发布的程序上使⽤zipalign⼯具来得到优化后的版本——即使你的程序是在⽼版本的Android平台下开发的。
6.2 如何有助于性能改善
在Android中,每个应⽤程序中储存的数据⽂件都会被多个进程访问;安装程序会读取应⽤程序的manifest⽂件来处理与之相关的权限问题;Home应⽤程序会读取资源⽂件来获取应⽤程序的名和图标;系统服务会因为很多种原因读取资源(例如,显⽰应⽤程序的Notification);此外,就是应⽤程序⾃⾝⽤到资源⽂件。
在Android中,当资源⽂件通过内存映射对齐到4字节边界时,访问资源⽂件的代码才是有效率的。但是,如果资源本⾝没有进⾏对齐处理(未使⽤zipalign⼯具),它就必须回到⽼路上,显式地读取它们——这个过程将会⽐较缓慢且会花费额外的内存。
对于应⽤程序开发者来说,这种显式读取⽅式是相当便利的。它允许使⽤⼀些不同的开发⽅法,包括正常流程中不包含对齐的资源,因此,这种读取⽅式具有很⼤的便利性(本段的原始意思请参考原⽂)。
遗憾的是,对于⽤户来说,这个情况恰恰是相反的——从未对齐的apk中读取资源⽐较慢且花费较多内存。最好的情况是,Home程序和未对齐的程序启动得⽐对齐后的慢(这也是唯⼀可见的效果)。最坏的情况是,安装⼀些未对齐资源的应⽤程序会增加内存压⼒,并因此造成系统反复地启动和杀死进程。最终,⽤户放弃使⽤如此慢⼜耗电的设备。
6.3 如何优化
1)使⽤ADT:
如果你使⽤导出向导的话,Eclipse中的ADT插件(从Ver.0.9.3开始)就能⾃动对齐Release程序包。
使⽤向导,右击⼯程属性,选择Android ToolsàExport Signed Application Package。当然,你还可以通过l编辑器的第⼀页做到。
2)使⽤Ant:
Ant编译脚本(从Android 1.6开始)可以对齐程序包。⽼平台的版本不能通过Ant编译脚本进⾏对齐,必须⼿动对齐。
从Android 1.6开始,Debug模式下编译时,Ant⾃动对齐和签名程序包。
Release模式下,如果有⾜够的信息签名程序包的话,Ant才会执⾏对齐操作,因为对齐处理发⽣在签名之后。为了能够签名程序包,进⽽执⾏对齐操作,Ant必须知道keystore的位置以及build.properties中key的名字。相应的属性名为key.store和key.alias。如果这些属性为空,签名⼯具会在编译过程中提⽰输⼊store/key的密码,然后脚本会执⾏签名及apk⽂件的对齐。如果这些属性都没有,Release程序包不会进⾏签名,⾃然也就不会进⾏对齐了。
3)⼿动:
为了能够⼿动对齐程序包,Android 1.6及以后的SDK的tools/⽂件夹下都有zipalign⼯具。你可以使⽤它来对齐任何版本下的程序包。你必须在签名apk⽂件后进⾏,使⽤以下命令:zipalign -v 4 source.apk destination.apk
4)验证对齐:
zipalign -c -v 4 application.apk
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论