zoukankan      html  css  js  c++  java
  • Android Studio Run项目出现Failure [INSTALL_FAILED_TEST_ONLY]

    同名掘金博文: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手机也已经可以安装成功。

  • 相关阅读:
    Java关键字instanceof
    java中equals和==的区别
    Servlet、Filter、Listener总结
    struts2 拦截器配置
    Struts2技术详解
    构建Java并发模型框架
    基于MINA框架快速开发网络应用程序
    Spring的IOC原理
    Spring AOP原理及拦截器
    JAVA三大框架SSH和MVC
  • 原文地址:https://www.cnblogs.com/lwbqqyumidi/p/10217076.html
Copyright © 2011-2022 走看看