同名掘金博文:https://juejin.im/post/5c2e0c496fb9a049a711f09a

运行环境:

AS 版 本:Android Studio 3.2.1

手机型号:vivo Y85A

Android版本:8.1.0

换了一个新测试机,点击AS Run按钮,运行项目,提示安装失败,错误信息如下:

01/03 18:52:19: Launching app
$ adb push /Users/corn/AndroidStudioProjects/HappyCorn/app/build/outputs/apk/debug/app-debug.apk /data/local/tmp/com.happycorn
$ adb shell pm install -t -r "/data/local/tmp/com.happycorn"
Failure [INSTALL_FAILED_TEST_ONLY]

网上搜索,不少说法是install安装时应该加上-t,对应含义是:允许安装测试 APK

adb命令:

https://developer.android.com/studio/command-line/adb

install [options] path	将软件包(通过 path 指定)安装到系统。
选项:
-l:安装具有转发锁定功能的软件包。
-r:重新安装现有应用,保留其数据。
-t:允许安装测试 APK。
-i installer_package_name:指定安装程序软件包名称。
-s:在共享的大容量存储(如 sdcard)上安装软件包。
-f:在内部系统内存上安装软件包。
-d:允许版本代码降级。
-g:授予应用清单中列出的所有权限。

但上述安装错误日志中实际上已经加上了-t参数,且直接cd到对应.../outputs/apk/debug/目录下,执行adb install -r命令,依然出现相同错误提示,无法安装。

网上 这篇博客 中指出,Android Studio 3.0版本开始,直接点击AS Run按钮时,会强制将android:testOnly属性设置为true。

经实际Android Crack Tool反编译app-debug.apk后,发现标签中的属性下确实被自动加入了testOnly属性。

<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:testOnly="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

于是自然想到如果在application中强制指定android:testOnly属性为false,试一下。

结果发现依然出现相同错误提示,经反编译后发现android:testOnly依然被强制改成了true。

继续查一下Android官方文档,对应的testOnly含义。

https://developer.android.com/reference/android/R.styleable#AndroidManifestApplication_testOnly

AndroidManifestApplication_testOnly
public static final int AndroidManifestApplication_testOnly
Option to indicate this application is only for testing purposes. For example, it may expose functionality or data outside of itself that would cause a security hole, but is useful for testing. This kind of application can not be installed without the INSTALL_ALLOW_TEST flag, which means only through adb install. May be a boolean value, such as "true" or "false".

文档中指出,testOnly为true,是用来指定在debug状态下的,只能通过adb命令,且必须指定INSTALL_ALLOW_TEST falg,即对应的adb install -t参数。

考虑到其他手机上不存在此问题,先用其他手机分别试一下对应的adb命令安装。

先试一下不带-t参数:

adb install -r ~/AndroidStudioProjects/HappyCorn/app/build/outputs/apk/debug/app-debug.apk

提示:

adb: failed to install /Users/corn/AndroidStudioProjects/HappyCorn/app/build/outputs/apk/debug/app-debug.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]

再试一下带-t参数:

adb install -r  -t  ~/AndroidStudioProjects/HappyCorn/app/build/outputs/apk/debug/app-debug.apk
Success

由此可见,确实如文档中所说。

但vivo Y85A此机型使用adb install -t安装依然失败,应该是此机型针对-t(允许安装测试 APK)此种情况做了进一步的严格安全限制。

为使其能够能正常安装成功,可以通过如下两种方式:

1,不使用AS的Run按钮直接安装,改成使用build >> Build Bundle/Apk >> Build Apk方式生成安装包并安装;

2,项目根目录下,配置gradle.properties配置项:

# testOnly设置为false
android.injected.testOnly=false

重新点击AS的Run按钮直接安装,新生成的apk文件,反编译后发现标签中的属性android:testOnly属性值已经被强制改为了false。

并且,此vivo Y85A手机也已经可以安装成功。

Android Studio Run项目出现Failure [INSTALL_FAILED_TEST_ONLY]的更多相关文章

  1. Android studio打开项目时出现 gradle download 无反应

    在使用android studio 新建 项目的时候,会发现一直无法下载 gradle程序一直卡住不动,原因是被墙了. 解决方法: 到gradle官网下载离线包,解压后将bin路径加入Path环境变量 ...

  2. android studio新项目时提示:Plugin is too old, please update to a more recent version

    今天想写一个程序来测试一下android studo代码,但是创建好项目后,提示: Error:(1, 0) Plugin is too old, please update to a more re ...

  3. 【Android Studio使用教程2】Android Studio创建项目

    创建项目 首先,先指出Android Studio中的两个概念. Project 和 Module .在Android Studio中, Project 的真实含义是工作空间, Module 为一个具 ...

  4. Android Studio创建项目

    创建项目 首先,先指出Android Studio中的两个概念. Project 和 Module .在Android Studio中, Project 的真实含义是工作空间, Module 为一个具 ...

  5. Android Studio导入项目

    原文:http://ask.android-studio.org/?/article/21 本篇教程中使用到的Android Studio版本为1.0, Eclipse ADT版本23.0.4.请尝试 ...

  6. Android Studio 导入项目错误

    Gradle DSL method not found: 'Android()' 错误原因: android studio 引进项目时,自动查找本机是否有项目设置的SDK版本,若发现没有,我们会在pr ...

  7. android studio 新建项目 界面一直停在 【“building ‘ 项目名’ gradle project info”】

    zhezhelin android studio 新建项目 界面一直停在 [“building ‘ 项目名’ gradle project info”] 安装了android studio 之后,按照 ...

  8. 【Android Studio安装部署系列】二十七、Android studio修改项目名称和包名

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 实际项目开发中可能碰到项目名称写错了或者需要修改,而且包名可能也想要修改,那么如何操作呢. 本文是在Android Studio3. ...

  9. Android Studio打开项目,停在gradle的解决方案

    之所以停留,是因为打开项目时,Android Studio解析项目使用的gradle,并下载对应版本的gradle,但是由于下载gradle的服务器在国外,这个下载速度非常不稳定,从而导致停留在这一步 ...

随机推荐

  1. ArcCore重构-头文件引用问题的初步解决

    基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5   基本问题 1. 头文件引用混乱,所有头文件通过从搜索路径(-I)中引用,存在名称污染问题,需加入路径信息:   ...

  2. var与let、const的区别

    var与let.const 一.var声明的变量会挂载在window上,而let和const声明的变量不会: var a = 100;console.log(a,window.a); // 100 1 ...

  3. 《T-SQL查询》读书笔记Part 2.执行计划

    一.关于执行计划 执行计划是优化器生成的用于确定如何处理一个给定查询的“工作计划”.一个计划包含一组运算符,通常按照特定的顺序来应用这些运算符.此外,一些运算符可以在它们之前的运算符还在处理时被应用( ...

  4. 数据库SQL语句中 查询选修了全部课程的学生的学号和姓名

    一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: select S#,SNAME ...

  5. NS3系列——eclipse + NS3环境搭建

    1. 安装NS3 (1)在 ubuntu12.04 中安装 ns3.20,首先要安装一下各种依赖软件: sudo apt-get install gcc g++ pythonsudo apt-get ...

  6. python3字典:获取json响应值来进行断言

    前言:在接口自动化测试中,最后都是需要将返回结果进行断言.本文按照实际情况举例说明字典各种操作,以及如何提取响应数据来进行断言 1.dict = {'code': '200', 'message': ...

  7. ReactNative(三)——WebStorm的基本配置

    设置.js文件默认以jsx的语法打开 在没有进行设置的情况下,每次打开WebStorm的时候打开包含jsx语法的.js文件都会有以下提示: 当然我们点击转换后就可以了,但是每次都会提示,所以还是来一个 ...

  8. Android 属性动画(Property Animation) 完全解析 (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...

  9. 玩转PHP(一)---php中处理汉字字符串长度:strlen和mb_strlen

    注:本文为小编原创,如若转载,请注明出处:http://blog.csdn.net/u012116457/article/details/42536039 今天正式开始学习PHP了,不过小编一不小心就 ...

  10. 译MassTransit 快速入门

    给我看代码! 下面是MassTransit的功能设置. public class YourMessage { public string Text { get; set; } } public cla ...