モバイルファースト室の山下( @tomorrowkey )です。
みなさんはAndroidアプリをビルドするときに
AndroidStudioの実行ボタンを押すのと、ターミナルでgradleコマンドを実行するのと、どちらを使っていますか。
クックパッド社内のAndroidエンジニアでもどちらを使うか好みが分かれるのですが、私はたいていターミナルでgradleコマンドを使っています。
AndroidStudioの実行ボタンだとビルドを途中で中止できないことがあるからです。コマンドであればcontrol
+c
でいつでも中止できるという気軽さからコマンドを好んで使用しています。
開発するうえでIDEなどのGUIツールはとても便利なのですが、実はコマンドを実行する方がはるかに早くストレスなく開発を進めることができることがあります。
今回は私が実際に使っている便利なコマンドラインスクリプトを10個紹介します。
注意
今回紹介するコマンドラインスクリプトのほとんどはOSXでしか動作しません。
Linuxでもほとんどは動くはずですが、動作検証していないため分かりません。
Windowsのみなさんごめんなさい。そのままでは動きません。
スクリプトを読み替えてバッチファイルを作れば動く可能性があります。
目次
- adbコマンドの実行時にデバイスを選択する
- logcatを見やすく表示する
- adbをコマンド1つで再起動する
- デバイスにインストールされているアプリをアンインストールする
- 深いフォルダにあるapkファイルをインストールする
- スクリーンショットを撮影する
- gradleコマンドを補完する
- adbコマンドを補完する
- genymotionを素早く起動する
- ビルドが終わったら音を鳴らす
adbコマンドの実行時にデバイスを選択する
複数のAndroid端末を同時につないで困ってませんか?それadb-pecoで選択できるよ! - クックパッド開発者ブログ http://techlife.cookpad.com/entry/2014/09/09/172449
複数のAndroidデバイスがコンピュータに接続されている時に、adbコマンドを使おうとするとmore than one device or emulator
というエラーメッセージが表示されますよね。
adb-pecoを使えば複数のデバイスが接続されている場合に端末を選択することができるので、あのメッセージを見てイラッとすることは二度とありません。
logcatを見やすく表示する
JakeWharton/pidcat
https://github.com/JakeWharton/pidcat
これはとても有名ですね。
Jeff Sharkeyという方がcoloredlogcatを作っていたのですが、JakeWhartonがより見やすく使いやすくアップデートしたスクリプトです。
そのまま使うと単色でインデントも効いていない見づらいlogcatですが
pidcatを使うとカラフルに見やすく表示されます。
adbをコマンド1つで再起動する
Android端末を接続したけど、認識されないという時があります。 adbを再起動することで認識される場合があるのですが、2つのコマンドを打ち込む必要があります。
adb kill-server adb start-server
リターンを含めると33文字もタイプしなくてはなりません。
デバイスが認識されない時はけっこうハマって何度もこのコマンドを叩かないといけないことが多いので、予め1つのコマンドにまとめておくと便利です。
.bashrc
に以下の一行を追記します。
alias restart-adb='adb kill-server; adb start-server'
これでコマンド1つでadbを再起動することができるようになります。
$ restart-adb * daemon not running. starting it now on port 5037 * * daemon started successfully *
ただ連続でコマンドを叩くエイリアスを作っているだけですが、ちょっとした時に楽できます。
デバイスにインストールされているアプリをアンインストールする
デバイスから特定のアプリをアンインストールしたい時があります。
アプリをアンインストールするには端末上で操作をしなければなりません。
設定アプリを開き、アプリ一覧からアンインストールしたいアプリを選択して、アンインストールボタンを選択し、アンインストールされるのを待てばアンインストール完了です。
1日に何度もやるようなものではないとはいえ、ステップがいくつもありとても面倒です。
最近のAndroidであればランチャーからドラッグアンドドロップでアンインストールする方法もあり、前述した方法よりは楽にアンインストールすることができますが、これでもデバイスの操作がひつようなので面倒です。
コマンド一発でアンインストールできるようにuninstallapp
というコマンドを使っています。
alias uninstallapp='adbp shell pm list package | sed -e s/package:// | peco | xargs adbp uninstall'
pmコマンドでインストールされているアプリ一覧が取得できるのと、adbからアプリをアンインストールできるコマンドがあるので、組み合わせてターミナルからアプリをアンインストールできるようにしました。
深いフォルダにあるapkファイルをインストールする
今度はコマンドでビルドとインストールをしましょう。プロジェクトルートにいるなら./gradlew installDebug
を実行します。 開発を進め、何度かビルドと検証を繰り返していくうちに、アプリの初期状態から実行してみたいと思うことはありませんか。 一度アンインストールして再インストールしてしまえばよさそうですね。アンインストールにはさっき作ったuninstallapp
コマンドが使えそうです。
インストールする方法はどうでしょう。 この時に選択肢は2つあり、adb install
コマンドを使って最後に作られたapkファイルをインストールをするか、もう一度./gradlew installDebug
を実行します。
前者の場合はadb install
の後にapkファイルを直接指定しなくてはなりません。apkファイルが出力されるのはプロジェクトルートから辿ると./app/build/outputs/apk/app-debug.apk
となかなか深い位置にあります。頑張って指定するのもいいですが、何度もやりたい作業ではありません。
後者の場合はタイプする量は少ないですが、もう一度ビルドを走らせないといけないのでインストールされるまで結構時間がかかります。
たださっきビルドしたapkをインストールしたいだけなのですが、両者もそれぞれデメリットがあり、どちらも選択したくありません。
私はこれらのデメリットを解決するためにinstallapp
というコマンドを作って使っています。
alias installapp='find ./ -name *.apk | peco | xargs adb install -r'
findコマンドでapkファイルを探し、それをpecoに渡して選択できるようにして、選択されたapkファイルをadbコマンドでインストールしています。
インストールしたいだけであればinstallapp
と打てば楽にインストールできるようになりました。
pecoで選択できるようにしているので、複数のapkファイルがあっても簡単に選択することができます。
スクリーンショットを撮影する
新しく組んだレイアウトの確認やプルリクエストを作る時などデバイスのスクリーンショットを撮影する機会はたくさんあります。
みなさんはスクリーンショットを撮影するときはどのようなツールを使っていますか。
おそらくDDMSのスクリーンショットを撮るアイコンをクリックしてスクリーンショットを撮り、Saveボタンを押して画像を保存していると思います。
わずか2ステップですが、それですらコマンドを作ることでターミナルで楽に処理することができるようになります。
alias screenshot='screenshot2 $TMPDIR/screenshot.png; open $TMPDIR/screenshot.png'
android-sdkにscreenshot2というコマンドが入っています。
これはコマンドラインでスクリーンショットを撮影するためのコマンドです。
このスクリプトではスクリーンショットを撮影してプレビューで開くように処理しています。
使い慣れたプレビューで開かれるので、回転や縮小などの処理も簡単に行えます。
gradleコマンドを補完する
gradleコマンドは長くなりがちなので、打つのがとても大変です。 例えばbuildVariantsを使ってstagingサーバーに向けたdebugビルドを作ろうとした場合こんなコマンドを打ちます。
./gradlew installStagingDebug
29文字もタイプしなければなりません。 私はよくinstallをtypoして不明なタスクが実行されようとしているとgradleに怒られます。
このコマンドはよく打つのでまだ覚えることができますが、crashlyticsにリリースビルドをアップロードしようとした場合はこんなコマンドを打ちます。
./gradle crashlyticsUploadDistributionRelease
めったに打たないコマンドなのに45文字もタイプしなければなりません。 こんな長いコマンド覚えてられません。
そんな問題を解決できるのがcompletionというスクリプトです。 completionはターミナルのコマンドを補完するスクリプトの通称で、bashを補完するbash-completionやgitを補完するgit-completionなどがあります。
実はgradle用に作られたcompletionがあり、これを使えばもう長いコマンドを覚える必要はありません。
Gradle tab completion for Bash. Works on both Mac and Linux.
https://gist.github.com/nolanlawson/8694399
adbコマンドを補完する
completionを使ってgradleが補完されるようになりました。
あまりコマンドの数は多くありませんが、adb向けにもcompletionが作られており、gradle同様補完することができます。
mbrubeck/android-completion
https://github.com/mbrubeck/android-completion
android-completionはコマンドの補完は当たり前ですが、特定のデバイスを指定する-s
オプションも補完してくれます。
adb-pecoとすこし機能がかぶっていますが、先にデバイスの指定するか後にデバイスを指定するかの違いがあるので、お互いに使い分けることができると思います。
genymotionを素早く起動する
Genymotionを起動するにはまずGenymotion.appを起動してエミュレータを選択して起動するといったステップが必要です。 ただこれだけの手順であれば面倒でもなさそうですが、Genymotion.appの起動はとても遅いです。 ライセンスの認証や初期化処理などで10秒くらい待たなければなりません。 ただエミュレータを起動したいだけなのに、エミュレータ一覧の画面を開くためだけに10秒も待てません。
genymotion-pecoを使えば解決することができます。
sys1yagi/genymotion-peco
https://github.com/sys1yagi/genymotion-peco
genymotion_peco
というコマンドを打てばエミュレータ一覧が表示されます。選択するとエミュレータが起動します。
エミュレータ一覧にはpecoを使っているので例えば4.4.2
と打てば4.4.2のエミュレータだけ絞り込むことができます。
ビルドが終わったら音を鳴らす
Androidのgradleビルドってとても長いですよね。
アプリの大きさやキャッシュの状況にもよるんですが、大きなアプリだと1~2分かかることも珍しくありません。
みなさんとても優秀なエンジニアなので、そんなスキマ時間でさえ情報収集に余念がないと思います。 バックグラウンドでビルドしているのをただ待ってるのもなんなので、ちょっとの間だけFacebookやTwitter覗きますよね。 私もついFacebookやTwitterが捗ってしまい、とっくにビルド終わってるのになかなか開発に戻ってこれないことが何度もありました。
そんな問題を解決するためにnotifier-pluginを導入しています。
tomorrowkey/notifier-plugin
https://github.com/tomorrowkey/notifier-plugin
このpluginをgradleに導入するとビルドやテストが終わった時に、Notificationに通知を表示したりsay
コマンドで音声でビルド完了を教えてくれます。
設定次第ではmp3ファイルやwavなど再生することもできるので、好きな効果音に変えることもできます。
これで安心して情報収集に集中できますね。
おわりに
Androidアプリを素早く開発するためのコマンドラインスクリプトを10個紹介しました。
ただコマンドをそのまま使うのではなく、より便利に使えるスクリプトを書くと開発はずっと楽になります。
便利なスクリプトを活用して快適な開発環境を整え、爆速でAndroidアプリを開発しましょう!