Android開発を爆速にする10のコマンドラインスクリプト

モバイルファースト室の山下( @tomorrowkey )です。
みなさんはAndroidアプリをビルドするときに AndroidStudioの実行ボタンを押すのと、ターミナルでgradleコマンドを実行するのと、どちらを使っていますか。
クックパッド社内のAndroidエンジニアでもどちらを使うか好みが分かれるのですが、私はたいていターミナルでgradleコマンドを使っています。
AndroidStudioの実行ボタンだとビルドを途中で中止できないことがあるからです。コマンドであればcontrol+cでいつでも中止できるという気軽さからコマンドを好んで使用しています。
開発するうえでIDEなどのGUIツールはとても便利なのですが、実はコマンドを実行する方がはるかに早くストレスなく開発を進めることができることがあります。
今回は私が実際に使っている便利なコマンドラインスクリプトを10個紹介します。

注意

今回紹介するコマンドラインスクリプトのほとんどはOSXでしか動作しません。
Linuxでもほとんどは動くはずですが、動作検証していないため分かりません。
Windowsのみなさんごめんなさい。そのままでは動きません。 スクリプトを読み替えてバッチファイルを作れば動く可能性があります。

目次

  1. adbコマンドの実行時にデバイスを選択する
  2. logcatを見やすく表示する
  3. adbをコマンド1つで再起動する
  4. デバイスにインストールされているアプリをアンインストールする
  5. 深いフォルダにあるapkファイルをインストールする
  6. スクリーンショットを撮影する
  7. gradleコマンドを補完する
  8. adbコマンドを補完する
  9. genymotionを素早く起動する
  10. ビルドが終わったら音を鳴らす

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ですが

f:id:tomorrowkey:20141217174923p:plain

pidcatを使うとカラフルに見やすく表示されます。

f:id:tomorrowkey:20141217174936p:plain

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からアプリをアンインストールできるコマンドがあるので、組み合わせてターミナルからアプリをアンインストールできるようにしました。

f:id:tomorrowkey:20141217174959g:plain

深いフォルダにある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と打てば楽にインストールできるようになりました。

f:id:tomorrowkey:20141217175026g:plain

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

f:id:tomorrowkey:20141217175104g:plain

adbコマンドを補完する

completionを使ってgradleが補完されるようになりました。
あまりコマンドの数は多くありませんが、adb向けにもcompletionが作られており、gradle同様補完することができます。

mbrubeck/android-completion
https://github.com/mbrubeck/android-completion

android-completionはコマンドの補完は当たり前ですが、特定のデバイスを指定する-sオプションも補完してくれます。

f:id:tomorrowkey:20141217175127g:plain

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のエミュレータだけ絞り込むことができます。

f:id:tomorrowkey:20141217183124g:plain

ビルドが終わったら音を鳴らす

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アプリを開発しましょう!

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/