1

[的背景]

我已经能够在 Android 测试项目中使用该仪器。但是现在,我正在尝试在普通的 Android 应用程序中使用仪器来进行一些自动 GUI 控制。例如,有一个应用程序 X,其中检测用于启动应用程序 Y 并将虚拟键/触摸/单击事件发送到应用程序 Y。我成功地使用了一个活动和一个从 Instrumentation 派生的类。这 2 个类是在一个应用程序项目中创建的。活动是这样的:

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        ...
        String pack = new String("com.example.appX.MainActivity");
        ComponentName name = new ComponentName(MainActivity.this,
                                               FilterInstrumentation.class);
        Bundle arguments = new Bundle();
        arguments.putString("package", pack);
        startInstrumentation(name, null, arguments);
        ...
    }
}

仪表子类是这样的:

public class FilterInstrumentation extends Instrumentation {
    public void onStart(){
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setClassName(getTargetContext(), pack);
        Activity activity = startActivitySync(intent);
    }
    ...
}

[问题]

该活动和仪器正在成功运行。TCP 服务器还用于接收来自外部网络的命令,以控制仪器的行为。我遇到了以下两个问题:

Activity 中 TCP 服务器时的问题 1:可以创建套接字,但 Activity 和仪器无法相互通信,因为“startInstrumentation()”正在新的独立进程中启动仪器。活动无法获取“FilterInstrumentation”类的实例。TCP 服务器接收到的命令不能轻易发送到仪器。

问题 2当 TCP 服务器在 FilterInstrumentation 中时。由于“java.net.SocketException: socket failed: EACCES (Permission denied)”的权限问题,它将无法创建套接字。FilterInstrumentation 在动态创建的进程中运行,我无法通过 Manifest.xml 文件控制权限。

似乎Android的测试框架可以在同一进程中运行仪器,但我不知道如何在没有使用测试框架的情况下在我的代码中执行此操作。

任何大师都可以提供任何有用的信息吗?

提前致谢。

4

0 回答 0