写在前面
最近又在使用Windows系统了。操作系统变了,环境也变了,问题也随之而来哦~
用AS Run了一个代码,生成了apk进行安装。但是不幸的事情是,我的小米手机提示,未安装(也就是安装失败了)。
查看logcat 提示:Installation error code: -15 意思是:INSTALL_FAILED_TEST_ONLY
问题分析
各种查询资料之后,发现并不是偶现。下面描述一下环境和各种配置。
环境:
软件:Android Studio 3.0.1
gradle:4.1
jdk:1.8
清单文件中有一个不太常用的属性,testOnly。
android:testOnly:应用是否是为了测试,它可能向外暴露数据,引发安全漏洞,如果为true,应用只能通过adb安装。一般来说,项目中manifest不会去设置这个属性,所以会默认为false。
问题解决
1) 检查Android Studio和gradle版本是否为alpha版本,换为稳定版本
2)检查是否打开了Instant run功能,如果打开了关闭。
3)△ 检查\app\src\main\AndroidMainfest.xml中是否有testOnly属性为true,如果有去掉或者改为false
4)△ 运行生成安装包的方式是Run app的话,试下Build apk(s)
(可能Google对AS3.0的又做了处理?Run app会将testOnly默认设置成true)
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。
写在后面
1、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: 未知错误
2、Instant Run
Instant Run,是android studio2.0新增的一个运行机制,在你编码开发、测试或debug的时候,它都能显著减少你对当前应用的构建和部署的时间。 当我们第一次点击run、debug按钮的时候,它运行时间和我们往常一样。但是接下去的时间里,你每次修改代码后点击run、debug按钮,对应的改变将迅速的部署到你正在运行的程序上,传说速度快到你都来不及把注意力集中到手机屏幕上,它就已经做好相应的更改。