自分用にADBコマンドのGUI操作ツールを作ってみた


経緯

 「OculusQuestにオレオレのアプリをUnityからインストールまでは良いとして、アンインストール出来ないって・・・本当・・・? コマンドプロンプトでADBコマンド打ってアンインストールするの・・・?え?本当に?え?何言ってるの・・・?」

というわけで作りました。

https://github.com/divide-by-zero/ADBB/
※申し訳ありませんがwindows専用です

出来る事

  • APKファイルのインストール(ファイルダイアログからの選択またはパッケージ一覧部分へのドラッグアンドドロップ)
  • インストールされている(サードパーティー製)アプリのパッケージ名一覧表示(及びフィルタ)
  • パッケージ指定によるアプリのアンインストール
  • パッケージ指定によるアプリの強制起動・停止
  • 端末へのIPアドレス接続・切断
  • 端末強制シャットダウン
  • 端末強制再起動

言い訳

あくまでも自分用なので、UIもアレな感じですし、ソースコードもお察しですが、しばらく使ってみてそこそこ便利(手前味噌)だったので、公開することにしました。
また、大体のAndroid端末でも使用できると思いますが、基本はOculusQuest用です。
というのも、内部ではadb shellによって情報取得しているんですが、そこで grepsed を使っており、ADB Shell で使用出来るコマンドが全てのAndroid端末で共通とはとても思えない ので、そこはグレーゾーンにならざるを得ない感じです。

起動方法

gitでcloneしてビルド または release (https://github.com/divide-by-zero/ADBB/releases/) でダウンロードできるzip
または exe(自己解凍形式) を解凍して、フォルダ内の ADBB.EXE を起動してください。
初回起動の際にはadb.exeへのパス設定が開きますので、(インストールされているであろう)adb.exeを指定してください。

通常はAndroidSDKをインストールしたフォルダ\android-sdk\platform-tools の中です。

仕組み

上記に書いた「出来る事」は全て adb (Android Debug Bridge) で出来る事です。
設定したadb.exeのパスを使用し、コマンドを肩代わりしている(Bridgeしている)に過ぎません。
そのため(理論上は)adb.exeで出来ることは全部できますし、逆にadb.exeに出来ないことは手が出せないです。

ソース構成

ものすごい雑に、ValueObjectとして、接続されたAndroid端末を担当する Deviceクラス、インストールされているアプリをPackageDataクラス。
UI部分はMainForm、Adbコマンド処理クラスとして AdbCommandクラスです(まんま) どシンプル。

ちょっと頑張ったところ

普通にADBコマンドを Processクラス で実行するとUIが固まります。 ブロック処理なので。
そのため、内部的に Task.RunTaskCompletionSource を使って非同期(スレッドプール実行)にしてあります。
それだけなら良いんですが、 adb install [パッケージ名] および adb uninstall [パッケージ名] のコマンドはDeviceが接続されてない状態で実行すると

c:\>adb install test.apk
error: no devices/emulators found
adb: error: failed to get feature set: no devices/emulators found
- waiting for device -

このように - waiting for device - と出て、デバイスが接続されるまで待ち状態になってしまいます。
コマンドラインでこの状態になったなら Ctrl+C など打って止めるだけですが、Processクラスを使用しての実行の場合は外部からKill() を呼んであげる必要があります。

今回のようにTask化されている処理を外部から停止 = CancellationToken の出番ですね。

そんなわけで、 CancellationToken を渡す事が出来る版の非同期Process実行が実装されています(多分)

それ以外は、ものすごい地味にadbのコマンド(およびadb shell上でのコマンド)から標準出力で得られる情報を頑張ってスクレイピングしてます。涙ぐましい。

もっとやりたいこと

  • 「Device更新」を押さずとも、自動で接続/切断されたAndroidデバイスが検出できれば。今は心がこもった手動駆動。
  • パッケージ名から、アプリケーション名やアイコン画像などを取得して、画面に表示したい。(adbコマンド越しで取得する方法が見つからず・・・。 )

どなたか方法ご存知でしたら教えていただけるとありがたいです(プルリクも大歓迎です)

ではでは。