この記事は KMC アドベントカレンダー 1日目 の記事です。
さて、先日 Android Dev Summit で Android 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 for
を Canary Channel
にするとアップデートできます。
Canary Channel は毎週アップデートが降ってくるようなチャンネルで、不安定なのが降ってきたりもするので、「せめて Beta とかじゃないと困る!」って人は古いバージョンと同居させましょう。
安定版と同居させる場合
このページからダウンロードできます。
http://tools.android.com/download/studio/builds/2-0-preview
適当に解凍してそれっぽい場所におくといいです。
ただ、違うバージョン同士で同じプロジェクトを弄っているとコンフリクトして良くないことが起きるので、プロジェクトをコピーするか新しいプロジェクトを作るかしたほうが良いと思います。
プロジェクトを Instant Run に対応させる
公式の Instant Run のページは以下です。
設定に Build, Execution, ~
-> Instant Run
という項目が出現しているはずなので、そこの Update Project
をクリックすると AS が自動で対応させてくれます。
変更点は以下の通りでした。
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 のアイコンに雷っぽいアイコンがつきます。
このアイコンが付いている場合、Instant Run が有効なようです。
手始めに設定画面に使っている xml の文字列を変更してみます。
- 元
- 変化後
見てみると確かに文字列が変化しているのが分かります。
文字列のリソースを変更した時は一旦 Activity
が再起動し、その旨のメッセージが出ました(もちろん再インストールは行われていません)。
ここでビルド時間を見てみると...
なんと2秒!!!!めっっちゃ早い!!!普段では20秒ぐらいかかってコンパイルし、さらに再インストールが行われるので時間がかかるのでこの差は大きい。
いろんなコードで試してみる
static な領域
先ほどのページを見ると static
メソッドが supported と書かれています。
static
なメソッドに
System.out.println("hello!");
を加えてみました。
そして Instant Run すると...
Activity が再起動することなくコードが変化しました。これはすごい!!
実際に hello とコンソールに出ています。
設定で毎回 Activity を Restart させることも可能みたいです。
static じゃない領域
static
じゃないメソッドの内部を変更して試してみました。
この時もちゃんと表示してくれました。
restart しないと呼ばれないような場所を変更する
Activity
から Fragment
を呼び出す場所をコメントアウトしてみました。
この時 Activity
の restart は行われませんでしたが、Fragment
が消失することもありませんでした。まあそりゃそうだって感じですね。
Activity
を再起動するとちゃんと消失してくれました。
大幅に書き換えてみる
せっかくなので Fragment
を一気に消してみました。
それでもちゃんと Instant Run は動作してくれましたし、内部のコードも変わっていました。
メンバ変数を変えてみる
クラスにメンバ変数を加え、それを変化させてみます。
すると...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 では 起動中のアプリをデバッグできるように なりました!!!
と思ってたのですが昔からできてたらしい!マジか!!!
これは通常の Run しているときの状態ですが、上の画像の右から二番目をクリックするとデバッグするプロセスの選択画面が現れます(たぶんデバッグビルドのみ?)
選択するとデバッガが立ち上がり普段通りデバッグすることができます。
ちなみに一旦ケーブルを挿しなおしてもデバッグできました。最高ですね。
インクリメンタルサーチ
検索ダイアログに Preview
というタブが表示されインクリメンタルサーチ(打ちながら検索結果が現れる)できるようになりました。便利。
安定性
Canary Channel ということで落ちるかなーと思ったりしたのですがそんなことはなく、常に AS は安定していました。その点で困ることはなさそうです。
感想
最近は kotlin を使っているので kotlin の場所では使えないのは残念でしたが、機能自体はすごく便利だと思います。ビルドに1分以上かかるプロジェクトを弄ってたりするのでだいぶ助かりそう。まだ不安な場所はありますが*5、これからに大いに期待したいところです。
また、これらの他にもいろんな改善点(エミュレーターの高速化など)があっていい感じです。安定版がリリースされるまで期待しましょう!
この記事はKMCアドベントカレンダー1日目の記事です
さて、明日は utgwkk (id:utgwkk) さんです!!
他の記事は以下をご覧ください!