【背景】
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 のテスト フレームワークは同じプロセスで計測器を実行できるようですが、テスト フレームワークを使用せずにコード内でこれを実行する方法がわかりません。
マスターはこれについて役立つ情報を提供できますか?
前もって感謝します。