android:testOnly="true"
这个标记原本是用来标记测试用的,所以带这个标记的包一般情况下是不能安装上的,需要使用特殊的方式安装.AS3.0.0默认会在我们run的时候在application节点添加这个属性,然后在安装时会给我们加上 -t flag,所以在自己安装的时候没有问题.
issue
AS run 出来的包在连接的测试机上可以安装,但是给其他人安装时就会有问题.而且是竟然可以上传到应用商城去,没有被拒绝,导致用户下载了却提示不能安装。GooglePlay是不允许上传标记为test的包的。
从 apk 的 manifest 中查看信息,多出了android:testOnly="true"
<application
...
android:name="io.micro.proj.PApplication"
android:testOnly="true">
...
</application>
analysis
- 如果从AS run的,可以从控制台看到其用到的命令
12/07 16:02:44: Launching app
$ adb push F:\project\Project\app\build\outputs\apk\dev\debug\app-dev-debug.apk /data/local/tmp/io.micro.proj
$ adb shell pm install -t -r "/data/local/tmp/io.micro.proj"
Success
这里有个-t
的flag,所以我们在AS下安装时没有提示安装失败。
如果需要自己命令行运行安装,则需要在adb install -t xxx
添加 t 标记
没有-t
标记就会提示
Failure [INSTALL_FAILED_TEST_ONLY: ...]
- 如果在 application 节点强制指定为 false, 还需使用 tools="replace",不然还是会被覆盖为 true.
other
所以如果是作为发布的包一定不要从 IDE 默认构建的,要么使用命令行去构建,要么就是选择build apk
, 最好是通过 CI 输出apk, 这样就不容易出错了.
参考:
https://commonsware.com/blog/2017/10/31/android-studio-3p0-flag-test-only.html
https://stackoverflow.com/questions/25274296/adb-install-fails-with-install-failed-test-only
网友评论