Android Studio生成apk安装返回失败ErrorCode:-15、INSTALL_FAILED_TEST_ONLY

来源:互联网 发布:excel输入数据 编辑:程序博客网 时间:2024/05/22 04:54

背景介绍

项目中遇到一个Android Studio生成apk安装失败的问题,分析了很久,饶了很多弯路,最后才解决。
主要现象是,Android Studio编译apk,加上系统的签名之后无法安装,系统安装升级、adb instal apk、adb install -r apk等都返回错误,错误表现为返回ErrorCode:-15 , INSTALL_FAILED_TEST_ONLY错误

转载请注明出处:http://blog.csdn.net/Zou_pl/article/details/78679394

APK安装错误对应的意思

错误提示信息列表一览
INSTALL_FAILED_ALREADY_EXISTS: 程序已经存在
INSTALL_FAILED_INVALID_APK: 无效的APK
INSTALL_FAILED_INVALID_URI: 无效的链接
INSTALL_FAILED_INSUFFICIENT_STORAGE: 没有足够的存储空间
INSTALL_FAILED_DUPLICATE_PACKAGE: 已存在同名程序
在 INSTALL_FAILED_UPDATE_INCOMPATIBLE: 版本不能共存
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: 需求的共享用户
签名错误INSTALL_FAILED_MISSING_SHARED_LIBRARY: 需求的共享库已丢失
INSTALL_FAILED_DEXOPT: dex优化验证失败
INSTALL_FAILED_OLDER_SDK : 系统版本过旧
INSTALL_FAILED_TEST_ONLY: 调用者不被允许测试的测试程序
CPU_ABIINSTALL_FAILED_MISSING_FEATURE: 使用了一个无效的特性
INSTALL_FAILED_INVALID_INSTALL_LOCATION: 无效的安装路径
INSTALL_FAILED_MEDIA_UNAVAILABLE: SD卡不存在
INSTALL_FAILED_INTERNAL_ERROR: 系统问题导致安装失败
​DEFAULT: 未知错误​​

问题分析

1、首先分析比较日志中apk安装的过程:

11-27 10:35:21.992 W/PackageParser( 1630): Unknown element under <manifest>: meta-data at /data/app/vmdl-1441116836.tmp Binary XML file line #1111-27 10:35:21.992 W/PackageParser( 1630): Unknown element under <manifest>: meta-data at /data/app/vmdl-1441116836.tmp Binary XML file line #5511-27 10:35:22.152 I/MonitorServer( 1831): net.media.MonitorServer$MonitorTask@41dce118 MonitorTask mRunFlag = true11-27 10:35:22.392 D/RTK_RVSD( 1207): RVSD void rvsd_handle_InBandCMD(RVSD_INFO*, int, pthread_mutex_t*):291 polling timeout, audioEndOfSegment=0 audioPauseFlag=0 PQcounts=011-27 10:35:22.392 D/RTK_RVSD( 1207): RVSD polling timeout, readptr=101f02f9, writeptr=101f02f911-27 10:35:22.712 D/InstallAppProgress( 2378): Installation error code: -15

可以看出安装返回Installation error code: -15,也就是错误INSTALL_FAILED_TEST_ONLY。
一开始怀疑是Unknown element这个问题引起的,使用appt查看生成apk的manifest之后发现,部分引用和依赖库不能使用非稳定版本,即alpha版本,解决之后发现仍然安装失败,然后比较正常安装的日志。
下图是正常安装的日志:

01-02 06:03:45.609 I/PackageManager( 1642): Copying native libraries to /data/app-lib/vmdl51971196601-02 06:03:45.699 W/PackageParser( 1642): Unknown element under <manifest>: meta-data at /data/app/vmdl519711966.tmp Binary XML file line #1101-02 06:03:45.699 W/PackageParser( 1642): Unknown element under <manifest>: meta-data at /data/app/vmdl519711966.tmp Binary XML file line #4801-02 06:03:47.009 I/ActivityManager( 1642): Force stopping com.tvb.hk.anywhere appid=1000 user=-1: replace sys pkg01-02 06:03:47.009 I/ActivityManager( 1642): Killing 1873:com.tvb.hk.anywhere/1000 (adj 1): stop com.tvb.hk.anywhere

结果发现也有Unknown element的问题,所以可见并不是Unknown element导致的INSTALL_FAILED_TEST_ONLY错误。

2、TEST_ONLY的意思就是版本仅仅用于测试,查看一些资料之后有种说法是项目中所用的编译器版本和gradle版本不能为alpha版本,需要降低gradle版本等查看了外网的一些资料也有说使用用的插件以及依赖库中不能使用alpha版本、不能使用instant run功能。我是用的是Android Studio 3.0.1版本,gradle使用com.android.tools.build:gradle:3.0.1版本,虽然版本较常用的版本比较高,但是也是稳定版本。也关闭了instant run功能。另外实用的一些插件和依赖库也没办法降低版本。所以暂时放弃从了从这一方面排查。事后证明也非此问题。但是如果大家遇到安装apk返回INSTALL_FAILED_TEST_ONLY的错误,可以检查一下是否使用alpha版本编译器和gradle。

3、另外Mainfest中有一个不常用的属性:testOnly

<appliaction...android:testOnly="true"...>....</application>

android:testOnly=[“true” | “false”]
android:testOnly:应用是否是为了测试,它可能向外暴露数据,引发安全漏洞,如果为true,应用只能通过adb安装。一般来说,项目中manifest不会去设置这个属性,所以会默认为false。
我的项目中这个属性也没有设置,为了确保一定为false,我在项目的manifest中设置为false,然后编译项目,结果发现编译成功之后\app\build\intermediates\manifests\full\debug\AndroidManifest.xml
的android:testOnly=”true”自动变为android:testOnly=”“,开始意识到是因为这个属性的问题。后来发现编译生成的manifest中属性一直为true,可是我根本就没设置这个属性默认为false或者设置的为true。
我编译apk一贯的方式是直接Run app编译,尝试了Make Project、Rebuild Project、Build Apk(s)。

Make Project:编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk。
Make Selected Modules:编译指定的Module,一般是自上次编译后Module下有更新的文件,不生成apk。
Clean Project:删除之前编译后的编译文件,并重新编译整个Project,比较花费时间,不生成apk。
Rebuild Project:先执行Clean操作,删除之前编译的编译文件和可执行文件,然后重新编译新的编译文件,不生成apk,这里效果其实跟Clean Project是一致的
Build APK:前面4个选项都是编译,没有生成apk文件,如果想生成apk,需要点击Build APK。
Generate Signed APK:生成有签名的apk(一般项目嵌入第三方,生成release包时必须混淆,否则无法生成apk)。
Run ‘app’是需要连接设备的。查了下国内和国外的关于Android Studio Build Apk(s)和Run ‘app’的区别:首先如果没有关闭Instant Run情况下,Run ‘app’优先会使用Instant Run。

When you create the build by Build->Build APK, the apk will contain all the resources for all the devices. i.e for ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi.

But in case you are running the app on device/emulator, it will detect
that what the resolution of the phone is and will add only the
resources with that resolution into the apk file. For ex, if your
device is xhdpi , it will drop all other screen resolutions and will
contain only xhdpi resources.

make apks 会包含适配所有devices的资源,而直接run app只会打包你连接devices所需要的资源。但是关于testOnly这一块没有任何介绍,我的猜测是因为我的设备里面已经有了这个项目的apk和package,再次使用run app编译apk,会检测到已有apk,然后生成的apk就带有testOnly。

解决安装apk时ErrorCode:-15 , INSTALL_FAILED_TEST_ONLY错误的思路

1、检查\app\src\main\AndroidMainfest.xml中是否有testOnly属性为true,如果有去掉或者改为false
2、检查\app\build\intermediates\manifests\full\debug\AndroidManifest.xml中关于生成apk的信息,是否有testOnly属性为true
3、检查Android Studio和gradle版本是否为alpha版本,换为稳定版本
4、检查是否关闭Instant Run功能,关掉此功能
5、检查是否使用alpha版本的依赖库,换成稳定版本

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 久笔记本电脑玩彩虹六号卡怎么办 彩虹六号一直建立小队进不去怎么办 小佩喂食器离线怎么办 手机打游戏掉帧怎么办 电脑打游戏掉帧怎么办 武装突袭3太卡怎么办 英语b级考不过怎么办 绝地求生被燃烧瓶烧了怎么办 搜狗输入法打字出现问好怎么办 全民k歌解码失败怎么办 视频声音小怎么办调大 乐视2视频声音小怎么办 录视频声音太小怎么办 显卡装了没反应怎么办 笔记本关闭核显黑屏怎么办 驱动补丁被卸了怎么办 网络驱动被删了怎么办 新装系统网卡没驱动怎么办 核显没有dp口怎么办 苹果7屏幕太小了怎么办 苹果装系统卡住了怎么办 苹果7手机白屏黑苹果怎么办 衣服破了个洞怎么办 黑苹果自带升级怎么办 双显卡都禁用了怎么办 win10优盘识别不出来怎么办 黑苹果无限重启怎么办 水泥地面起砂怎么办?这几招很有用 跟老公没法过了怎么办 胃和肠子有点烂怎么办? 车的屏幕黑了怎么办 ios12玩游戏闪退怎么办 没网steam要登录怎么办 电脑有gta还需要安装怎么办 孤岛惊魂5卡顿怎么办 酷匠密码忘记了怎么办 战地1有时候卡死怎么办 战地一fps太低怎么办 Dnf与系统不兼容怎么办 使命召唤7显示w怎么办 战地3王者太卡怎么办