转自:http://www.cnblogs.com/wanqieddy/p/3556060.html
一、为什么要签名
       开发Android的人这么多,完全有可能大家都把类名,包名起成了一个同样的名字,这时候如何区分?签名这时候就是起区分作用的。
        由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,签名可以保证相当名字,但是签名不同的包不被替换。
       APK如果使用一个key签名,发布时另一个key签名的文件将无法安装或覆盖老的版本,这样可以防止你已安装的应用被恶意的第三方覆盖或替换掉。
       这样签名其实也是开发者的身份标识。交易中抵赖等事情发生时,签名可以防止抵赖的发生。

二、签名的注意事项
       Android系统要求所有的程序经过数字签名才能安装,如果没有可用的数字签名,系统将不许安装运行此程序。不管是模拟器还是真实手机。因此,在设备或者是模拟器上运行调试程序之前,必须为应用程序设置数字签名。
       Android签名的数字证书不需要权威机构来认证,是开发者自己产生的数字证书,即所谓的自签名。数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序。
       系统仅仅会在安装的时候测试签名证书的有效期,如果应用程序的签名是在安装之后才到期,那么应用程序仍然可以正常启用。
       可以使用标准工具-Keytool and Jarsigner-生成密钥,来签名应用程序的.apk文件。
       签名后需使用zipalign优化程序。
       模拟器开发环境,开发时通过ADB接口上传的程序会先自动被签有Debug权限,然后才传递到模拟器。Eclipse菜单的Window -> Preferences -> Android –> Build 下显示的是我们默认的调试用的签名数字证书。
       正式发布一个Android应用时,必须使用一个合适的私钥生成的数字证书来给程序签名,不能使用ADT插件或者ANT工具生成的调试证书来发布。

三、签名方法:
1.使用Keytool 和jarsigner工具签名(在jdk/bin目录下)
1.生成签名keystore:
确保电脑上安装了JDK,因为我们将使用JDK自带的创建和管理数字证书的工具Keytool。在命令行下输入如下命令:
keytool -genkey -v -keystore app.keystore -alias alias_name -keyalg RSA -validity       20000

-alias 后面跟的是别名这里是alias_name
-keyalg 是加密方式这里是RSA
-validity 是有效期这里是20000
-keystore 就是要生成的keystore的名称这里是app.keystore           
然后按回车键
按回车后首先会提示你输入的密码:这个在签名时要用的,要记住
然后会再确认你的密码。
之后会依次叫你输入姓名、组织单位、组织名称、城市区域、省份名称、国家代码(CN)等。

Keytool的详细参数请参考:
http://www.android123.com.cn/androidkaifa/173.html

2.签名:
jarsigner -verbose -keystore app.keystore -signedjar app_signed.apk app.apk alias_name
-keystore: keystore的名称
-signedjar  app_signed.apk: 指定签名后生成的APK名称
app.apk: 目标APK
然后按回车:会要求输入刚才设置的密码,输入后按回车就开始签名了。

3.查看签名:
jarsigner -verify app_signed.apk                                  
查看是否签名,如果已经签名会打印 "jar verified".
jarsigner -verify -verbose -certs app_signed.apk      
查看签名详细信息。

4.通过zipalign工具进行优化apk(android自带的工具,./build/tools/zipalign)
zipalign -v 4  app_signed.apk androidres.apk   对apk优化
zipalign -c -v 4  androidres.apk                 查看apk是否经过优化

2.使用eclipse ADT工具签名
在Package Explorer 窗口,右键,选择Android Tools--->Export Signed Application Package 然后按照提示一步一步,生成已签名的apk。通过eclipse也可以导出未签名的APK文件。
注:需要输入两次密码,第一次是私钥密码,第二次时私钥别名的密码。

3.eclipse在debug模式下自动签名(无须手动配置):  
在debug模式下用eclipse 的ADT为android签名,只要应用程序在eclipse下开发,系统就会自动给apk签名和优化。
在Eclipse中Windows > Preferences > Android  > Build可以看到你keysotre的位置;

四、生成Android系统签名
       上面讲的Android数字签名大多是与Android APK相关,做CTS 认证时,需要用到Android系统签名。为什么需要给Android系统签个名才能进行CTS认证呢?原来我们通过make -j4编译出来的system.img使用的是test key,这种类型的key只适用于开发阶段,而且这种秘钥是公开的,谁都可以使用。当发布一款android产品,就需要另外给整个系统签个名,防止被别人盗用。这种系统就是release版本的Android系统。

1、生成加密key文件
要对Android系统进行签名,需要生成四种类型的key文件。
a)releasekey (testkey)
b)media
c)shared
d)platform
1)进入/android_src/development/tools目录。
2)使用make_key工具生成签名文件。需要分别生成 releasekey,media,shared,platform。
./make_key releasekey '/C=CN/ST=JiangSu/L=NanJing/O=Company/OU=Department/CN=Your Name/emailAddress=YourE-mailAddress'   (系统将会提示输入针对各种key的密码,按照提示输入即可)
将会生成 releasekey.pk8 和 releasekey.x509.pem文件,其中 *.pk8是生成的私钥,而*.x509.pem是公钥,生成时两者是成对出现的.
注:如果出现 openssl : relocation error :openssl : symbol ...尝试用 sudo 执行命令,问题解决了!

2.回到根目录android_src。
命令执行的时候都最好在工程的根目录下执行,要不然脚本用到的某些文件找不到的。

3.编译系统
   make -j4 PRODUCT-generic-user dist  
其中generic 表示生成的TARGET_PRODUCT类型为generic,
     user代表TARGET_BUILD_VARIANT为user版本。
编译完成之后回在android_src/dist/目录内生成个product_generic-user_files开头的zip文件.这就是我们需要进行签名的文件系统.

4.开始签名
./build/tools/releasetools/sign_target_files_apks -d key_directory/ out/dist/product_modul-target_files.zip  out/dist/signed_target_files.zip 
通过sign_target_files_apks 脚本,完成android系统的签名工作.
key_directory/ 表示key所在的目录。
out/dist/product_modul-target_files.zip   源文件。

out/dist/signed_target_files.zip   生成签名的目标文件。

可能会出现:
ERROR: no key specified for:
  CalendarWidget.apk
  Contacts_yellowpage.apk
  SnsAppMain.apk

这表示,签名并没有成功,原因是由于有些apk程序已经签过名了或者找不到对应的key. 这需要我们对apk设置过滤,不对上面的应用进行签名.方法如下:
通过参数"-e <apkname>=" 来过滤这些应用.
./build/tools/releasetools/sign_target_files_apks -d key_directory/  -e  CalendarWidget.apk= -e Contacts_yellowpage.apk= -e SnsAppMain.apk= -e   out/dist/product_modul-target_files.zip  out/dist/signed_target_files.zip
输入该命令时会提示输入key的密码,会出现四次密码输入提示。分别为四种类型的key的密码。

5.生成image文件
./build/tools/releasetools/img_from_target_files  out/dist/signed-target-files.zip  signed-img.zip
用img_from_target_files 命令对生成的igned-target-files.zip文件进行打包,signed-img.zip包含了boot.img,userdate.img,system.img文件等.

6.通过fastboot下载signed-img.zip文件
fastboot update signed-img.zip
通过fastboot就可以把签了名的系统文件烧到手机上了。

五、几个问题:
1.make_key 和Keytool两种方式生成的key有何区别:
       Keytool 位于%JAVA_HOME%/bin目录下,用于管理密钥、证书和证书链。JavaSE6中的Keytool已经改变,还可以用来管理对称加密算法中的密钥。它生成的mykey.keystore包括公钥、私钥和证书。
make_key 位于source_src/development/tools 目录下,通过调用openssh生成公钥和私钥,所以生成*.x509.pem和*.pk8的密钥对。

2.用make_key生成的密钥对,对apk进行手动签名:
通过signapk.jar 工具对apk签名,用法:signapk [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar
java -jar out/host/linux-x86/framework/signapk.jar  releasekey.x509.pem releasekey.pk8    source.zip  source-signed.zip  
signapk.jar可以自己编译,源码在build/tools/signapk目录下。

3.android源码编译make 时,对所有应用签名规则:
系统在编译的时候,读取build/core/package.mk文件,根据LOCAL_CERTIFICATE的值在build/target/product/security/目录下选择相应的签名。LOCAL_CERTIFICATE值从各应用的Android.mk文件中读取,如果Android.mk文件中没有该属性,则默认为testkey。

六、常见异常:
1.如果遇到了ZipException invalid entry compressed size的错误方法
主要原因是平时Eclipse使用的ADT插件已经赋予了DEBUG权限的数字签名,我们可以通过导出一个未签名的APK文件就可以解决。

2.使用jarsigner工具来签名,出现无法对jar 进行签名:java.util.zip.ZipException: invalid entry compressed size (expected xxx but got xxx bytes)这样的提示。

这些问题主要是由于资源文件造成的,对于android开发来说应该检查res文件夹中的文件,逐个排查。这个问题可以通过升级系统的JDK和JRE版本来解决。

3.安装apk过程中出现:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES。

这样的问题主要是签名冲突造成的,比如你使用了ADB的debug权限签名,但后来使用标准sign签名后再安装同一个文件会出现这样的错误提示,解决的方法只有先老老实实从手机上卸载原有版本再进行安装,而adb install -r参数也无法解决这个问题。adb uninstall 卸载原来的应用。

Android应用签名相关推荐

  1. PhoneGap/Cordova Android应用签名发布系列问题处理收集

    PhoneGap/Cordova Android应用签名发布注意事项 Android APK 签名比对 android获取签名,兼容5.0 Android APK 签名比对,防止软件被破解使用 用ap ...

  2. Android 应用开发(33)---Android程序签名打包

    Android程序签名打包 第一章的倒数第二节,本节给大家介绍的是如何将我们的程序打包成Apk文件,并且为我们的Apk签名! 上一节中已经说了,我们后续的教程使用的IDE是Android Studio ...

  3. Android APK 签名比对

    Android APK 签名比对 转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/19/354663.html Android APK  ...

  4. Android APK签名原理

    Android APK 签名原理涉及到密码学的加密算法.数字签名.数字证书等基础知识,这里做个总结记录. 非对称加密 需要两个密钥,一个是公开密钥,另一个是私有密钥:一个用作加密的时候,另一个则用作解 ...

  5. Android App签名的那些事

    App签名 Android App签名的目的是确保App的安装包来自于原创的作者,且App没有被篡改.Android手机是如何设别App来自于原创的作者且没有被篡改呢?请看App签名以及验签原理. A ...

  6. 对Android apk 签名 --apksigner

    Android自签名方法,仅作记录. 因 apksigner 签名工具支持V1和V2签名,所以选用它 进行手动签名: 步骤如下: 切到Android SDK/build-tools/SDK版本, 输入 ...

  7. Android 应用签名

    Android 应用签名是应用打包过程的重要步骤之一,Google 要求所有的应用必须被签名才可以安装到 Android 操作系统中.Android 的签名机制也为开发者识别和更新自己应用提供了方便. ...

  8. android app签名详解

    本文及文中图片转自:https://mp.weixin.qq.com/s?__biz=MzIwMzYwMTk1NA==&mid=2247493825&idx=1&sn=e926 ...

  9. Android平台签名证书(.keystore)生成指南

    来源:https://ask.dcloud.net.cn/article/35777 Android平台签名证书(.keystore)生成指南 分类:HTML5+ Android证书 Android平 ...

  10. android微信第三方登陆混淆,基于微信api Android程序签名+代码混淆

    微信开放平台真是独特啊!!! 微信的ap调用确实别新浪微博,人人,QQ互联这些方便很多,也不用判断绑定什么的,让人眼前一亮.但是到代码混淆这一步,我真瞎了,网上关于微信签名混淆资料讲的让人摸不着头脑, ...

最新文章

  1. 行业 平均年龄_2019中国“新生力”白皮书:平均年龄35岁,千万资产家庭达198万户!...
  2. orgman set触发的pricing set创建逻辑
  3. Android之解决PC浏览器上传表单文件到手机服务器read数据错误导致有时候下载到手机的文件打开文字错乱问题
  4. vue-flowy前端流程图绘制工具
  5. CCF 201609-2 火车购票
  6. (116)FPGA面试题-FIFO相关参数与信号,为什么要用格雷码
  7. TensorFlow tf.keras.layers.conv2D
  8. 什么是命名空间?php命名空间的基本应用分享
  9. 计算机基础教程7 - 数字系统
  10. java 开源客服系统_编程浪子客服系统开源啦
  11. MATLAB强化学习入门——三、深度Q学习与神经网络工具箱
  12. 自定义windows快捷键(autohotkey)的办法
  13. Qt 之 QQ系统表情(三)
  14. python爬取b站up主粉丝信息_使用Python爬取B站数据
  15. Hadoop 安装指南
  16. 【软件测试】04 -- 软件测试与软件开发
  17. u盘启动 联想一体机_Lenovo消费台式机与一体机预装Windows 8改装Windows 7的解决方案...
  18. 基于NV040D-S8语音芯片在智能水杯/保温杯的方案设计
  19. 求1到100之间所有能被3整除的整数的和
  20. 垂直搜索 vs 通用搜索

热门文章

  1. Excel怎么删除表格最后的空行
  2. VB text控件如何实现换行
  3. PC常见故障及解决思路汇总(系统方面)
  4. TCP/IP详解 卷1:协议—概述
  5. 未来生活进行时: 畅想未来新兴技术40年——百大趋势性技术汇总(上)
  6. 怀旧系列(2)----FoxBase,UCDOS,WPS
  7. 网络疯传华为面试题:800公斤牛,过承重700公斤的桥,有答案了?
  8. 简单理解以太网和令牌环网【区别】
  9. html制作凤凰网,有哪些不用编写代码就能轻松制作生成HTML5页面的工具
  10. Linux安装Ant