android:testOnly="true"

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

  1. 如果从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: ...]
  1. 如果在 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容