001736e9a924a8faa0b8b17adf0d5e46.jpg

在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.applicationcom.android.library 插件,testOnly 不适用于这些版本。

  • 从 Android Gradle 插件 2.0.0 版本开始,引入了新的插件:com.android.application 转变为 com.android.applicationcom.android.library 转变为 com.android.librarytestOnly 属性可以在这些版本中使用。

  • Android Gradle 插件的后续版本继续支持 testOnly 属性。

请注意,Gradle 插件和 Gradle 版本之间有一定的对应关系,因此在使用新版本的 Android Gradle 插件时,建议查看相关文档或插件的发布说明以获取详细的信息。

android:testOnly

指示此应用是否仅用于测试目的。例如,它可能会在自身之外公开功能或数据,这样会导致安全漏洞,但对测试很有用。此类 APK 只能通过 adb 安装,您不能将其发布到 应用市场Google Play。

当您点击 Run 图标 toolbar-run.png 时,Android Studio 会自动添加此属性。

查找到一些文档,在Android studio 3.0 开始 使用toolbar-run.png执行项目的时候,会强制在项目中标记 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,然后在执行编译安装。

image1111.pngimage-utak.png

亲自测试无效。

  • 方案四

在方案一的基础上,

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