Android Studio Dolphin | 2021.3.1(2022 年 9 月)

Android Studio Dolphin の新機能は次のとおりです。

Compose の新機能

Android Studio の Jetpack Compose の新機能と改善点は次のとおりです。

Compose のアニメーション調整

コンポーザブルのプレビューにアニメーションを記述している場合、アニメーション プレビューを使用して、それらをすべて一度に検査し、調整できるようになりました。特定のアニメーションを固定することもできます。

All Animations UI を使用した検査を示す GIF

Compose のマルチプレビュー アノテーション

複数のプレビュー定義を含むアノテーション クラスを定義し、その新しいアノテーションを使用してそれらのプレビューを一度に生成できるようになりました。この新しいアノテーションを使用すると、コンポーザブルごとに定義を繰り返すことなく、複数のデバイス、フォント、テーマを同時にプレビューできます。

マルチプレビュー アノテーション UI

Layout Inspector での Compose 再コンポーズ回数

Compose レイアウトをデバッグするときには、UI が正しく実装されていることを確認するために、コンポーザブルがいつ再コンポーズを行うか、または行わないかを把握することが重要です。たとえば、頻繁に再コンポーズが行われている場合、アプリが必要以上の処理を行っている可能性があります。一方、想定どおりに再コンポーズしていないコンポーネントは、予期しない動作が発生する可能性があります。

Layout Inspector を使用すると、レイアウト階層内の個々のコンポーザブルが再コンポーズまたはスキップしたタイミングを確認できるようになりました。この情報はアプリの操作中に、リアルタイムで表示されます。この機能を使用するにはまず、アプリで Compose 1.2.0-alpha03 以降を使用していることを確認します。その後、通常どおりにアプリをデプロイします。

Layout Inspector の新しいコンポジションとスキップ カウンタ

[Layout Inspector] ウィンドウを開き、アプリプロセスに接続します。[Component Tree] のレイアウト階層の横に 2 つの新しい列が表示されます。最初の列には各ノードのコンポジション回数が表示されます。2 番目の列には各ノードのスキップ回数が表示されます。[Component Tree] または [Layout Display] からコンポーザブルを選択すると、[Attributes] ペインにも同様の情報が表示されます。

カウントをリセットするには、[Component Tree] パネルの上部にある [Reset] をクリックします。カウントをリセットすることによって、アプリでの特定の操作中の再コンポジションまたはスキップを把握できます。

Layout Inspector でコンポジションとスキップ カウンタを有効にする

Wear OS エミュレータのペア設定アシスタントの更新

Android Studio Dolphin Canary 3 以降、Wear OS エミュレータのペア設定アシスタントでは、Wear エミュレータの管理と接続を容易にする機能が改善されました。これで、次のことができるようになりました。

  • デバイス マネージャーで Wear デバイスを確認する。
  • 複数の Wear デバイスを 1 台の仮想スマートフォンまたは物理スマートフォンとペア設定する。
  • 過去にペア設定したデバイスの起動時に自動的に再接続する。Android Studio は、最後のペア設定を記憶して再度ペア設定を行うようになりました。

これらの新機能を使用するには、スマートフォン エミュレータが API レベル 30 以降で、Google Play ストアがインストールされていることを確認してください。また、Wear エミュレータが API レベル 28 以降であることを確認してください。エミュレートしているデバイスの最新のシステム イメージにアップグレードするには、[Tools] > [SDK Manager] にアクセスします。

詳細については、Wear OS エミュレータのペア設定アシスタントを使用するをご覧ください。

Wear OS エミュレータ ツールバーの更新

Android Studio Dolphin Canary 2 以降、API レベル 28 以降の Wear エミュレータの場合、エミュレータ ツールバーに、デバイスの物理ボタンと一般的な操作をシミュレートするボタンが追加されました。新しいボタンは、ボタン 1 とボタン 2(ボタン 2 は API レベル 30 以降でのみ使用可能)、手のひらボタン、傾斜ボタンです。以下に、Wear エミュレータで新しいボタンを使用して行える操作をいくつか示します。

  • デバイスを「常に画面表示モード」に設定するには、手のひらボタンをクリックします。
  • デバイスを「常に画面表示モード」前の最後の画面に戻すには、傾斜ボタンをクリックします。

詳細については、エミュレータで一般的なアクションを行うをご覧ください。

Wear 固有のボタンを備えた Wear エミュレータ

新しい Wear OS 実行構成

新しい実行構成が追加され、ウォッチフェイス、タイル、ウォッチフェイスの追加機能などの Wear OS に固有のサーフェスをすばやく実行およびデバッグできるようになりました。この新しい構成は、アプリの実行時に [Run/Debug Configurations] ダイアログから作成できます。

詳しくは、Wear OS の実行 / デバッグ構成をご覧ください。

WearOS の新しい起動構成

新しい Logcat

Logcat が更新され、ログの解析、クエリ、追跡が容易になりました。

新しいフォーマッタ

Logcat では、タグやメッセージなどの有用な情報をスキャンし、警告やエラーなど、さまざまな種類のログを識別しやすくするために、ログをフォーマットするようになりました。

Logcat のログの新しいフォーマット

複数の Logcat ウィンドウを作成する

Logcat 内に複数のタブを作成できるようになりました。これにより、さまざまなデバイスやクエリを簡単に切り替えることができます。タブを右クリックすると名前を変更できます。また、タブをクリックしてドラッグすると並べ替えることもできます。

また、2 つのログセットを簡単に比較できるように、ログビューを右クリックし [Split Right] または [Split Down] を選択して、タブ内のビューを分割できるようになりました。分割を閉じるには、右クリックして [Close] を選択します。分割ごとに、固有のデバイス接続、表示オプション、クエリを設定できます。

分割を使用して複数の Logcat ウィンドウを作成する

ビュー プリセットの切り替え

Logcat では、ビューモード セレクタ をクリックすることでビューモード(StandardCompactCustom)をすばやく切り替えられるようになりました。ビューモードによって、タイムスタンプ、タグ、プロセス ID(PID)など、表示する情報の量のデフォルト設定が異なります。また、[Modify View] を選択して、それぞれのデフォルトのビューモードとカスタムのビューモードをカスタマイズすることもできます。

ビューモードの切り替えを示すスクリーンショット

以前のバージョンの Logcat では、文字列検索(正規表現をサポート)を使用するか、Logcat UI を使用してさまざまなフィールドにデータを入力して新しいフィルタを作成していました。1 つ目の方法では検索が複雑になり、2 つ目の方法ではクエリの共有と設定が困難でした。そこで、主要なクエリ フィールドから直接 Key-Value 検索を導入し、エクスペリエンスを簡素化しました。

オートコンプリートを使用した新しいクエリ構文のスクリーンショット

この新しいクエリシステムでは、正規表現に依存することなく、クエリの対象の正確さを提供します。履歴から過去のクエリを参照し、これらのクエリを他のユーザーと共有できます。さらに、引き続き正規表現を使用でき、Key-Value に基づいてログを除外することもできます。新しいクエリシステムの使用方法の例を次に示します。ただし、クエリ フィールドに入力して候補を表示することもできます。

  • ローカルアプリ プロジェクトの PID: package:mine
  • 特定の値:
    • package:<package-ID>
    • tag:<tag>
    • level:[VERBOSE | INFO | ASSERT |DEBUG | WARN | ERROR ]
  • 特定の値を除外するには、キーの前に - を付けます。
    • -tag:<exclude-tag>
  • 特定のキーで正規表現を使用するには、キーの後に ~ を置きます。
    • tag~:<regular-expression-tag>
    • 除外タグ -tag~:<exclude-regular-expression-tag> と組み合わせます。

クエリ フィールドの クエリ履歴セレクタ をクリックし、プルダウンからクエリを選択して、クエリの履歴を表示することもできます。クエリをお気に入りに追加して、すべてのスタジオ プロジェクトでリストの先頭に表示されるようにするには、クエリ フィールドの末尾にある お気に入りのクエリ をクリックします。

お気に入りが表示されたクエリ履歴のスクリーンショット

アプリのクラッシュ / 再起動をまたいでログを追跡する

新しい Logcat では、アプリのクラッシュと再起動をまたいでアプリのログを簡単に追跡できるようになりました。これにより、このようなイベントをまたいだ重要なログを見逃すことがなくなります。アプリプロセスが停止して再起動したことが Logcat によって検出されると、出力に次のような PROCESS ENDEDPROCESS STARTED などのメッセージが表示されます。

Logcat でのプロセス再起動のスクリーンショット

また、Logcat を再起動すると、タブ分割、フィルタ、表示オプションなどのセッション構成が保持されるため、セッションを容易に続行できます。

Gradle で管理されているデバイス

自動インストルメンテーション テストで Android Virtual Device を使用する際の整合性、パフォーマンス、信頼性を高めるために、Gradle で管理されているデバイスを導入します。この機能は API レベル 27 以降で利用でき、プロジェクトの Gradle ファイルで仮想テストデバイスを構成できます。この構成は、自動テスト実行時にこれらのデバイスを完全に管理(つまり、作成、デプロイ、破棄)するために、ビルドシステムによって使用されます。

この機能を使用すると、Gradle は実行中のテストだけでなく、デバイスのライフサイクルも把握できるため、テスト エクスペリエンスの品質が次の方法で改善されます。

  • テストを確実に実行するために、デバイス関連の問題に対応する
  • エミュレータ スナップショットを利用して、デバイスの起動時間とメモリ使用量を改善し、テストの合間にデバイスをクリーンな状態に戻す
  • テスト結果をキャッシュに保存し、異なる結果が得られる可能性のあるテストのみを再実行する
  • ローカルテスト実行とリモートテスト実行の間に一貫したテスト実行環境を提供する

また、Gradle で管理されているデバイスには、自動テストデバイス(ATD)と呼ばれる新しいタイプのエミュレータ デバイスが導入されています。これは、インストルメンテーション テストの実行時にパフォーマンスが向上するように最適化されています。テストのシャーディングのサポートと組み合わせることで、テストスイートを複数の ATD インスタンスに分割して試行し、テスト実行時間全体を短縮できます。Gradle で管理されているデバイスとそれに関連する機能の詳細については、Gradle で管理されているデバイスを使用したテストのスケーリングをご覧ください。

R8 が DEX 命令オフセットに基づくマッピング ファイルの使用をサポート

R8 は、行情報を最適化する際に、命令オフセットに基づいて、行テーブルを含む共有デバッグ情報オブジェクトの情報をエンコードできるようになりました。これにより、行情報のオーバーヘッドが大幅に削減されます。このため、メソッド内の行は連続しなくなりましたが、命令のサイズによっては一定の間隔でジャンプすることがあります。ツールによっては、この共有エンコードが考慮されない場合があります。

さらに、O(API レベル 26)以降の Android VM では、メソッドに行番号情報がない場合は、スタック トレースで命令オフセットを出力できます。minSdk 26 以降でコンパイルし、ソースファイル情報がない場合、R8 は行番号情報を完全に削除します。

ステートレス ラムダがシングルトンとして脱糖されない

脱糖時にステートレス ラムダがシングルトンとして割り当てられなくなりました。シングルトンとして表現すると、追加されたフィールドとクラス イニシャライザによるコードサイズ オーバーヘッドと、静的クラス初期化による起動オーバーヘッドが追加されます。ステートレス ラムダは、ステートフル ラムダ(キャプチャ付きラムダ)と同様に使用サイトで割り当てられるようになりました。

R8 が Android ランタイムの検証の遅延を回避

Android ランタイム(Dalvik と ART)のパフォーマンスの問題をなくすため、R8(D8 ではない)にライブラリ スタブが導入され、実行時には存在しない可能性のあるライブラリ クラスとメソッドのライブラリ メソッドの呼び出しの概要が表示されるようになりました。そうすることで、多くの検証の問題が解消され、ランタイムのパフォーマンスが向上します。この機能は常に有効になっています。

Java 8+ API の脱糖を使用した JDK-11 API のサポート

coreLibraryDesugar の依存関係を使用する場合、JDK-11 に基づく実装ライブラリのサポートが追加されました。詳細については、desugar_jdk_libs 変更ログをご覧ください。

パッチリリース

Android Studio Dolphin のパッチリリースを以下に示します。

Android Studio Dolphin | 2021.3.1 パッチ 1(2022 年 10 月)

パッチ 1 のリリースにより、Android Studio Dolphin は Kotlin プラグイン 1.7.20 をサポートするようになりました。このマイナー アップデートには、以下のバグ修正も含まれます。

修正された問題
Android Gradle プラグイン
Gradle を使用してインストルメンテーション Android テストを実行すると、脱糖が正しく適用されない
AGP 7.3.0 で Gradle プラットフォーム プロジェクトの Gradle 同期に問題が発生する
Dexer(D8)
DEX をマージする際の競合を解決するための公開 API を追加(bazel で重複クラスを許可)
インポート / 同期
Chipmunk パッチ 2(2021.2.1)からのアップグレード後に Gradle プロジェクトのインポートが失敗する
リソース
AarResourceRepositoryCache.createCachingData の NPE(AS Dolphin+)
圧縮ツール(R8)
フィールドを型置換する際に Kotlin メタデータがコピーされない
不正確な型の予期しない変換: TOP(すべて)
Gradle 7.3.0 で APK ビルドエラー com.android.tools.r8.CompilationFailedException が発生する
機能しないデフォルト コンストラクタを互換モードで除去
JetBrains のマークダウンとの競合
ThreadLocal.withInitial(java.util.function.Supplier のサポート)
AGP 7.3 で、破損したコンストラクタを含むクラスの dex が生成される
CF 以外のコードに脱糖が必要かどうかを判断するための予期しない試行
ktor VerifyError
okio-jvm 3.2.0 の処理時にコンパイル中に未定義の値がスローされる
間接的な instance-of のユーザーを使用してオブジェクトをインライン化するクラスによるコンパイル エラー
R8 3.3.75 の java.lang.IllegalAccessError