1

【背景】

Android テスト プロジェクトでインストルメンテーションを使用できました。しかし今、自動GUI制御を行うために、通常のAndroidアプリでインストルメンテーションを使用しようとしています。たとえば、インストルメンテーションを使用してアプリ Y を起動し、仮想キー/タッチ/クリック イベントをアプリ Y に送信するアプリ X があります。インストルメンテーションから派生した 1 つのアクティビティと 1 つのクラスで成功しました。これら 2 つのクラスは、1 つのアプリ プロジェクトで作成されます。アクティビティは次のようになります。

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 サーバーも作成されます。次の2つの問題に遭遇しました。

アクティビティ内の TCP サーバーの場合の問題 1 : ソケットは作成できますが、"startInstrumentation()" が新しいスタンドアロン プロセスで機器を起動しているため、アクティビティと機器は互いに通信できません。アクティビティは「FilterInstrumentation」クラスのインスタンスを取得できません。TCP サーバーが受信したコマンドは、簡単に測定器に送信できません。

問題 2は、TCP サーバーが FilterInstrumentation にある場合です。「java.net.SocketException: socket failed: EACCES (Permission denied)」というパーミッションの問題により、ソケットの作成に失敗します。FilterInstrumentation が動的に作成されたプロセスで実行されているため、Manifest.xml ファイルでアクセス許可を制御できません。

Android のテスト フレームワークは同じプロセスで計測器を実行できるようですが、テスト フレームワークを使用せずにコード内でこれを実行する方法がわかりません。

マスターはこれについて役立つ情報を提供できますか?

前もって感謝します。

4

0 に答える 0