#経緯
「OculusQuestにオレオレのアプリをUnityからインストールまでは良いとして、アンインストール出来ないって・・・本当・・・? コマンドプロンプトでADBコマンド打ってアンインストールするの・・・?え?本当に?え?何言ってるの・・・?」
というわけで作りました。
https://github.com/divide-by-zero/ADBB/
※申し訳ありませんがwindows専用です
#出来る事
- APKファイルのインストール(ファイルダイアログからの選択またはパッケージ一覧部分へのドラッグアンドドロップ)
- インストールされている(サードパーティー製)アプリのパッケージ名一覧表示(及びフィルタ)
- パッケージ指定によるアプリのアンインストール
- パッケージ指定によるアプリの強制起動・停止
- 端末へのIPアドレス接続・切断
- 端末強制シャットダウン
- 端末強制再起動
#言い訳
あくまでも自分用なので、UIもアレな感じですし、ソースコードもお察しですが、しばらく使ってみてそこそこ便利(手前味噌)だったので、公開することにしました。
また、大体のAndroid端末でも使用できると思いますが、基本はOculusQuest用です。
というのも、内部ではadb shell
によって情報取得しているんですが、そこで grep
や sed
を使っており、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.Run
と TaskCompletionSource
を使って非同期(スレッドプール実行)にしてあります。
それだけなら良いんですが、 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コマンド越しで取得する方法が見つからず・・・。 )
どなたか方法ご存知でしたら教えていただけるとありがたいです(プルリクも大歓迎です)
ではでは。