应用未安装!安装包似乎已经损坏
一、描述
新建了做了一个项目,通过Android Studio直接安装没有问题,把测试包直接发送给测试却提示“应用未安装!安装包似乎已经损坏”,没有其他任何提示信息。
当时怀疑是签名问题,所以就给debug设置了签名,通过 build APK 来打包 debug 版本,可正常安装到手机,但是通过 run 产生的apk发送给测试还是不可以正常安装。
网上搜索出的结果大部分都是让我再打包的时候够短V1和V2,这和我遇到的场景不同,勾选V1和V2是build时的操作,而我的问题出在了run上边。
二、思路初现
后来翻到一片文章,博主分析的原因是 targetSdkVersion 的版本比已安装的版本低,是通过修改了targetSdkVersion的版本号来解决的,我这边没有变动过 targetSdkVersion ,所以也不是这个问题。但是看博主的解决流程给我提供了思路。
https://blog.csdn.net/weixin_34185320/article/details/87365694
博主在发送安装失败后,使用ADB直接安装,来查看错误信息。
所以,按照这个思路,我安装了一下run产生的apk,看到如下错误信息:
>>>adb install -r app/debug/app-debug.apk
Performing Streamed Install
adb: failed to install app/build/outputs/apk/debug/app-debug.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]
三、问题解决
原因很明显:INSTALL_FAILED_TEST_ONLY 。
经过查询资料发现在AndroidManifest.xml文件中添加了属性testOnly=true,
https://developer.android.com/guide/topics/manifest/application-element
查看apk中的清单文件确实testOnly=true,原来Android Studio 3.0以后会在debug.apk的清单文件中自动添加testOnly=true属性,导致安装失败,那么为什么Android Studio直接运行可以安装呢? 后来查看运行日志输出发现Studio的运行命令是
adb shell pm install -t -r “/data/local/tmp/com.XXXX.qa”
adb install 一共有留个选项
-l 锁定该应用程序
-r 替换已存在的应用程序,也就是说强制安装
-t 允许测试包
-s 把应用程序安装到sd卡上
-d 允许进行将见状,也就是安装的比手机上带的版本低
-g 为应用程序授予所有运行时的权限
可以看出Android Studio run运行是允许测试包安装的。尝试了一下adb install -t , 果然有效。
但是测试是手机直接下载的App,不能调用adb来安装,能不能去掉testOnly=true这个标记呢?直接百度就能找到答案:在gradle.properties(项目根目录或者gradle全局配置目录 ~/.gradle/)文件中添加android.injected.testOnly=false 。
再运行run,查看apk中的清单文件,testOnly属性消失了。
通过下载上传新的app,可正常安装。
四、总结
当遇到安装失败时,可以模拟条件使用adb来安装查找原因。
INSTALL_FAILED_TEST_ONLY解决方法有两种:
1、使用adb install -t debug.apk 来安装
2、在gradle.properties中配置 android.injected.testOnly=false