Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

経緯

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

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

ではでは。

divideby_zero
プログラマやったり、専門学校教員やったり、ゲーム業界叩いてみたりしましたが、結局またプログラマやってます。 XamarinとUnityが好き。というよりC#が好きっぽい。
unity-game-dev-guild
趣味・仕事問わずUnityでゲームを作っている開発者のみで構成されるオンラインコミュニティです。Unityでゲームを開発・運用するにあたって必要なあらゆる知見を共有することを目的とします。
https://unity-game-dev-guild.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away