最近编程时遇到问题:写了一个android小程序,打包后用apktool反编译再打包都没问题,安装时出现Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]错误,网上查资料原来是签名的问题,解决方案如下。
《一》使用命令行生成签名文件
(1)创建一个用来存放签名文件的文件夹Android_keystoreD:\Android_keystore>keytool -genkey -alias aeo_android.keystore -keyalg RSA -val idity 20000 -keystore aeo_android.keystore
输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么? [Unknown]: localhost 您的组织单位名称是什么? [Unknown]: btbu 您的组织名称是什么? [Unknown]: btbu 您所在的城市或区域名称是什么? [Unknown]: beijing 您所在的省/市/自治区名称是什么? [Unknown]: beijing 该单位的双字母国家/地区代码是什么? [Unknown]: cn CN=XiaoFeng, OU=btbu, O=btbu, L=beijing, ST=beijing, C=cn是否正确? [否]: y
(如果和密钥库口令相同, 按回车):
(2)使用jarsigner给 testbim.apk 文件签名,如下所示:
D:\Android_keystore>"C:\Program Files\Java\jdk1.6.0_30\bin\jarsigner.exe" -verbo se -keystore aeo_android.keystore -signedjar testbim_signed.apk testbim.apk aeo_ android.keystore 输入密钥库的口令短语: 正在添加: META-INF/MANIFEST.MF 正在添加: META-INF/AEO_ANDR.SF 正在添加: META-INF/AEO_ANDR.RSA 正在签名: res/drawable-hdpi/ic_action_search.png 正在签名: res/drawable-hdpi/ic_launcher.png 正在签名: res/drawable-ldpi/ic_launcher.png 正在签名: res/drawable-mdpi/ic_action_search.png 正在签名: res/drawable-mdpi/ic_launcher.png 正在签名: res/drawable-xhdpi/ic_action_search.png 正在签名: res/drawable-xhdpi/ic_launcher.png 正在签名: res/layout/activity_main.xml 正在签名: res/layout/two.xml 正在签名: res/menu/activity_main.xml 正在签名: AndroidManifest.xml 正在签名: classes.dex 正在签名: resources.arsc
keytool 是个密钥和证书管理工具。jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名 (JAR 文件将类文件、图象、声音和/或其它数字化数据打包在一个文件中)。
这两个工具都是JDK自带的,所以你当前需要先确保JDK安装正确。并且环境变量设置正确,以便可以以命令行的方式进行处理。
testbim_signed.apk
jar 已验证
( 4 )安装到虚拟机上
搞定~
命令参数说明:
-genkey 产生证书文件-keyalg 指定密钥的算法
-validity 为证书有效天数,这里我们写的是20000天。
-alias 产生别名
在输入密码时没有回显,只管输入就可以了,一般位数建议使用20位,切忌需要记下来后面还要用,
注意:
1、CN(Common Name - 名字与姓氏):其实这个“名字与姓氏”应该是域名,比如说localhost或是blog.devep.net之类的。输成了姓名,和真正运行的时候域名不符,会出问题。浏览器访问时,弹出一个对话框,提示“安全证书上的名称无效,或者与站点名称不匹配”,用户选择继续还是可以浏览网页。但是用http client写程序访问的时候,会抛出类似于“javax.servlet.ServletException: HTTPS hostname wrong: should be ”的异常。
2、在用keytool生成数字证书时必须保证:-keystore androidapp.keystore -alias androidapp.keystore 两者名称必须相同。否则下一步签名时会出现错误:jarsigner: 找不到 androidapp.keystore 的证书链。androidapp.keystore 必须引用包含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。