安卓引入 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);
            }

 

posted @ 2022-12-18 09:35  rslai  阅读(228)  评论(0编辑  收藏  举报