Java 在Android中从应用程序执行检测测试

Java 在Android中从应用程序执行检测测试,java,android,android-studio,kotlin,android-uiautomator,Java,Android,Android Studio,Kotlin,Android Uiautomator,首先很抱歉,如果我的问题是无知的,我不是一个Android开发者。我必须构建一个bot应用程序(自动执行另一个应用程序中的操作),并发现这是可能的。(我知道我误用了这个框架,但从我的角度来看,我试图实现的目标是不可能的。) 我开始构建这个应用程序,它可以工作,但是,我希望能够在设备没有连接到Android Studio的情况下运行它。 是否可以通过按下按钮或其他方式从应用程序执行测试?是,这是可能的 可通过两种方式实现: 在第一个应用程序中实现基于意图的框架,并从第二个应用程序发送定制意图,将

首先很抱歉,如果我的问题是无知的,我不是一个Android开发者。我必须构建一个bot应用程序(自动执行另一个应用程序中的操作),并发现这是可能的。(我知道我误用了这个框架,但从我的角度来看,我试图实现的目标是不可能的。)

我开始构建这个应用程序,它可以工作,但是,我希望能够在设备没有连接到Android Studio的情况下运行它。 是否可以通过按下按钮或其他方式从应用程序执行测试?

是,这是可能的

可通过两种方式实现:

  • 在第一个应用程序中实现基于意图的框架,并从第二个应用程序发送定制意图,将其与第一个应用程序或adb可以理解的数据捆绑在一起

    am广播-com.android.example--es KEY some_KEY--es VALUE some_VALUE

  • 使用JAVA socket通信和UiAutomator框架实现TCP服务器,该框架识别并执行第一个应用程序的UI对象上的操作,并将其编译为Instrument test apk,并从第二个应用程序向该服务器应用程序发送命令以控制它(总共3个应用程序:第一个、第二个(客户端)和服务器)


我知道一开始听起来很困惑,但是是的,它很管用

UIautomation依赖于android.app.instrumentation。出于安全原因,除非用户明确授予可访问性权限,否则系统不会授予“在其他应用程序上执行操作”的权限

因此,如果没有“连接到android studio”,恐怕无法使用UIAutomator(这种连接正是通过adb实现的,android studio使用adb连接到手机)。如果需要,您也可以直接使用adb,但必须连接到计算机和adb可执行文件

有关UIAutomator和AccessibilityService差异的更多信息

更新:
即使在没有adb连接的情况下无法使用UIAutomator,您仍然可以使用编写自己的辅助功能服务。请注意,它不允许您“执行检测测试”,但允许您“在另一个应用程序中执行操作”。

您必须在特定设备/通过应用程序运行它吗?我要做的是(这需要一到两天的时间(如果你不熟悉它,甚至更多,但有很多好的中等帖子等)设置一个CI环境,或者在我想的时候触发Jenkins作业,或者引入周期性作业,每X小时执行一次

如果你死心塌地想从手机上运行它,那么这里的好处是你可以设置一个webhook并通过你的应用程序触发它,然后jenkins会触发你想要的工作

这种方法的另一个优点是,理论上你可以将它扩展到无穷大,你的机器人可以在X个不同的设备上并行运行测试

一旦你安装了Jenkins并下载了Android命令行工具,你就需要创建一个作业,在那里你可以构建一个普通的apk和一个测试apk并将其安装到目标设备上

下面是运行ui测试需要提供的构建命令的一个小示例(您可以使用或下载自己的带有avd的仿真器连接Firebase测试实验室等的真实设备。它还包括禁用锁屏/动画的方法,这会破坏ui测试。不幸的是,Jenkins/Android命令行工具的整个设置远远超出了这个问题的范围 这里有一些关于这方面的有用内容


谢谢你的输入!我想我必须选择你的第二个选项,因为我想要自动化的应用程序不是我自己制作的,所以我不能遵循第一个选项。所以我的问题是:当我设置TCP服务器时,1。)我如何向它添加UiAutomator?2。)我如何将它编译为仪器测试apk?你尝试过这个解决方案吗@Anvesh?谢谢!我并不特别需要UIAutomator,我只是认为这是唯一可能的解决方案。现在我没有时间去挖掘你在赏金到期前提供的链接,所以我只是问你,有了Accessibility服务,你可以在任何第三方应用程序中执行操作吗?我可以在设备未连接到计算机的情况下启动此过程吗?@chnsky是的,您可以,但在系统设置上首次手动安装后,您需要授予访问辅助功能服务的权限。我接受Raymond的回答,因为这是我实际实现的,最终解决了我的问题。然而,您的解决方案看起来确实具有可扩展性和健壮性。如果可以,我会接受两个答案。当我有时间的时候,我一定会尝试实现这个解决方案。
./gradlew clean myapp:assembleDebug --no-daemon -Dkotlin.compiler.execution.strategy="in-process"
./gradlew myapp:assembleDebugAndroidTest --no-daemon -Dkotlin.compiler.execution.strategy="in-process"


/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 install -r  myapp/build/outputs/apk/debug/myapp-debug.apk
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 install -r -t myapp/build/outputs/apk/androidTest/debug/myapp-debug-androidTest.apk
/var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell input keyevent KEYCODE_MENU 
 /var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell settings put global window_animation_scale 0 &
    /var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell settings put global transition_animation_scale 0 &
    /var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558 shell settings put global animator_duration_scale 0 &
   /var/lib/jenkins/android-sdk/platform-tools/adb -s emulator-5558  shell am instrument -w  -e clearPackageData true --no-window-animation  -e package com.mypackage.testcases.tests -e debug false com.mypackage.test/androidx.test.runner.AndroidJUnitRunner