Unyablog.

のにれんのブログ

Android Studio 2.0 preview で Instant Run を使ったら最高だった

この記事は KMC アドベントカレンダー 1日目 の記事です。

さて、先日 Android Dev SummitAndroid Studio 2.0 (以下 AS 2.0) が発表されましたね。この会自体は結構前から告知されていたのですがまさかこんな機能が来るとは思っていませんでした。

Android Developers Blog: Android Studio 2.0 Preview

目玉機能は 'Instant Run' というもので、デバッグ中コードを書き換えた時に差分を高速にビルドし、 再インストール・Activityを再起動せずとも アプリのコードを変えられるというものです*1。実際にそんなことがありえるのか...?と疑いたくなりますが、動画も上がっているし正しそう。

これは自分で試してみるしかない!ということで試してみた話です。

Android Studio 2.0 preview をインストール

今使っているのをアップデートする場合

AS 2.0 は現在 Canary Channel にて提供されています。設定の Appearance & Behavior -> System Settings -> Updates から Automatically check updates forCanary Channel にするとアップデートできます。

f:id:nonylene:20151127193516p:plain

Canary Channel は毎週アップデートが降ってくるようなチャンネルで、不安定なのが降ってきたりもするので、「せめて Beta とかじゃないと困る!」って人は古いバージョンと同居させましょう。

安定版と同居させる場合

このページからダウンロードできます。

http://tools.android.com/download/studio/builds/2-0-preview

適当に解凍してそれっぽい場所におくといいです。

ただ、違うバージョン同士で同じプロジェクトを弄っているとコンフリクトして良くないことが起きるので、プロジェクトをコピーするか新しいプロジェクトを作るかしたほうが良いと思います。

プロジェクトを Instant Run に対応させる

公式の Instant Run のページは以下です。

設定に Build, Execution, ~ -> Instant Run という項目が出現しているはずなので、そこの Update Project をクリックすると AS が自動で対応させてくれます。

f:id:nonylene:20151127194620p:plain

変更点は以下の通りでした。

app/build.gradle 
-    buildToolsVersion "23.0.1"
+    buildToolsVersion '23.0.2'

build.gradle
-        classpath 'com.android.tools.build:gradle:1.3.1'
+        classpath 'com.android.tools.build:gradle:2.0.0-alpha1'

gradle/wrapper/gradle-wrapper.properties
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip

update versions for instant run · nonylene/PhotoLinkViewer@4889f75 · GitHub

いろいろバージョンを上げたみたいですね*2*3。特に gradle plugin の 2.0.0-alpha1 を使っているところが注目です。

この後再ビルドすると、Instant Run が利用できるようになります。

※AS 2.0 で新しく作ったプロジェクトは Instant Run に対応しているのでこの操作は不要です。

Instant Run を試してみる

準備が整ったので Instant Run を行います。デバッグを開始すると、 AS の Run のアイコンに雷っぽいアイコンがつきます。

f:id:nonylene:20151127222135p:plain

このアイコンが付いている場合、Instant Run が有効なようです。

手始めに設定画面に使っている xml の文字列を変更してみます。

f:id:nonylene:20151127223432p:plain:w300

  • 変化後

f:id:nonylene:20151127223447p:plain:w300

見てみると確かに文字列が変化しているのが分かります。

文字列のリソースを変更した時は一旦 Activity が再起動し、その旨のメッセージが出ました(もちろん再インストールは行われていません)。

ここでビルド時間を見てみると...

f:id:nonylene:20151127223629p:plain

なんと2秒!!!!めっっちゃ早い!!!普段では20秒ぐらいかかってコンパイルし、さらに再インストールが行われるので時間がかかるのでこの差は大きい。

いろんなコードで試してみる

static な領域

先ほどのページを見ると static メソッドが supported と書かれています。

static なメソッドに

System.out.println("hello!");

を加えてみました。

f:id:nonylene:20151127233019p:plain

そして Instant Run すると...

f:id:nonylene:20151127224033p:plain:w300

Activity が再起動することなくコードが変化しました。これはすごい!!

実際に hello とコンソールに出ています。

f:id:nonylene:20151128004402p:plain

f:id:nonylene:20151127224146p:plain

設定で毎回 Activity を Restart させることも可能みたいです。

static じゃない領域

static じゃないメソッドの内部を変更して試してみました。

f:id:nonylene:20151128002355p:plain

この時もちゃんと表示してくれました。

restart しないと呼ばれないような場所を変更する

Activity から Fragment を呼び出す場所をコメントアウトしてみました。

f:id:nonylene:20151127234914p:plain

この時 Activity の restart は行われませんでしたが、Fragment が消失することもありませんでした。まあそりゃそうだって感じですね。

Activity を再起動するとちゃんと消失してくれました。

大幅に書き換えてみる

せっかくなので Fragment を一気に消してみました。

f:id:nonylene:20151127235532p:plain

それでもちゃんと Instant Run は動作してくれましたし、内部のコードも変わっていました。

メンバ変数を変えてみる

クラスにメンバ変数を加え、それを変化させてみます。

f:id:nonylene:20151127235634p:plain

すると...Instant Run 終わっても変化しない!!! マジか~と思いながら Activity を restart すると変更が反映されました。どうやら毎回 restart したほうがよさ気かも。

Kotlin で書いた場所

残念ながら Kotlin で書いた場所は Instant Run にはならず毎回フルビルドしていました。まあ仕方ないですね...(早く公式対応してくれ~~~~!!!!!)

その他

  • Kotlin のバージョンを beta-2433 にあげてみたところ、 Instant Run にはなるけど実際の挙動は変わっていない という悲しい事態になりました(beta-1033 では正常に動いていました)。つらい。

    downgrade kotlin · nonylene/PhotoLinkViewer@ba0f659 · GitHub

    • 追記:(2016-02-01)最新では直ってます。
  • それなりの頻度で毎回フルビルドするようになってしまう時があり、AS を再起動したら直りました。*4

    • 追記:(2016-02-01)これも最近は見なくなりました。

Android Studio 2.0 のその他の新機能

ビルドの高速化

Instant Run 以外にも全体的にビルドが早くなりました。再インストールしなきゃいけない時でもビルド自体は 8 秒ぐらいで終わります。多分差分ビルドがなされているからですが、普通に嬉しい。

起動中のアプリを後からデバッグ -> 昔からありました

デバッグブレークポイントで止めたりステップ実行的な方です)する時、今まではデバッグボタンを押してからビルドして起動させないといけませんでしたが、AS 2.0 では 起動中のアプリをデバッグできるように なりました!!!

と思ってたのですが昔からできてたらしい!マジか!!!

f:id:nonylene:20151128001240p:plain

これは通常の Run しているときの状態ですが、上の画像の右から二番目をクリックするとデバッグするプロセスの選択画面が現れます(たぶんデバッグビルドのみ?)

f:id:nonylene:20151128001428p:plain

選択するとデバッガが立ち上がり普段通りデバッグすることができます。

ちなみに一旦ケーブルを挿しなおしてもデバッグできました。最高ですね。

インクリメンタルサーチ

検索ダイアログに Preview というタブが表示されインクリメンタルサーチ(打ちながら検索結果が現れる)できるようになりました。便利。

f:id:nonylene:20151128001955p:plain

安定性

Canary Channel ということで落ちるかなーと思ったりしたのですがそんなことはなく、常に AS は安定していました。その点で困ることはなさそうです。

感想

最近は kotlin を使っているので kotlin の場所では使えないのは残念でしたが、機能自体はすごく便利だと思います。ビルドに1分以上かかるプロジェクトを弄ってたりするのでだいぶ助かりそう。まだ不安な場所はありますが*5、これからに大いに期待したいところです。

また、これらの他にもいろんな改善点(エミュレーターの高速化など)があっていい感じです。安定版がリリースされるまで期待しましょう!

この記事はKMCアドベントカレンダー1日目の記事です

さて、明日は utgwkk (id:utgwkk) さんです!!

他の記事は以下をご覧ください!

*1:Android 4.0 以上で使えるらしいです

*2:buildTools が上がったせいで CircleCI が落ちるようになりました...

*3: - echo y | android update sdk --no-ui --all --filter "build-tools-23.0.2" を加えるとできました(2016-02-01 追記)

*4:その時はイベントログに接続が切れたというエラーメッセージが出ます

*5:Instant Run が動作したように見せて結局内部のコード変化してなかったりするのはけっこうつらいので...