54
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-13

#経緯
 「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コマンド越しで取得する方法が見つからず・・・。 )

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

ではでは。

54
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?