Skip to content

Most visited

Recently visited

navigation

Android O での動作変更点

新しい機能に加えて、Android O では、さまざまなシステムおよび API の動作が変更されています。このドキュメントでは、アプリ開発において把握しておくべき主な変更点について説明します。

これらの変更点の多くは、対象とする Android バージョンに関係なく、すべてのアプリに影響するものです。ただし、Android O を対象とするアプリにのみ影響する変更点もあります。このページではそれらを明確にするために、すべての API レベルを対象としたアプリAndroid O を対象としたアプリの 2 つに分けて説明します。

すべての API レベルを対象としたアプリ

これらの動作の変更点は、対象となる API レベルに関係なく、Android O プラットフォームで実行される すべてのアプリ に適用されます。すべてのデベロッパーはこれらの変更をレビューし、必要に応じてアプリを修正して適切にサポートする必要があります。

バックグラウンド実行制限

電池寿命を伸ばすために Android O に導入された変更点の 1 つとして、アプリがアクティブなコンポーネントのないキャッシュ状態になると、そのアプリが保持しているすべての WakeLock が解放されます。

また、端末のパフォーマンスを改善するために、フォアグラウンドで実行されていないアプリの特定の動作はシステムによって制限されます。具体的には次のような制限があります。

デフォルトでは、これらの制限は O を対象とするアプリのみに適用されますが、アプリが O を対象としていない場合でも、ユーザーは [Settings] 画面でアプリに対してこれらの制限を有効にすることができます。

Android O には次の特定のメソッドの変更も含まれます。

詳細については、バックグラウンド実行制限をご覧ください。

Android のバックグラウンド位置情報の制限

Android O 搭載の端末では、電池の消耗を抑え、ユーザー エクスペリエンスやシステムの健全性を保つために、バックグラウンド アプリが最新の位置情報を受信する頻度を低くしました。この変更は、Google Play サービスなどの最新の位置情報を受信するすべてのアプリに影響します。

具体的には以下の API に影響があります。

アプリが想定どおりに動作していることを確認するには、次の手順を実行します。

これらの変更点の詳細については、バックグラウンド位置情報の制限をご覧ください。

アプリ ショートカット

Android O では、アプリのショートカットが次のように変更されています。

アプリ ショートカットの変更の詳細については、プレビュー機能ガイドのピン留めされたショートカットとウィジェットをご覧ください。

ロケールと国際化

Android 7.0(API レベル 24)において、デフォルトのカテゴリ ロケールを指定できる仕組みが導入されました。ただし API によっては、デフォルトの DISPLAY カテゴリ ロケールを使用すべき場面でも、汎用的な Locale.getDefault() メソッドを引数なしで使い続けているものありました。Android O においては、次のメソッドで Locale.getDefault() の代わりに Locale.getDefault(Category.DISPLAY) を使用しています。

Locale 引数に指定された displayScript の値が利用できない場合は、Locale.getDisplayScript(Locale)Locale.getDefault() にフォールバックします。

追加されたロケールと国際化に関連する変更内容は次のとおりです。

警告ウィンドウ

アプリで SYSTEM_ALERT_WINDOW パーミッションと以下のウィンドウ タイプのいずれかを使用して、他のアプリやシステム ウィンドウ上に警告ウィンドウを表示しようとしている場合:

このような場合、警告ウィンドウは必ず TYPE_APPLICATION_OVERLAY ウィンドウ タイプを使用しているウィンドウの下に表示されます。Android O を対象とするアプリの場合は、TYPE_APPLICATION_OVERLAYウィンドウ タイプを使用して警告ウィンドウを表示します。

詳細については、Android O を対象としたアプリの動作変更の説明に含まれる警告ウィンドウの共通ウィンドウ タイプのセクションをご覧ください。

入力とナビゲーション

Chrome OS やタブレットなどの大きなフォーム ファクタでの Android アプリの登場と合わせて、Android アプリで使われているキーボード ナビゲーションが復活します。Android O で、ナビゲーション入力デバイスとしてのキーボードの使用に再度対応しました。その結果、矢印およびタブベース ナビゲーションに対して信頼性が高い予測可能なモデルが実現しました。

特に、要素のフォーカス動作に対して次の点を変更しました。

また、Android O のすべてのツールバー要素は自動的にキーボード ナビゲーション クラスタとなり、各ツールバー全体の内外へのナビゲーションが簡単にできるようになります。

アプリで使用されるキーボード ナビゲーションに対するサポートを改善する方法について詳しくは、キーボード ナビゲーションのサポートガイドをご覧ください。

ウェブフォーム自動入力

Android のオートフィル フレームワークが、オートフィル機能へのサポートを内蔵するようになったことを受け、WebViewオブジェクトに関連する次のメソッドが変更されました。この変更は、Android O を実行する端末にインストールされたアプリを対象としています。

WebSettings
  • getSaveFormData()メソッドは、falseを返すようになります。以前は、このメソッドはtrueを返していました。
  • setSaveFormData()を呼び出しても、何の効果も発生しません。
WebViewDatabase
  • clearFormData()を呼び出しても、何の効果も発生しません。
  • hasFormData()メソッドは、falseを返すようになります。以前は、フォームがデータを含んでいた場合、このメソッドはtrueを返していました。

ユーザー補助機能

ユーザー補助機能サービスが、アプリの TextView オブジェクト内にあるすべての ClickableSpan インスタンスを認識するようになりました。

アプリを利用しやすくする方法の詳細については、ユーザー補助機能の説明をご覧ください。

ネットワークと HTTP(S) 接続

Android O では、ネットワークと HTTP(S) 接続の動作が次のように変更されています。

Bluetooth

Android O では、ScanRecord.getBytes() メソッドで取得するデータ長に対して次のような変更が行われています。

シームレスな接続

Android O では、Wi-Fi 設定に対して多くの改善を実施しており、これにより、最高のユーザー エクスペリエンスを提供する Wi-Fi ネットワークを容易に選択できるようになります。具体的な変更点は以下を含みます。

セキュリティ

Android O でのセキュリティ関連の変更点は次のとおりです。

アプリのセキュリティの向上に関する補足のガイドラインについては、Android デベロッパー向けセキュリティの説明をご覧ください。

プライバシー

Android O プラットフォームにおけるプライバシー関連の変更点は次のとおりです。

捕捉されていない例外のログ記録

デフォルトの Thread.UncaughtExceptionHandler に対して呼び出しを行わない Thread.UncaughtExceptionHandler をアプリでインストールする場合、捕捉されていない例外が発生した際にシステム側でアプリを終了することはありません。Android O 以降は、この状況では例外のスタックトレースのログが記録されます。前のバージョンのプラットフォームでは、例外のスタックトレースのログは記録されていませんでした。

カスタムの Thread.UncaughtExceptionHandler では、必ずデフォルトのハンドラに対して呼び出しを行うことをお勧めします。そのように実装したアプリは、Android O での変更による影響を受けません。

連絡先プロバイダの利用統計の変更

これまでのバージョンの Android では、Contacts Provider コンポーネントによって各連絡先の利用統計を取得することが可能でした。この利用統計データには、連絡先に関連付けられた各メールアドレスや電話番号、その連絡先に連絡した回数、最後に連絡した日時などの情報が含まれます。READ_CONTACTS パーミッションをリクエストするアプリでは、このデータを読み込むことができます。

このデータをアプリで読み込むには READ_CONTACTS パーミッションをリクエストします。Android O 以降は、利用統計データを要求すると、正確な値ではなく概算値が返されます。Android システム側では正確な値を内部的に保持しているため、この変更によってオートコンプリートの API に影響が生じることはありません。

この動作変更の影響を受けるクエリ パラメータは次のとおりです。

コレクションの処理

AbstractCollection.removeAll()AbstractCollection.retainAll() は、必ず NullPointerException をスローするようになりました。これまでは、コレクションが空の場合、NullPointerException がスローされませんでした。この変更により、実際の動作がドキュメントと一致するようになります。

エンタープライズ向け Android

Android O では、デバイス ポリシー コントローラ(DPC)などのエンタープライズ アプリに関して、複数の API と機能の動作を変更しています。変更点は、以下のとおりです。

Android O でのすべてのエンタープライズの変更を確認し、アプリにどのように影響するかを把握するには、ビジネスで使用される Androidをご覧ください。

Android O を対象としたアプリ

これらの動作の変更点は、O プラットフォーム以降を対象としたアプリのみに適用されます。Android O 以降を対象にしてコンパイルするアプリ、または Android O 以降に対して targetSdkVersion を設定するアプリの場合、必要に応じてアプリを修正して、これらの変更点に適切に対応する必要があります。

警告ウィンドウ

SYSTEM_ALERT_WINDOW パーミッションを使用するアプリでは、以下のウィンドウ タイプを使用して他のアプリやシステム ウィンドウ上に警告ウィンドウを表示できなくなりました。

代わりに、TYPE_APPLICATION_OVERLAY という新しいウィンドウ タイプをアプリで使用する必要があります。

TYPE_APPLICATION_OVERLAY ウィンドウ タイプを使用してアプリ用の警告ウィンドウを表示する場合は、以下の新しいウィンドウ タイプの特性を考慮するようにしてください。

コンテンツ変更通知

Android O を対象とするアプリに対する ContentResolver.notifyChange()registerContentObserver(Uri, boolean, ContentObserver) の動作方法が変更されています。

これらの API では、すべての URI の認証局に有効な ContentProvider が定義されている必要があります。関係するパーミッション付きの有効な ContentProvider を定義することで、悪意のあるアプリが既存のアプリのコンテンツを変更できないようにし、プライベート データが悪意のあるアプリに流出しないようにします。

View のフォーカス

クリックできるViewオブジェクトが、デフォルトでフォーカス可能になりました。もし、Viewオブジェクトを、クリックはできるがフォーカスはできないようにしたい場合、 Viewを含むレイアウト XML ファイル内で android:focusable属性をfalseに設定するか、アプリの UI ロジックで、falsesetFocusable()にパスインしてください。

セキュリティ

アプリのネットワーク セキュリティ構成がクリアテキスト トラフィックへの対応をオプトアウトした場合、アプリの WebView オブジェクトは HTTP からウェブサイトにアクセスすることができなくなります。代わりに WebView オブジェクトごとに HTTPS を使用してください。

アプリのセキュリティの向上に関する補足のガイドラインについては、Android デベロッパー向けセキュリティの説明をご覧ください。

アカウント アクセスと検出の許可

認証システム側でユーザーのアカウントを所有しているか、ユーザーがアクセス権を付与していない限り、アプリ側でユーザー アカウントにアクセスできなくなりました。現在は GET_ACCOUNTS パーミッションだけでは不十分です。アカウントへのアクセス権を付与するには、AccountManager.newChooseAccountIntent() または認証システム固有のメソッドを使用する必要があります。アカウントへのアクセス権を付与されたアプリは、AccountManager.getAccounts() を呼び出してそのアカウントにアクセスできるようになります。

Android O では LOGIN_ACCOUNTS_CHANGED_ACTION が廃止されています。実行時にアカウントの更新情報を取得するには、代わりにアプリで addOnAccountsUpdatedListener() を使用してください。

アカウント アクセスと検出の許可に関する新規追加された API およびメソッドの情報については、本ドキュメントの新規 API のセクションに含まれるアカウント アクセスと検出の許可の説明をご覧ください。

プライバシー

Android O でのプライバシーに影響する変更点は次のとおりです。

パーミッション

Android O よりも前のバージョンでは、アプリが実行時にパーミッションをリクエストして、そのパーミッションが付与された場合、同じパーミッション グループに属し、かつマニフェストに登録されている残りのパーミッションもアプリに不適切に付与されていました。

Android O を対象にしたアプリでは、この動作が修正されています。つまり、アプリには明示的にリクエストしたパーミッションのみが付与されます。ただし、いったんユーザーが任意のパーミッションをアプリに付与すると、そのパーミッション グループに属するパーミッションに対する後続のリクエストは自動で許可されます。

たとえば、あるアプリのマニフェストに READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE が含まれていると仮定します。そのアプリが READ_EXTERNAL_STORAGE をリクエストして、ユーザーがそれを承認したとしましょう。API レベル 24 以下を対象とするアプリの場合は、WRITE_EXTERNAL_STORAGE も同時に付与されます。これらは同じ STORAGE パーミッション グループに属しており、どちらもマニフェストに登録されているためです。一方 Android O を対象とするアプリの場合は、READ_EXTERNAL_STORAGE しか付与されません。ただし、後からアプリで WRITE_EXTERNAL_STORAGE をリクエストした場合は、ユーザーに確認することなく即座にそのアクセス権が付与されます。

メディア

ネイティブ ライブラリ

Android O を対象とするアプリでは、書き込みと実行の両方が可能なロード セグメントが含まれているネイティブ ライブラリはロードされません。この変更により、不正なロード セグメントを含むネイティブ ライブラリを使用しているアプリは機能しなくなる可能性があります。これはセキュリティ強化のための対策です。

詳細については、書き込みおよび実行が可能なセグメントの説明をご覧ください。

これまでの Developer Preview リリースと同様に、Android O でもリンカーに関連するあらゆる問題が可視化されています。リンカーの変更は、アプリが対象とする API レベルに紐付けられています。対象とする API レベルでリンカーに変更があった場合、アプリはライブラリをロードできません。リンカーに変更があった API レベルよりも低いレベルを対象としている場合は、logcat に警告が表示されます。Preview リリースの期間中は、logcat だけでなくトーストにもリンカーに関連する問題が表示されます。この変更によって、警告がエラーに変わる API レベルに至る前に問題が明確になります。

コレクションの処理

Android O では、List.sort()Collections.sort() が実装されています。Android 7.x(API レベル 24 と 25)では、これとは逆の実装になっていました。つまり、デフォルトでは List.sort() の実装で Collections.sort() を呼び出していました。

この変更によって、Collections.sort() では List.sort() の最適化された実装を活用できるようになりますが、以下の制限も伴います。

クラス読み込み動作

Android O は、新しいクラスを読み込むときに、クラスローダがランタイムの推測どおりに機能するかどうか確認するためのチェックを行います。このチェックでは、クラスが Java(forName()から)、Dalvik バイトコード、JNI を使用して参照されるかどうかが実行されます。プラットフォームは、Java から loadClass() メソッドへの直接呼び出しのインターセプトも、この呼び出しの結果のチェックもしません。この動作は、適切に動作するクラスローダの機能には影響しません。

プラットフォームは、クラスローダから戻るクラス記述子が、予測された記述子と一致しているかチェックします。返された記述子が一致しない場合、プラットフォームは NoClassDefFoundError エラーをスローし、不一致を記述した詳細なメッセージを例外に保存します。

プラットフォームは要求されたクラスの記述子が有効かどうかもチェックします。このチェックは、無効な記述子を GetFieldID() などのクラスに引き渡し、こうしたクラスを間接的に読み込む JNI 呼び出しをキャッチします。たとえば、java/lang/String 署名付きのフィールドは、この署名が無効であるため見つかりません。署名は Ljava/lang/String; である必要があります。

これは、java/lang/String が有効な完全修飾名である場所にある FindClass() への JNI 呼び出しとは異なります。

Android O は、同じ DexFile オブジェクトを使用してクラスを定義しようとする複数のクラスローダをサポートしません。これを実行しようとすると、Android ランタイムが 「Attempt to register dex file <filename> with multiple class loaders」というメッセージとともに InternalError エラーをスローします。

DexFile API は廃止されたため、代わりに PathClassLoaderBaseDexClassLoader などの、プラットフォーム クラスローダのいずれか 1 つを使用することをお勧めします。

注: ファイル システムから同じ APK ファイル コンテナまたは JAR ファイル コンテナを参照する複数のクラスローダを作成できます。これを実行しても、通常はメモリのオーバーヘッドはそれほど発生しません。コンテナ内の DEX ファイルが圧縮されずに保存されている場合、プラットフォームは DEX ファイルを直接抽出しなくても、このファイルで mmap 操作を実行できます。プラットフォームがコンテナから DEX ファイルを抽出する必要がある場合に DEX ファイルを抽出して参照すると大量のメモリを消費することがあります。

Android では、すべてのクラスローダが並行処理可能と見なされます。複数のスレッドがクラスローダが同じである同じクラスを読み込む場合、最初のスレッドが最初に操作を完了し、その結果が他のスレッドに使用されます。この動作は、クラスローダが同じクラスを戻すか、別のクラスを戻すか、例外をスローするかどうかに関係なく発生します。プラットフォームはこのような例外を暗黙的に無視します。

警告: Android O 以前のプラットフォームのバージョンでは、これらの仮定に従っていない場合、同じクラスの複数回定義、クラスの混乱や他の望ましくない状況によるヒープ破壊につながる可能性があります。

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.