安卓引入 leakcanary 后如何正确打开 app
今天在做安卓自动化脚本时发现一个诡异的问题。当使用 appium 的 activateApp(String bundleId) 方法打开 app 时,使用 release 包可以正确打开 app,但使用 debug 包时确总打开小鸟(leakcanary)。刚开始还以为包名 写错了,再三检查后发现没错,原来 leakcanary 的 bundleId 跟我的 app 是同一个,只是桌面会多出一个图标(他们就是一个 app 只是在桌面多出一个图标)。
错误窗口及桌面图标:
知道问题在哪,解决问题就好办了,按如下步骤解决:
- 找到您的 app 的 activate
- 打开 app 并直接打开对应的 activate
一、得到您的 app 有哪些 activate
1、查看你的 app 的 包名,adb 连接后执行如下命令列出您手机上的所有app,找到你的 app 的包名
adb shell pm list package
2、使用 dumpsys 查看 app 都有哪些 activate,假如您的包名是 com.xxx.xxx.debug ,执行如下命令
dumpsys package com.xxx.xxx.debug
命令执行后入下图,可以看到大部的 activate 都是 leakcanary 的 activate,所以启动 app 会打开 leakcanary 的 activate。
二、打开 app 并直接打开对应的 activate
1、使用 am start 启动 app,其中 / 前边是 包名,后边是 activate 名称。adb 连接后再执行如下命令,就可以正确启动 app 了,命令中的 activate 名称就是通过以上的 dumpsys 命令找到的。
am start com.xxx.xxx.debug/com.xxx.xxx.activity.SplashActivity
2、使用 appium 的(String bundleId)
虽然 am start 可以正确打开 app,但我用的是 activateApp 方法,又如何处理呢?
查看了 appium 的 activateApp 方法,它用的是 monkey 命令,找了半天也没找到如何指定 activate名称。实在没办法找了个迂回的方法解决,通过 activateApp 启动 app,再使用 currentActivity() 得到当前的 activate 名称,如果不是你要打开的 activate 那就重复执行 activateApp,只到正确为止。式例代码如下:
for (int i = 0; i <= 20; i++) { androidDriver.activateApp(appPackage); if (androidDriver.currentActivity().indexOf(activityName.trim()) >= 0) { return; } Thread.sleep(200); }