在新的 android 模拟器上禁用 first-运行 greeter

Disabling first-run greeter on fresh android emulator

我正在编写一个需要直接从启动器启动应用程序的测试。因为我无法通过 intent 启动来正确模拟它。

问题是,当我 运行 在一个新的模拟器上进行测试时(我使用的是 Travis CI,但它可以很容易地在我的家用电脑上重现),模拟器以"first run" 迎宾覆盖。这会阻止我的 uiautomator 代码正确启动应用程序。

我已经尝试添加一些代码来关闭该欢迎程序,但不幸的是,当我的 "greeter detecting and closing" 代码已经停止工作时,我的 "greeter detecting and closing" 代码已经停止工作,认为海岸畅通无阻。

是否有任何可靠的方法来禁用该欢迎程序?一些偏好可能或者只是一个可以可靠地杀死欢迎程序的代码示例。

您尝试过使用 PackageManager.getLaunchIntentForPackage(..) 吗?这将允许您发送启动器用于启动您的应用程序的相同 Intent。它应该等同于单击应用程序的启动器图标。

如果您确实需要通过启动器,您可以对每个已注册的 UiWatcher 使用 UiWatcher to dismiss the first-run overlay. Whenever UiAutomator can't find an element, it will call the checkForCondition(..) 方法,让您有机会关闭任何妨碍您的覆盖或对话框。

显然,迎宾员叫 "cling"。通过搜索(相当旧的)代码,我发现了以下内容:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.2_r1/com/android/launcher2/Launcher.java#Launcher.isClingsEnabled%28%29

private boolean isClingsEnabled() {
    // TEMPORARY: DISABLE CLINGS ON LARGE UI
    if (LauncherApplication.isScreenLarge()) return false;
    // disable clings when running in a test harness
    if(ActivityManager.isRunningInTestHarness()) return false;
    return true;
}

下一站是 isRunningInTestHarness() http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.2_r1/android/app/ActivityManager.java#ActivityManager.isRunningInTestHarness%28%29

public static boolean isRunningInTestHarness() {
    return SystemProperties.getBoolean("ro.test_harness", false);
}

这又会导致 adb shell setprop ro.test_harness true。这很管用。