Android
C#
adb
OculusQuest

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


経緯

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

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

https://github.com/divide-by-zero/ADBB/

※申し訳ありませんがwindows専用です


出来る事


  • APKファイルのインストール(ファイルダイアログからの選択またはパッケージ一覧部分へのドラッグアンドドロップ)

  • インストールされている(サードパーティー製)アプリのパッケージ名一覧表示(及びフィルタ)

  • パッケージ指定によるアプリのアンインストール

  • パッケージ指定によるアプリの強制起動・停止

  • 端末へのIPアドレス接続・切断

  • 端末強制シャットダウン

  • 端末強制再起動
    image.png


言い訳

あくまでも自分用なので、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コマンド越しで取得する方法が見つからず・・・。 )

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

ではでは。