如何彻底解决 INSTALL_FAILED_TEST_ONLY安装失败的问题
在Android的开发测试中,我们使用oppo,vivo的一些设备经常会出现 INSTALL_FAILED_TEST_ONLY 异常,彻底解决这个安装失败的问题。
问题的产生
testOnly 是一个Gradle中的属性,它用于表示应用或库是否仅用于测试目的,这个属性在AndroidManifest.xml文件中的<application>或<instrumentation>元素中使用。
在 Android Gradle 插件 1.0.0 版本之后引入了这个属性。Android Gradle 插件的版本通常与 Gradle 插件版本一致。以下是一些版本信息:
Android Gradle 插件 1.x.x 版本使用的是
com.android.application
和com.android.library
插件,testOnly
不适用于这些版本。从 Android Gradle 插件 2.0.0 版本开始,引入了新的插件:
com.android.application
转变为com.android.application
,com.android.library
转变为com.android.library
。testOnly
属性可以在这些版本中使用。Android Gradle 插件的后续版本继续支持
testOnly
属性。
请注意,Gradle 插件和 Gradle 版本之间有一定的对应关系,因此在使用新版本的 Android Gradle 插件时,建议查看相关文档或插件的发布说明以获取详细的信息。
android:testOnly
指示此应用是否仅用于测试目的。例如,它可能会在自身之外公开功能或数据,这样会导致安全漏洞,但对测试很有用。此类 APK 只能通过 adb
安装,您不能将其发布到 应用市场Google Play。
当您点击 Run 图标 时,Android Studio 会自动添加此属性。
查找到一些文档,在Android studio 3.0 开始 使用执行项目的时候,会强制在项目中标记 android:testOnly="true",oppo和vivo部分手机无法安装,出现INSTALL_FAILED_TEST_ONLY异常。
Launching app
$ adb push /Users/mac/AndroidStudioProjects/Demo/app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/com.test
$ adb shell pm install -t -r "/data/local/tmp/com.test"
Failure [INSTALL_FAILED_TEST_ONLY]
解决方案
网络比较常见的解决方案:
方案一
在Android项目的AndroidManifest.xml文件中的<application>标签中,删除 android:testOnly="true" 或者将属性改为 android:testOnly="false"
亲测没办法解决问题
方案二
在项目根目录的 gradle.properties 文件中添加下面的属性:
android.injected.testOnly=false
android.injected.testOnly=false 是Android Studio中的一个配置项,用于控制在构建Android医用程序是是够启用testOnly属性。当设置为false时,它将警用测试相关的哦配置,这样就可以在证实发布环境中包含测试代码。
在mac系统 Android Studio Hedgehog | 2023.1.1 Patch 1 版本下,测试无效。
方案三
修改配置项,Edit Configuration,找到app,install Flags,添加上 -t,然后在执行编译安装。
亲自测试无效。
方案四
在方案一的基础上,
Android studio工具栏,Build/Build Bundle(s) Apk(s)/Build Apk(s) ,然后使用adb安装app
adb install -t xxx.apk
测试安装成功,但是会带来其他的问题,无法使用debug来调试代码,这个方法并不可取。
终极解决方案
在Android项目的主module下面的build.gradle文件中的android标签里面加入一下代码:
applicationVariants.all { variant ->
if (variant.name.contains("Debug")) {
println("variant.name: " + variant.name);
variant.outputs.each { output ->
output.processManifest.doLast {
String manifestPath = "${buildDir}/intermediates/merged_manifests/${variant.name}/AndroidManifest.xml"
def manifestContent = file(manifestPath).getText('UTF-8')
manifestContent = manifestContent.replaceAll("android:testOnly=\"true\"", "android:testOnly=\"false\"")
file(manifestPath).write(manifestContent, 'UTF-8')
}
}
}
}
在Android Studio Hedgehog | 2023.1.1 Patch 1版本下,vivo成功使用运行安装,能debug代码。
以上的问题可能于android studio版本有关,也可能于gradle插件的版本有关系,具体的问题具体分析,此篇文章仅供参考。
可以加入telegram群组一起探讨问题: globlogs