リモートLinuxサーバー上のAndroid仮想デバイスでアプリケーションを実行する

1つのプロジェクトに取り組む過程で、モバイルアプリケーションから多くの操作を自動的に実行する必要がある状況が発生しました。 アプリケーションが機能するためにユーザーが入力する入力データのセットは変化しているため、ユーザーのアクションをシミュレートする実装が必要でした。 さらに、アプリケーションがリモートLinuxサーバーで自動的に起動し、アクションを実行して結果を保存する必要がありました。 この問題の解決方法について、読者に伝えたいと思います。



問題の最初の部分は非常に簡単に解決されました-モバイルアプリケーションをテストするためのライブラリを取得し、必要なロジックを実装します。 選択はRobotiumにかかった。 第一に、それは無料であり、第二に、少なくとも私にとっては、テストされたアプリケーションで便利に作業することができます。 私はテストの実装に焦点を当てません。他の記事はこれに専念します。結果は、テスト対象のアプリケーションを起動したり、表示されるものを分析したりできる他のアプリケーションであることを思い出します。 作業の2番目の部分には、さまざまな落とし穴がありましたが、最初に最初のことがありました。



要件とツール



主な要件は、アプリケーションをLinuxサーバーで実行することでした。 私にとって、これは、私に馴染みのあるグラフィカルインターフェイス、熱心な「農家」が存在せず、その後に続くすべての困難があることを意味しました。 また、必要に応じて同じサーバー上ですべてをデバッグする機能も役に立ちました。



実装のために使用されました:

  1. 開発環境-IntelliJ IDEA ;
  2. リモートLinuxサーバー-Debian 7
  3. Android SDK ;
  4. Putty-リモートデバッグを実装します。




ステップ1. SDKをデプロイする



ここから Android SDK自体を取得できます 。 もちろん、その作業には、プリインストールされたJDKが必要です。バージョン1.7がありました。 以前は、必要だったのはx86バージョンでしたが、最近のいくつかのバージョン以降、この問題はなくなりました。 Android SDKを入手したら、インストールと構成を開始します。

  1. アーカイブをLinuxマシンにコピーし、必要なディレクトリに展開します。
  2. 次に、SDKを更新します。

    2つのオプションがあります。 まず、必要なものが正確にわかったら、利用可能なライブラリのリストを取得します。



    ./android list sdk –all
          
          





    その結果、ダウンロード可能なパッケージの長いリストを取得し、必要なパッケージを選択して、ロードするコマンドを提供します。



     ./android update sdk --no-ui –filter<        >
          
          





    2番目のオプションは、現在利用可能なすべてをダウンロードすることです。 私自身はAndroid開発者ではなく、必要なものをすべて選択するかどうか確信が持てなかったため、私に近いことがわかりました。



     ./android update sdk --no-ui
          
          





    これらのコマンドは両方とも公式Webサイトのドキュメントセクションで説明されていますが、何らかの理由で、グラフィカルインターフェイスなしで起動を示す--no-uiキーの説明がそこに見つかりませんでした。
  3. パッケージの読み込みが完了するのを待っています。


さらに、管理を簡単にするために、 platform-toolsおよびtoolsディレクトリーからadbandroidエミュレーター・ユーティリティーをシステム変数に追加できますが、私はそれらをディレクトリーから開始しました。



ステップ2. Android仮想デバイスを作成して起動する



ここで、仮想デバイスを作成する必要があります。ここでも複雑なことはありません。このためのコマンドは標準です。



 ./android create avd --name < > --target <    Android> –b <  >
      
      





デバイスの名前 -さて、ここではすべてが明確です。

Android OSのバージョン番号 -デバイスの作成に利用可能なバージョンのリストで確認できます。 リスト自体は、次のコマンドで取得できます。



 ./android list target
      
      





プロセッサ命令のセット -エミュレートするプロセッサ。Androidバージョンにプロセッサバージョンが1つしか使用されていない場合、このパラメーターは無視できます。それ以外の場合、ユーティリティはコマンドに応答して命令セットを明示的に指定し、可能なオプションも示します。 たとえば、私のパラメーター値はdefault / armeabiでした



その後、仮想デバイスの一連のファイルを含むフォルダーを作成しますこれは、 ルートディレクトリまたはSDK自体が配置されているディレクトリ(ユーザー権限に応じて)にある* /。Android / avdディレクトリにあります。 ファイルのあるディレクトリの名前は、仮想デバイスの名前と同じです。



次に、デバイスを起動します。 条件は、端末にアクセスできるサーバーがあることです。つまり、グラフィックライブラリがなかったということです。 しかし、私たちはグーグルからの人々に敬意を表さなければなりません。



 ./emulator -avd < > -no-window
      
      





-no-window-画面をオフにして開始することを示します。

デバイス名 -上記のデバイスを作成するときに指定した名前。

より詳細な説明と起動するその他のキーは、 ここにあります



次に、デバイスが起動するまで待つ必要があります。



 ./adb wait-for-device
      
      





次に、アプリケーションをインストールする必要があります。サーバーにアクセスするメインアプリケーションと、メインアプリケーションにアクセスしてアクションを実行できるrobotiumアプリケーションです。



 ./adb install -r < >
      
      





-r-このキーは、アプリケーションが既に存在する場合は上書きすることを示します。

アプリケーション名 -拡張子を持つapkファイルの名前。



多くのリソースで、あるマシンから別のマシンに単純にファイルをコピーするだけでAVDを転送できるという言及に出会いましたが、動作しませんでした。その名前では観察されませんでした。 しかし、エミュレータを作成することは一時的な問題であるため、私はそのことでそれを振った。



ステップ3.アプリケーションを起動する



robotiumアプリケーションの起動は非常に簡単です(例として具体的な例を示します)。



 ./adb -s emulator-5554 shell am instrument -w -e class com.example.robotium.Kernel com.example/android.test.InstrumentationTestRunner
      
      





emulator-5554-エミュレーターの名前。エミュレーターがシステム上で単独で実行されている場合、通常は標準ですが、次のコマンドで実行可能なデバイスのリストを表示できます。



 ./adb devices
      
      





e class com.example.robotium.Kernel-テストを直接実行するrobotiumアプリケーションのクラスの名前。

com.exampleは、robotiumアプリケーションのAndroidManifest.xmlファイルからのパッケージの名前です。



これはフィニッシュのようですが、そこにはありませんでした。 アプリケーションが起動し、しばらくの間実行されて失敗しました。 エミュレータを起動すると、ロックされた画面で起動しますが、それでもこの画面が表示されるかどうかはわかりません。 検索エンジンの最初のリンクの1つは、単にコマンドを実行することを勧めています。



 ./adb shell input keyevent 82
      
      





彼のwindows-machineでのテストでは、これが機能すること、およびエミュレーターが–no-windowパラメーターを使用して起動したかどうかに関係なく、動作することが示されました。 しかし、debianでの起動では何も得られず、エラーが繰り返されました。つまり、理由が異なるということです。 長時間の検索では具体的なことは何もわかりませんでした。明らかに、ターミナルサーバーでGUIのテストを実行する人はほとんどいませんでした。 基本的に、これらのテストはGUI用であるため、画面がオフの場合は動作しない、表示するGUIがない、テストがない、などのコメントがありました。 しかし、私の状況は「パーティーが必要だと言った」というカテゴリーのものであり、この回答でチームリーダーに会えなかったので、画面がロック解除されなかったという公理として考えました。結局のところ、ターミナルサーバー。 彼は、起動時の画面の状態に追加のチェックを追加し、画面がロック解除されているだけでなく、オフになっていることもわかりました-コマンドが失敗しました。



ソフトウェアのロック解除は、問題の解決に役立ちました。 これを行うには、robotiumアプリケーションにコードを追加します。



 PowerManager.WakeLock wl; PowerManager pm = (PowerManager) solo.getCurrentActivity().getApplicationContext().getSystemService(Context.POWER_SERVICE); wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "INFO"); wl.acquire(); KeyguardManager km = (KeyguardManager) solo.getCurrentActivity().getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); KeyguardManager.KeyguardLock kl; kl = km.newKeyguardLock("name"); kl.disableKeyguard();
      
      





このコードをAndroidManifest.xm lファイルで機能させるには、次の行を追加する必要があります。



 <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
      
      





Android OSでのすべての作業はそれを介して行われるため、robotiumアプリケーションのファイルではなく、テスト対象のアプリケーションのファイルに追加する必要があることに注意する必要があります。つまり、すべてのアクセス権が必要です。



その後、前述のコマンドをもう一度実行します。歓声、すべてが始まり、すべてが機能します。



手順4.リモートデバッグを構成する



残念ながら、ゼロからAndroid SDK自体もIDEAもリモートサーバー上の仮想デバイスを操作できません。つまり、デバイスが近くにあると思わせることになります。 これを行うには、Puttyでサーバーへのトンネルを構成します。 これを行うには、2つのポートを追加します。エミュレーター5554デバイスの場合、これらはポート55545555になります。 念のため、画像の例を以下に示します。



画像



リモートサーバーで、ADBサービスをオフにします。



 ./adb kill-server
      
      





そして、ローカルマシンで、起動または再起動します(すぐにオフにします)。



 ./adb start-server
      
      





コマンド./adb devicesを実行すると、リモートで実行中のデバイスが表示されます。 残念ながら、エミュレーターをリモートで実行することはできません。既に実行中のエミュレーターを確認して、それらを操作するだけです。 デバイス選択ダイアログでIDEAから直接robotiumアプリケーションを起動すると、リモートエミュレーターが表示されます(画像を参照)。 ローカルの場合と同じ方法で作業できます。



画像



ご静聴ありがとうございました。この投稿が他の誰かに役立つことを願っています。



All Articles