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

背景介绍

项目中遇到一个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 : meta-data at /data/app/vmdl-1441116836.tmp Binary XML file line #11
11-27 10:35:21.992 W/PackageParser( 1630): Unknown element under : meta-data at /data/app/vmdl-1441116836.tmp Binary XML file line #55
11-27 10:35:22.152 I/MonitorServer( 1831): net.media.MonitorServer$MonitorTask@41dce118 MonitorTask mRunFlag = true
11-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=0
11-27 10:35:22.392 D/RTK_RVSD( 1207): RVSD polling timeout, readptr=101f02f9, writeptr=101f02f9
11-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/vmdl519711966
01-02 06:03:45.699 W/PackageParser( 1642): Unknown element under : meta-data at /data/app/vmdl519711966.tmp Binary XML file line #11
01-02 06:03:45.699 W/PackageParser( 1642): Unknown element under : meta-data at /data/app/vmdl519711966.tmp Binary XML file line #48
01-02 06:03:47.009 I/ActivityManager( 1642): Force stopping com.tvb.hk.anywhere appid=1000 user=-1: replace sys pkg
01-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

...
android:testOnly="true"
...>

....

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版本的依赖库,换成稳定版本

你可能感兴趣的:(Android)