Android

Android StudioのInstant Runの種類

投稿日:

はじめに

はじめまして、nomuraと申します。
縁あって最近Androidアプリ開発に携わっており、主にAndroid関連の記事をあげていくと思います。
よろしくお願いします。

概要

Android Studioでアプリ開発する時、USB経由でPCに実機を接続して動作確認しつつ…となるかと思いますが、Instant Runが便利で、いつも使っています。

ただ、修正が即反映される時とそうでない時があったり、ビルドが走って通常のRunとあまり変わらなかったりと、挙動が異なることがありました。
要する時間も数秒〜数十秒と大きく変わるので、どういう場合にどんな動作になるのかを調べてみました。

全部で3種類

何が変更されたかによって、Android Studioが以下3つのいずれかを自動判別して実行します。

  • 既存メソッドの実装コードを変更しただけの場合、ホットスワップになります。
    体感的にはほぼ一瞬で変更が反映されます。
    Android Studioのデフォルト設定では、端末側で実行中のアクティビティを自動で再起動しますが、無効にすることもできます。
  • 既存リソースの変更や削除を行った場合はウォームスワップになります。
    「リソース」はソースコードから切り離されたレイアウトやアニメーションの定義、画像、表示用の文字列等です。
    おおむねresディレクトリに置いてあるファイル群という感じですね。
  • 上記2つより低速なのがコールドスワップです。
    ホットスワップやウォームスワップに比べると低速ですが、APKをデプロイし直すことはないので、やはり通常のRunより高速です。
    コールドスワップになる条件は少し多いので、次の項に記載します。

なお、コールドスワップはAPI21以上なら実行されますが、API20以下はビルドおよびデプロイが行われます。

コールドスワップになる条件

以下の変更があった場合はコールドスワップが実行されます。
(繰り返しになりますが、API21以上のみです)

  • アノテーション
  • インスタンスフィールド
  • 静的フィールド
  • 静的メソッドのシグネチャ
  • インスタンス メソッドのシグネチャ
  • 現在のクラスが継承する親クラス
  • 実装したインターフェースリスト
  • クラスの静的イニシャライザ
  • 動的リソースIDを用いたレイアウト要素の並べ替え

また、少し特殊な条件として
マルチプロセスのアプリで、メインプロセス以外に対してメソッド実装や既存リソースへの変更をした場合も、コールドスワップになります。

ビルドおよびデプロイが実行される条件

以下の変更があった場合、Instant Runではなくビルドおよびデプロイが自動的に実行されます。
アプリのランチャーアイコン情報やIntent-Filterなどがマニフェストファイルに記載されているためです。

  • アプリのマニフェストの変更
  • アプリのマニフェストが参照するリソースの変更
  • AndroidウィジェットUI要素の変更

再実行について

onCreateメソッドに変更があった場合はRun、あるいはRerunが必要です。
アプリの構成や変更箇所によっては、アクティビティではなくアプリ自体の再起動が必要になることもあると思います。
アクティビティのライフサイクルが完了していないと、onCreateが再実行されませんので、当然といえば当然ですね。
デフォルト設定でアクティビティを再実行しているのも、これが理由かなと思ってます。

参考ページ

公式ドキュメント
公式の日本語ドキュメントです。
Instant Runの最適化・高速化、無効化オプションについての説明などもありますので、興味のある方はご覧になってみてはいかがでしょうか。

さいごに

今回の執筆にあたってInstant Runに関する既存の記事を読みましたが、
リリース当時のテンション高めな文章が散見されて、皆が待ち望んでた機能だったようです。
私はAndroid Studioを使い始めた時点で3.0が最新でしたので、あって当然の機能でしたが
少し感謝の気持ちが生まれました。ありがとうInstant Run!

blog-page_footer_336




blog-page_footer_336




-Android

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Androidでのローカルプッシュ通知実装

1 はじめに2 WorkManagerとは?3 WorkManagerの導入4 実装例4.1 Workerの実装4.2 OneTimeWorkRequestBuilderの実装4.3 Periodic ...

【Java】Handlerクラスについてまとめてみました

1 はじめに2 Handlerクラスを使う理由3 Handlerクラスの基本4 Handlerを使ってsetText()を実行してみる5 sendMessage()を実行してみる6 さいごに7 おすす ...

GCM 2.0からFCMに移行する(AWS SNS対応版)

1 はじめに2 FCM移行で大事なポイント3 Firebaseプロジェクトへの引き継ぎ3.1 Firebaseの初期設定4 依存ライブラリの変更4.1 “com.google.androi ...

Kotlin MPAndroidChartライブラリを使い移動平均線を描画してみる。

1 はじめに2 MPAndroidChartライブラリについて2.1 ライブラリの導入2.2 描画の準備3 折れ線グラフを描画する3.1 LineChartの設定3.2 LineChart用のデータ作 ...

[Androidアニメーション]Shared Elements遷移

1 はじめに2 Shared Elements遷移とは3 layout xml4 Activity遷移5 その他6 さいごに はじめに 最近、雨が多いですね。そんな時は家にこもって、プログラミングをす ...

フォロー

blog-page_side_responsive

2018年2月
 123
45678910
11121314151617
18192021222324
25262728  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。