一般情况下,我们在模拟器上调试app时,虽然我们并没有主观的进行签名操作,但是ADT会自动的使用debug密钥为app签名【Android系统要求每一个Android应用程序必须经过数字签名才能够安装到系统中】,debug密钥本质是一个名为debug.keystore的文件,存在于计算机:C:\Users\i\.android\debug.keystore
签名方式:
  1. 通过ADT提供的图形化界面完成apk签名
  2. 通过DOS命令来完成apk签名

签名步骤:(以方式2为例)
  • 步骤一:配置以下三个工具的path环境
  1. 一共需要用到三个命令,分别是:keytool、jarsigner、zipalign
  2. keytool:生成数字证书,即密钥,即后缀为.keystore的文件(D:\Program Files\Java\jdk1.8.0_11\bin)
  3. jarsigner:使用数字证书给apk文件签名(D:\Program Files\Java\jdk1.8.0_11\bin)
  4. zipalign:对签名后的apk进行优化,提高与Android系统交互的效率
:若已经有数字签名了,那么在之后的签名中,只需要用到后两个命令,否则三个都需要
  • 步骤二:生成未经签名的apk包
  • 步骤三:使用keytool工具生成数字证书:
keytool -genkey -v -keystore caoting.keystore -alias marry.keystore -keyalg RSA -validity 20000
  • keytool:工具名
  • -genkey:生成数字证书操作
  • -v:将生成证书的详细信息打印出来,显示在dos窗口中
  • -keystore caoting.keystore:生成的数字证书的文件名为“caoting.keystore”
  • -alias marry.keystore:证书的别名为“-alias marry.keystore”
  • -keyalg RSA:生成密钥文件所采用的算法是RSA
  • -validity 20000:该数字证书的有效期,即为20000天
  • 步骤四:使用jarsigner为apk签名
jarsigner -verbose -keystore caoting.keystore -signedjar destination.apk source.apk marry.keystore
  • jarsigner :工具名
  • -verbose:将签名过程中的详细信息打印出来
  • -keystore caoting.keystore:表示签名所使用的数字证书所在的位置(这里没写路径,表示在当前目录下)
  • -signedjar destination.apk source.apk:表示给source.apk文件签名,且签名后的文件为destination.apk
  • marry.keystore:证书的别名
  • 步骤五:使用zipalign工具优化已签名的apk
zipalign -v destination.apk destination_aligned.apk
  • zipalign :工具名
  •  -v:打印
  • destination.apk destination_aligned.apk:将签名的文件优化,优化后的文件为destination_aligned.apk
:若之前的程序是以默认签名方式(即debug签名),一旦采用了新的签名,应用将不能覆盖安装,必须将原先的程序卸载掉,才能安装上
覆盖安装主要检查两点:
  1. 两个程序的入口Activity是否相同,两个程序的包名不一样,即时其他代码一样,也不会被视为同一个程序的不同版本
  2. 两个程序采用的签名是否相同(debug.keystore在不同的机器上,所生成的可能不一样)

更多相关文章

  1. Android SO文件的兼容和适配
  2. 解决在3.6.2安装android的ADT文件bug
  3. 【转】Android中对Log日志文件的分析
  4. android:gravity 和 android:layout_Gravity属性——android开发
  5. Android之文件读写
  6. Android 文件格式
  7. android项目中每个文件的作用
  8. Fast File Transfer – 让 Android 通过 WIFI 传输文件到任何无
  9. Android开发5——文件读写

随机推荐

  1. 三子棋
  2. 怎样在 Linux 中配置静态网络连接[每日前
  3. 坚持写博客的第二天,在敲代码的时候时间过
  4. 使用 TypeScript 和依赖注入实现一个聊天
  5. 分享崔庆才的一些学习经验和生活感悟
  6. 为什么要用 Node.js?[每日前端夜话0x77]
  7. pytest中print的坑
  8. 程序员到底该怎么给女朋友挑礼物
  9. 互联网骨干网间的连接(NAP和BGP)
  10. Android中自带的SQLite数据库