inFablic | Fablic, inc. Developer's Blog.

フリマアプリ フリル (FRIL) を運営する Fablic の公式開発者ブログです。Fablic のデザイナー・エンジニア・ディレクターが情報発信していきます。

Google I/O 2016 セッションまとめ ①: What's New in Android development tools

初めまして。 Androidエンジニアの黒川(@hydrakecat)です。 皆さん、Google I/O 2016のキャッチアップはできているでしょうか?今年はすべてのセッションが動画で公開されましたが、Android 関連だけでも 60 本近くもあり、すべて観るのは大変です。

キーノートについては先日公開された中村の記事に譲ることにして、この記事および続くいくつかの記事では、実際に I/O に参加して気になった Android 関連のセッションを、開発者の観点からまとめていきたいと思います。

What's New in Android development tools

さて、初回は What's New in Android development tools です。このセッションでは、Android Studio チームのメンバーが I/O のタイミングで公開された Android Studio 2.2 Preview の新機能について解説しています。なお、Android Developers Blog の記事も公開されているので、併せて読むことをおすすめします。以降で説明する機能は 2.2 でのみ使える機能なので、まだ入れていない方はぜひインストールして触ってみてください。

Android Studio 2.2 Preview

冒頭で、2016 年の Android Studio の動向のおさらいがあります。2.0 では Instant Run を含むスピードの改善とエミュレータの進化が目玉でした。続く 2.1 では N Developer Preview の発表と歩調を合わせ、Java 8 Support を含む Jack and Jill のビルドが入りました。

今回の 2.2 では下記の4つにフォーカスしています。

  • Design
  • Develop
  • Build
  • Test

それでは、それぞれのトピックについて見てみましょう。

Design

Product Manager の Jamal から Layout Editor の説明があります。Layout Editor は従来のプレビュー画面が進化した形で提供されています。この Layout Editor の狙いは、XML の編集なしに画面をデザインできるようにすることだと述べられます。私たち開発者は日常的に XML を編集していますが、慣れていない人にとっては依然として敷居が高く、またどのようなレイアウトになるか分かりにくいという問題があります。XML の編集という手段は残しつつ、XML の編集に慣れていない人にも簡単に Andorid アプリの画面デザインが作れるようにすることが目的のようです。

Layout Editor というのは多少誤解を招く言い方で、レイアウト以外の編集もできるパワフルなものになっています。たとえば従来はプレビューすらなかった menu リソースや Preference も GUI で編集やプレビューが出来るようになりました。また、些細な改善ですが、ScrollView を Layout Editro 内でスクロールすることも可能になったようです。Tor がデモ中にこれに触れた際には、会場から大きな拍手が湧いており、開発者から待ち望まれていた機能であることがわかります。

各部品のプロパティも従来は設定可能な項目がすべて表示されていたところを、よく使われるもののみ表示し、残りはデフォルトで隠れるようになりました。また、各部品間の関係を見やすくするため、Blue Print と呼ばれる画面が追加されました。これによって、View の配置および関係が、把握しやすくなります。

Blue Print Sample

さらに、ConstraintLayout という新しい ViewGroup の紹介があります。この記事では詳細を述べませんが、ConstraintLayout は、簡単に言えば、いままでの RelativeLayout や LinearLayout のスーパーセットのような存在です。Jamal は「GridLayout を使うべきか RelativeLayout を使うべきかといったことに頭を悩ませずに、画面のコンテンツに意識を集中できるようにするために用意した」と述べています。View の配置の仕方はこれまでの ViewGroup と異なり、各 View 間の制約(Constraint)を GUI で指定していくような方法になっています。左揃えや真ん中揃えが簡単に出来るほか、新たな View を配置する際に自動的に制約を生成したり、現在の View の配置から制約を推測するといったことが可能になっています。これによって、従来は画面方向やサイズに対してレスポンシブな UI を作るために View や ViewGroup のプロパティの指定に気を遣う必要があったのですが、それらの軽減されるとのことです。

ConstraintLayout

他にもこの ConstraintLayout の利点としてネストが1段になることでパフォーマンスの改善が見込めるという話がありましたが、それは副次的なもので XML なしに画面をデザインできるようにすることが主眼であるように感じました。なお、既存の LinearLayout や RelativeLayout から自動的に ConstraintLayout に変換する機能も用意されているのですが、この記事によるとまだ不安定なようです。

さらっと流されていたものの個人的に嬉しかった機能は、Layout Inspector です。これは、端末の画面をキャプチャしてレイアウト情報を表示するというものですが、以前の Android Device Monitor に組込まれていた View Hierarchy のダンプと異なり、Android Studio に統合され、Visibility などのプロパティも表示されます。ビューのデバッグでは威力を発揮するでしょう。

Layout Inspector Layout Inspector

Develop

次は、コーディング支援の機能についてです。今回の I/O では Firebase 関係のセッションが多く、とくにいままで通知に使われていた GCM (Google Cloud Messaging) が FCM (Firebase Cloud Messaging) によって置き換えられるという話は Android 開発者にとってかなりのインパクトがありました。2.2 では Firebase プラグインが導入され、 Tools > Firebase を選ぶと Firebase の機能を利用するためのガイドが表示されます。Firebase プロジェクトの作成やアプリケーションの登録など、このウィンドウからボタン1つで出来るのは便利です。

Firebase Plugin

また、サンプルコードを閲覧する機能が入りました。たとえば、JobScheduler の使い方を知りたい場合は、 JobScheduler クラスを右クリックして Find Sample Code をクリックすると、以下のように関連するサンプルコードを表示することができます。Android Developers に該当するページがある場合はそこへジャンプすることも出来ます。

Find Sample Code

従来のコード分析機能、つまり Lint も大幅に強化されています。デモでは Context クラスの変数に対して static 参照を持っている場合に警告を表示するというデモを行っていました。また、サポートアノテーションも大幅に強化されたようです。たとえば ProGuard をかけた際に消去しないことをマークする @Keep アノテーションなどが追加されました。また Infer Annotations という機能が追加され、指定可能なサポートアノテーションの一覧を検出可能になりました。アノテーションを付加できる箇所を見つけ出し、適切に付加することで、さらに精度の高い Lint が可能になるので積極的に利用しましょう。

Infer Annotations

デモの中で興味深かった機能として、まだ開発途中という断り書きが付いていましたが、ランタイムパーミッション対応のコードを自動生成する機能がありました。パーミッションが必要なコードを選択し、 Refactor > Convert to Android System Permissions を選択すると必要なコードが自動生成されるというものです。どうやら 2.2 Preview 1 には入っていないようですが、将来のアップデートで利用可能になるのが楽しみです。

Build

Jamal が Android Studio がどのようにビルドの高速化に取り組んできたかを話します。2.0 からあった Instant Run ですが、コードのスワップを Hot/Warm/Cold Swap に分け、それぞれ最小のビルドで変更が反映されるように工夫していました。ユーザーから寄せられた Android Studio の使用状況の統計から Hot Swap では 4~5 秒で変更が反映されるようになった一方で、思いの外 Cold Swap が多かったとのことです。これはリソースを変更した際に ID のリナンバリングが発生して、結果として Cold Swap が起きていたことが原因であることを突き止めました。そのため、2.2 では AAPT に変更を加え、リソース変更時でも既存のリソースの ID は変更されないようにしたそうです。また、APK 内の dex ファイルを 10 ~ 11 のファイルに分割し、必要なファイルだけ更新することでビルドを高速化しています。

ビルド周りでは、これまで Gradle ファイルと IDE の連携が弱かったところを強化したようです。Gradle のパーサーは書き直したそうで 2.2 からは Project Structure 画面でモジュールの依存関係や新しいバージョンの有無の確認、Gradle ファイル内の変数などを編集できるようになりました(ただし、 Preferences > Build, Execution, Deployment > Gradle > ExperimentalUse new 'Project Structure' dialog' をオンにする必要があります)。

Jack 周りでは Java アノテーションのサポートが大きいでしょう。ブログ記事にあるとおり、下記のようにアノテーションプロセッサを指定すると動くことが確認できます。実際に生成されたクラスを見たい場合は後述の APK Analyzer を使いましょう。classes.dex の中に生成されたクラスが入っているはずです。

android {
    ...
    defaultConfig {
        ...
        jackOptions {
            enabled true
        }
    }
}

dependencies {
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.0.1'
}

C++ サポートも引き続き改善されています。2.2 から CMake と NDK Build が Android Studio 内で Gradle と連携して動くようになりました。これによって Java コードと同時にデバッグすることが可能になりました。

デモで見て便利そうと思った機能として Android Manifest Merger のビューアーがあります。これまで、Android Manifest のマージでどのような処理が施されるか確認するのは至難でしたが、2.2 からは AndroidManifest.xml の画面に Merged Manifest というタブが追加されました。これによって、プラグインなどによって、どのような AndroidManifest.xml が生成されるか分かりやすくなります。Manifest の merge では、しばしばデバッグが困難な不具合が起きていたので、ありがたい機能追加です。

Merged Manifest

Test

テストで、1つ目の目玉は Espresso Test Recorder でしょう。実際に動いているところは YouTube で見ていただくとして、機能としてはエミュレータ上で行った操作をそのまま Espresso を使った Java のテストケースとして出力できるというものです。デモでは assertion も View の内容をベースに簡単に追加できるところが示され、簡単なテストケースを書く際は便利そうに思いました。テストを実際に実行する環境も実機やエミュレータ以外に Google Cloud Test Lab で実行することも可能となっています。

Espresso Test Runner

もう1つの大きな目玉は APK Analyzer です。生成された APK 内でのメソッドカウントやレファレンス数を確認することで 64K メソッド問題を回避しやすくなっています。またリソースファイルのサイズも確認できるので APK ファイルサイズを小さくしたい場合にも役に立つでしょう。Refactor > Remove Unused Resources... も役に立つかもしれません。

APK Analyzer

まとめ

この記事では、I/O のセッションの What's New in Android development tools のまとめを行いました。

様々な機能が紹介されていますが、今年に入ってからの Android Studio の進化には目を瞠るものがあります。Google が開発環境の改善をいかに重視しているかが伝わってくる内容だったと思います。まだ Preview 版ということで動作が不安定なところもありますが、ここに紹介した機能のいくつか、特に ConstraintLayout や Jack については、今後さらに主流になるのではないかと感じました。時間のあるときに触っておくことで、早めに把握しておくと良いと思います。