秋梦无痕

一场秋雨无梦痕,春夜清风冻煞人。冬来冷水寒似铁,夏至京北蟑满城。

Avatar

Android Studio 3.0带来的烦恼(三) : INSTALL_FAILED_TEST_ONLY, INSTALL_PARSE_FAILED_NO_CERTIFICATES

装完Android Studio 3.0,然后把 Android API升到了27.0.2,开发遇到的麻烦已经解决了。
现在是安装的问题:
Failure [INSTALL_FAILED_TEST_ONLY]

去网上找了一下:
1、如果在AndroidManifest.xml里面的application段有android:testOnly="true",改成android:testOnly="false",或者删掉。

2、如果gradle版本是alpha版本,改成stable版本。(未亲测)

如果不是发布使用,这时候可以用"adb install -t"安装了。
如果发布,会出现新的错误:
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

3、如果是发布使用,还需要对app签名。
如果没有keystore文件,使用keytool生成keystore文件:
<jdk_path>\bin\keytool.exe -genkey -alias ifyr.keystore -keyalg RSA -validity 20000 -keystore ifyr.keystore
参数说明:
-genkey 产生证书文件
-keystore 指定文件名
-keyalg 指定密钥算法
-validity 指定证书有效天数
-alias 产生别名

注意:
A. alias和keystore必须一致,否则签名时会报“找不到keystore的证书链”错误。
B. 让填写的CN,也就是“名字与姓氏”,请填域名。否则运行时会提示“安全证书上的名称无效,或者与站点名称不匹配”错误。

4、然后把签名加入Android Studio环境。
打开Android Studio的Build菜单下的Edit Build Types...,弹出Project Structure对话框:
在Signing标签下增加签名。
在Build Types标签下,debug/release的Signing Config设置成你的签名。

然后,用Build菜单下“Build APK(s)”生成apk。
用Build菜单下“Generate Signed APK...”生成签名apk。
注意:
A. 这个签名文件在4.4以上版本可以安装了,在4.2版本还是不能用,但是经过这次操作之后,再手动签名就可以了。
B. 如果需要手动签名,"Signature Version"要用V2。V1的话,手动签名不了,会报:"jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size"错误

5、最后对apk文件对app-release.apk使用jarsigner手动签名:
jdk 1.7以后:(1.8亲测,1.7未测试)
<jdk_path>\bin\jarsigner.exe -keystore ifyr.keystore -signedjar ifyr_signed.apk ifyr.apk ifyr.keystore -digestalg SHA1 -sigalg SHA1withRSA -tsa http://timestamp.digicert.com
注意:
A. 1.8上如果没有后面的三个参数:"-digestalg SHA1 -sigalg SHA1withRSA -tsa http://timestamp.digicert.com",依然会报“INSTALL_PARSE_FAILED_NO_CERTIFICATES”错误。
B. 那三个参数也可以是:"digestalg SHA1 -sigalg MD5withRSA -tsa http://timestamp.digicert.com",但是据官方文档,推荐使用SHA1withRSA

jdk 1.6:(未亲测)
<jdk_path>\bin\jarsigner.exe -keystore ifyr.keystore -signedjar ifyr_signed.apk ifyr.apk ifyr.keystore

检查签名:
<jdk_path>\bin\jarsigner.exe -verify ifyr_signed.apk
jar 已验证。
会有“警告:此 jar 包含证书链未验证的条目。”但是不影响安装。

现在apk可以正常安装了。