この記事は Jamal Eason (Product Manager, Android) による Android Developers Blog の記事 "Android Studio 3.5 Beta" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。



Android Studio 3.5 ベータ版のダウンロード提供を開始しました。昨年の Google I/O では、多くの方から「機能だけでなく品質や安定性にも力を入れて欲しい」とのご意見をいただきました。そこで Android Studio チームでは、Project Marble を立ち上げ、統合開発環境(IDE)の基本的な機能とフローを集中的に強化することにしました。その最終的な成果が Android Studio 3.5 です。重点的に取り組んだのは、システムの健全性、機能の改良、バグの修正の 3 つの領域です。今回のベータ版で皆様から最終的なフィードバックをいただき、重要な点が抜け落ちていないか確認したいと考えています。ぜひ Android Studio 3.5 ベータ版をダウンロードして、忌憚ないご意見をお聞かせください。

しかしながら、品質面での変更は実際に目で見ることが難しい部分でもあります。そこで、本投稿と Google I/O セッション「Android 開発ツールの最新情報」で、Project Marble で Android Studio 3.5 にどのような変更を加えたかについて重点領域ごとに解説することにしました。Android Studio の品質改善はこれで終わりではありませんが、今回の取り組みや新たなインフラストラクチャの導入が長期的な品質改善をもたらし、Android アプリ開発のさらなる効率化につながるものと考えています。


Android 開発ツールの最新情報(Google I/O'19)

システムの健全性 - メモリ

Android Studio に関するフィードバックで多かった指摘の 1 つが、時間の経過とともに IDE の動作が遅くなる点です。多くの場合、原因として考えられるのは、想定外のメモリのひっ迫か IDE のメモリリークです。Project Marble の一環としてこの点について詳しく調査し、影響の大きい 33 のメモリリークの解決に取り組むことにしました。リークを特定するため、使用統計情報を共有していただいている内部ダッシュボードで継続的にメモリ不足例外を記録し、影響の大きいリークから優先的に解決しています。Android Studio 3.5 以降では、IDE でメモリ不足が発生した場合に、メモリヒープのサイズや、何がヒープを専有しているかについての高水準な統計情報を取得します。これらのデータに基づいて、以下に示す「メモリ設定の自動推奨」と「より詳細なメモリ分析の提供」を実現しました。
  • メモリ設定の自動推奨 - Android Studio のデフォルトの最大メモリヒープ サイズは 1.2 GB です。大きなプロジェクトになると、このサイズでは不足することも考えられます。お使いのマシンの RAM 容量がどれだけ大きくても、IDE のメモリヒープがこの値を超えることはありませんでした。Android Studio 3.5 では、マシンの RAM 容量が大きく、アプリ プロジェクトがさらにメモリを必要としている場合、IDE がそのことを認識してメモリヒープ サイズを大きくするよう推奨してくれます。この通知が届いていなくても、新しくなった設定パネルの [Appearance & Behavior] → [Memory Settings] でヒープサイズを調整できます。
メモリ設定
  • より詳細なメモリ分析の提供 - メモリの問題を特定し、それを再現して Android Studio チームに報告するのは大変です。そこで Android Studio 3.5 では、メモリヒープのダンプを手動で取得できるようにしました([Help] → [Analyze Memory Use])。IDE がこのダンプから個人データを削除し、分析し、レポートを作成してくれます。このメモリ使用状況レポートを Android Studio チームにお送りいただくことで、パフォーマンスの問題のトラブルシューティングを実施できます。
メモリ使用状況レポート


システムの健全性 - 例外

Android Studio チームによる例外の処理フローも見直しました。収集した使用統計情報に基づいて一般的な例外が発生する前の兆候を特定し、これまでより早い段階(canary 版)で問題を優先付けして修正するようにしました。さらに、使用統計情報の分析データやクラッシュ レポートを活用して効率的に対処できるようになり、ユーザーに例外を通知する回数を減らすことができました。結果として、IDE 下部のステータスバーの赤い例外通知アイコンが点滅することが少なくなるはずです。
Android Studio の例外通知アイコン


システムの健全性 - ユーザー インターフェースの停止

ユーザー インターフェース(UI)が停止するという報告も届いています。Android Studio 3.5 では、基底の Intellij プラットフォームのインフラストラクチャを拡張し、UI スレッドの停止が少しでも長く続いたときは記録するようにしました。これを継続することで、問題の全体像を把握でき、どこに注力すべきかがはっきりするはずです。たとえば、Project Marble で収集したデータを分析したところ、IDE での XML コードの編集にかなり時間がかかっていることがわかりました。そこで XML の入力処理を最適化したところ、Android Studio 3.5 のパフォーマンスが大幅に改善しました。次の XML コード編集のアニメーションを見ると、入力の待ち時間が短縮されて快適に編集できるようになっていることがわかります。


改善前のコード編集 - Android Studio 3.4(上)と改善後のコード編集 - Android Studio 3.5(下)


システムの健全性 - ビルド速度


ビルド速度の向上にも継続的に取り組んでいます。ビルド速度は、プロジェクトが大きくなればなるほど重要になってきます。最近の Medium のブログ投稿でビルド速度について解説したとおり、ビルドのパフォーマンスに影響する要素は多く、ある要素を改善しても別の要素の影響で今まで以上に遅くなってしまうこともあります。しかし Project Marble では、Glide、AndroidX データ バインディング、Dagger、Realm、Kotlin(KAPT)などの主要なアノテーション プロセッサを対象に新たにインクリメンタル ビルドをサポートすることで、ビルド速度を大幅に改善することができました。たとえば、予備分析の段階で Kotlin のみを対象にインクリメンタル ビルドをサポートしたところ、Google I/O スケジュール アプリのサブモジュールの非 ABI コードの変更が 9.1 秒から 3.6 秒へと 60% も短縮されました。ビルドシステムのパフォーマンスの改善について詳しくはこちらをご覧ください。

システムの健全性 - IDE の速度

これまでも上級者向けの手段として利用されていたのが、Android Studio プラグイン(たとえば Android NDK サポート)を無効にしてパフォーマンスを改善する方法です。プラグインを無効にすることで、不要なメニューやオプションを削除できるだけでなく、IDE 全体の速度に影響する Android NDK サポートのパフォーマンス ホットスポットを削除できます。

システムの健全性 - Lint によるコード分析

Android Studio のコード分析フレームワーク Android Lint を使用すると、プログラミングの一般的な間違いを特定できます。しかし、特に大きなプロジェクトでバッチ分析を実行するときなどは、Lint の処理にかなり時間がかかるとの報告が寄せられていました。調査の結果、大きなメモリリークがいくつか見つかり、これらを修正したことで Lint のパフォーマンスが 2 倍近くまで向上しました。また、個別の Lint チェックのボトルネックを特定するためのプロファイリング ツールも公開しました。Lint の分析パフォーマンスとプロファイリング ツールについて詳しくは、こちらをご覧ください。

システムの健全性 - Windows の I/O ファイルへのアクセス

Android Studio ユーザーの多くが Microsoft Windows を使用していますが、このところ Windows でのビルドやインストールの速度が遅くなってきたとの報告が増えています。この問題について調査したところ、Android Studio のビルド ディレクトリやインストール ディレクトリが、最近のウィルス対策プログラムにおいてアクティブ スキャンの対象になっていることがわかりました。これらのディレクトリでは、時間の経過とともに小さなファイルが大量に作成および削除されるため、I/O や CPU に部分的な負荷がかかり、Android Studio 全体のビルドや同期に影響を及ぼしていました。
Google 内部データ、2.2 GHz クアッドコア Intel Core i7、2019 年 4 月
  • システムの健全性チェック - Android Studio 3.5 以降では、パフォーマンスに影響しそうなウィルスチェックの対象ディレクトリ(たとえばプロジェクトのビルド ディレクトリ)を IDE が確認し、ウィルス対策の除外ディレクトリのリストと照合します。不一致が見つかるとポップアップが表示され、指示に沿って最適な設定に変更できます。詳細についてはこちらをご覧ください。
システムの健全性に関する通知 - ウィルス チェック

システムの健全性 - エミュレータの CPU 使用状況

エミュレータのパフォーマンスはここ数年で劇的に向上し、迅速なアプリ開発に大きく寄与しています。しかし、Android エミュレータが CPU サイクルを過度に使用し、バックグラウンドでアイドル状態になっているにもかかわらず、ノートパソコンの冷却ファンが回転し始めることがあるとの報告が届いています。調査の結果、電池のデフォルト動作が放電ではなく AC 充電に設定されていたために、Google Play 開発者サービスとその関連サービスがバックグラウンドでアクティブに動作していたことがわかりました。デフォルトを放電に変更したことで、バックグラウンドでの CPU 使用量が 3 分の 1 以下になりました。Project Marble では、これ以外にも Android エミュレータにさまざまな最適化を行いました。Android エミュレータと Project Marble の詳細についてはこちらをご覧ください。
Google 内部データ、Apple MacBook Pro(15 インチ、2016 年)、エミュレータ: Pixel 3 API 28

機能の改良 - 変更適用機能

アプリ開発でコードを少し編集した場合に、アプリを再起動することなくその結果を見ることができたら便利です。そのための試みとして 2 年前に Instant Run を導入しましたが、結果は思わしくありませんでした。Project Marble ではより実践的な方法でゼロから再構築し、変更適用機能として Android Studio 3.5 に実装しました。今回は、Android Oreo 以降のプラットフォーム固有の API を使用して、信頼性の高い安定した動作を実現しています。Instant Run と違い、APK を修正することはありません。変更適用機能をサポートするために、デプロイメント パイプラインをゼロから再構築して速度を向上するとともに、実行ボタンやデプロイメント ツールバー ボタンを工夫して使いやすくしました。変更適用機能のアーキテクチャについて詳しくはこちらをご覧ください。
変更適用ボタン

機能の改良 - Gradle の同期

Android Studio で最近問題になっているのが、アプリコードに突然表示される赤色の記号です。特にプロジェクトを開き直したときに表示されることが多いようです。Gradle ビルドシステムでは、すべての依存関係のキャッシュをホーム ディレクトリに保持し、アーティファクトをダウンロードし直さなくても同期できるようにしています。最近になって赤色の記号が表示されるようになった原因は、Gradle がこれらのキャッシュを定期的に削除して、ハードドライブの容量を節約するようになったためです。IDE 側でこの変更を認識していなかったため、依存関係が見つからず赤色の記号が表示されていました。Android Studio 3.5 以降では、条件付きのロジックでこの状態をチェックするようにしました。この領域では他にもさまざまな取り組みを進めていますが、Project Marble でプロジェクトの同期の問題にどのように取り組んでいるかを示す一例として紹介しました。

機能の改良 - プロジェクトのアップグレード

Android Studio チームとして理想を言えば、最新の機能を備え、バグが修正され、パフォーマンスが改善された最新バージョンの IDE をすべての方にご利用いただきたいと考えています。しかし、たとえば Gradle プラグインのエラーのようにさまざまな問題があり、常に Android Studio をスムーズにアップグレードできるとは限りません。そこで Android Studio 3.5 では、実際にアップグレードが必要になったときに出力ウィンドウ、ポップアップ、ダイアログ ボックスで知らせるようにしたほか、アップグレードの同期やビルドに関わるエラーに対処しやすくしました。
最近実施したアンケートによると、多くのデベロッパーが Android Studio IDE と Gradle プラグインを同時にアップグレードしていますが、最近のリリースでは IDE と Gradle プラグインを別々に更新できるようになっています。つまり、速度や正確さが向上した最新のビルドシステムが必要な場合は Gradle プラグインをアップグレードできますし、その必要がなければしばらく待っても構わないということです。Project Marble でさまざまな改善を加えておりますので、Gradle プラグインを同時に更新するかどうかに関係なく、最新リリースの Android Studio 3.5 にアップグレードすることをおすすめします。

機能の改良 - レイアウト エディタ

ユーザー調査やフィードバックにより、レイアウト エディタにはパフォーマンスやユーザビリティの問題がいくつかあることがわかりました。特に ConstraintLayout を使用する場合など、XML を直接編集するしかない場面もあるようです。エラーの原因ともなりかねないユーザビリティの問題を解消するため、制約の選択や削除からデバイス プレビューのサイズ変更まで、レイアウト エディタの操作性を幅広く見直しました。XML コードの編集もこれまでどおり簡単に行えますが、今回の操作性の改善により Android Studio でのレイアウトの作成や編集が大幅に効率化できるはずです。レイアウト エディタの変更点について詳しくはこちらをご覧ください。


レイアウト エディタの改良前 - Android Studio 3.4(上)と改良後 - Android Studio 3.5(下)

機能の改良 - データ バインディング

Project Marble では、長年の懸案であるデータ バインディングについても再検討しました。パフォーマンスの面では、XML ファイル内に作成したデータ バインディング式が、コード エディタの深刻なハングにつながっていました。この問題を解決したことで、コードの補完、ナビゲーション、リファクタリングも改善しました。

機能の改良 - アプリのデプロイメント フロー

Project Marble では、デプロイメント作業を効率化するため、デプロイするデバイスを簡単に変更できるプルダウンと、複数のデバイスにまとめてデプロイできるメニュー アイテムを新たに追加しました。
アプリ デプロイメント ユーザーフロー

機能の改良 - C++ の改善

C++ プロジェクトのサポートも、Project Marble の重点領域の 1 つでした。IDE で複数の Ninja ターゲットを並行して呼び出せるようになったため、CMake によるビルドを最大 25% 高速化できるようになりました。また、1 つのビルド バリアント ユーザー インターフェース パネルで、複数の ABI ターゲットを別々に指定できるようになりました。さらに Android Studio 3.5 では、build.gradle ファイル内で複数のバージョンの Android NDK を使用できるようにしました。これによりビルドの再現性を高め、NDK バージョンと Android Gradle プラグインの間の非互換性を軽減できるはずです。
ABI で 1 つのバリアントを選択

機能の改良 - Intellij プラットフォームの更新

Android Studio の今回のリリースでは、Intellij 2019.1 プラットフォーム リリースが機能面でも品質面でも拡張されています。Intellij 2019.1 には、カスタムテーマからバージョン管理システムの統合まで幅広い改善が加えられています。

機能の改良 - 動的な機能の条件付き配信のサポート

Android Studio 3.5 では、App Bundle に条件付き配信機能を追加しました。条件付き配信を使用すると、アプリのインストール時に自動的にダウンロードする動的機能モジュールを、特定のデバイス設定要件に基づいて指定できます。つまり、OpenGL のバージョン、拡張現実のサポートといったハードウェア機能や、API レベル、ユーザーの国などの条件に応じて、配信する機能を変えることができます。
条件付き配信のモジュール選択

機能の改良 - エミュレータでのフォルダブルと Pixel デバイスのサポート

Android Studio の今回のリリースでは、Android エミュレータに Pixel 3a と Pixel 3a XL 用のスキンを追加しました。また、フォルダブルの Android 仮想デバイスにも対応しました。
Android エミュレータ - フォルダブルのサポート

機能の改良 - Chrome OS のサポート

Android Studio 3.5 では、x86 ベースのハイエンド Chromebooks に搭載された Chrome OS 75 以降が公式にサポートされることになりました。Project Marble ではいくつかのユーザビリティの問題を解決し、Android デバイスに接続された外付け USB を使用して、Android Studio をインストールしたりアプリをデプロイしたりできるようになりました。Chrome OS での IDE のセットアップについて詳しくはこちらをご覧ください。

Chrome OS で動作する Android Studio

ここまでのまとめとして、Android Studio 3.5 でバグの修正や改良を進めた領域を以下に示します。

システムの健全性

  • メモリ設定
  • メモリ使用状況レポート
  • 例外の削減
  • ユーザー インターフェースの停止
  • ビルド速度
  • IDE の速度
  • Lint によるコード分析
  • I/O ファイルへのアクセス
  • エミュレータの CPU 使用状況

機能の改良

  • 変更適用機能
  • Gradle の同期
  • プロジェクトのアップグレード
  • レイアウト エディタ
  • データ バインディング
  • アプリのデプロイメント
  • C++ の改善
  • Intellij 2019.1 プラットフォームの更新
  • 動的な機能の条件付き配信のサポート
  • エミュレータでのフォルダブルと Pixel デバイスのサポート
  • Chrome OS のサポート
Project Marble で重点を置いた各領域の詳細については、Android Studio プレビュー版のリリースノートや、以下の Medium ブログ投稿をご覧ください。

使用統計情報の提供とフィードバック

Project Marble では、Android Studio のどの領域をどのような方法で最適化すべきかを、すべて皆様からのフィードバックと指標データに基づいて判断しました。Android Studio からの使用統計情報を集計し、すべてのユーザーに影響する広範な問題が発生していないかどうか調べたり、どの機能に優先的に取り組むかを判断したりするのに役立てています。Android Studio チームに有益な情報を提供していただく方法はいくつかあります。ぜひお願いしたいのが、[Preferences /Settings] → [Appearance & Behavior] → [Data Sharing] で使用統計情報を共有していただく方法です。

IDE のデータ共有

IDE のデータ共有
また、IDE 画面の右下には、常に 2 つの表情アイコンが表示されています。これらのアイコンをクリックすることで、その画面の使い勝手の良し悪しを手軽に Android Studio チームに伝えることができます。バグを見つけた場合も、ここから簡単にログを記録して送信できます。
IDE のユーザー フィードバック

スタートガイド

ダウンロード

Android Studio 3.5 ベータ版はこちらのページからダウンロードできます。Android Studio の以前のリリースを使用している場合は、そのまま最新バージョンの Android Studio に更新できます。引き続き Android Studio の安定版を使用したい場合は、安定版とベータ版を共存させて同時に使用できます。詳しくはこちらをご覧ください。

ここで説明した Android エミュレータ機能を使用する場合は、Android Studio SDK Manager でダウンロードした Android エミュレータ v29.0.6 以降を使用していることを確認してください。

Android Studio チームでは、皆様からのフィードバックをお待ちしております。気に入った機能、お困りのこと、新機能の要望など何でも結構です。バグにお気付きの際は、こちらからご報告いただけます。Android Studio 開発チームの TwitterMedium もぜひフォローしてください!

Posted by Yuichi Araki - Developer Relations Team