Skip to content

Most visited

Recently visited

navigation

Android 7.0 の動作の変更点

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

過去に Android 向けのアプリを公開したことがある場合は、そのアプリが今回のプラットフォームの変更による影響を受ける可能性があることに注意してください。

電池とメモリ

Android 7.0 では、端末の電池寿命を改善したり、RAM の使用量を削減したりするために、システムの動作がいくつか変更されています。これらの変更は、システム リソースへのアプリのアクセスに加え、特定の暗黙的インテントを介して他のアプリとやり取りする方法に影響を及ぼす可能性があります。

Doze

Android 6.0(API レベル 23)で Doze が導入されました。これは、ユーザーが端末を電源と接続せずに静止状態にし、画面をオフにすると、CPU とネットワークのアクティビティを保留して電池の寿命を改善するものです。Android 7.0 では、Doze が改良されています。端末を電源と接続せずに画面をオフにすると、端末が静止していなくても(たとえば、ユーザーがハンドセットをポケットに入れて持ち歩いている場合)、CPU およびネットワーク制限のサブセットがアプリに適用されます。

図 1. Doze が第 1 レベルのシステム アクティビティ制限を適用して、電池の寿命を改善

端末が電池で動作しているときに画面をしばらくオフにすると、端末は Doze モードになり、第一段階の制限サブセットが適用されます。これにより、アプリのネットワーク アクセスが切断されてジョブと同期が保留されます。端末が Doze モードに入った後、しばらくの間静止状態が続くと、残りの Doze 制限が PowerManager.WakeLockAlarmManager アラーム、GPS、Wi-Fi スキャンに適用されます。適用される Doze 制限が一部であるか完全なものであるかには関係なく、端末は Doze モードから短時間抜け出し、メンテナンスの時間枠と呼ばれる状態になります。このとき、アプリはネットワーク アクセスを許可され、保留されたジョブや同期を実行することができます。

図 2. 端末がしばらくの間静止状態になると、Doze が第 2 レベルのシステム アクティビティ制限を適用する

画面をオンにするか、端末を電源に接続すると、Doze モードは解除され、これらの処理の制限は適用されなくなります。Doze とアプリ スタンバイ用に最適化するで説明したように、今回追加された動作は、Android 6.0(API レベル 23)で導入された以前のバージョンの Doze にアプリを対応させるための推奨事項とベスト プラクティスに影響するものではありません。メッセージの送受信に Google Cloud Messaging(GCM)を使用するなどの推奨事項を引き続き順守して、追加の Doze 動作に対応するためにアップデートを計画してください。

Project Svelte:バックグラウンド処理の最適化

Android 7.0 では、メモリ使用量と消費電力を最適化するために、3 つの暗黙的なブロードキャストが削除されています。この変更が必要になった理由は、暗黙的なブロードキャストが行われると、バックグラウンドでブロードキャストをリッスンするように登録されているアプリが頻繁に起動されるためです。これらのブロードキャストを削除すると端末のパフォーマンスとユーザー エクスペリエンスが大幅に向上します。

モバイル端末では、Wi-Fi とモバイルデータの切り替えなど、接続が頻繁に変化します。現在のアプリでは、暗黙的な CONNECTIVITY_ACTION ブロードキャストのレシーバーをマニフェストに登録することにより、接続状態の変化を監視できるようになっています。多くのアプリがこのブロードキャストを受信する登録を行っているので、一度ネットワークの切り替えが起こるだけですべてのアプリがアクティブになり、ブロードキャストが同時に処理されます。

同様に、旧バージョンの Android では、暗黙的な ACTION_NEW_PICTURE ブロードキャストと ACTION_NEW_VIDEO ブロードキャストをカメラなどの他のアプリから受信するよう登録できました。ユーザーがカメラアプリで写真を撮ると、これらのアプリがアクティブになり、ブロードキャストが処理されます。

Android 7.0 では、こういった問題を軽減するために、以下の最適化手法が適用されます。

アプリでこれらのインテントのいずれかを使用する場合は、Android 7.0 端末でも適切に動作するように、可能な限りインテントとの依存性を削除する必要があります。Android フレームワークは、これらの暗黙的なブロードキャストの必要性を軽減するいくつかのソリューションを提供します。たとえば、JobScheduler API は、従量制ではないネットワークへの接続など、指定された条件のときに、ネットワーク操作をスケジュールするための堅牢なメカニズムを提供します。また、JobScheduler を使用して、コンテンツ プロバイダの変更に対応することもできます。

Android N でのバックグラウンド処理の最適化や、アプリで必要となる対応の詳細については、バックグラウンド処理の最適化をご覧ください。

パーミッションの変更

Android 7.0 では、アプリに影響を及ぼす可能性のあるパーミッションが変更されています。

ファイル システムのパーミッションの変更

プライベート ファイルのセキュリティを強化するために、Android 7.0 以降向けのアプリのプライベート ディレクトリにはアクセス制限があります(0700)。この設定により、サイズや存在など、プライベート ファイルのメタデータの漏洩を防ぐことができます。このパーミッションの変更には、以下のような複数の副作用があります。

アプリ間のファイルの共有

Android 7.0 向けのアプリでは、Android フレームワークにより、自身のアプリ外への file:// URI の公開を禁止する StrictMode API ポリシーが適用されます。ファイル URI を含むインテントがアプリからなくなると、FileUriExposedException 例外によりアプリはエラーになります。

アプリ間でファイルを共有するには、content:// URI を送信して、この URI への一時的なアクセス パーミッションを付与する必要があります。このパーミッションを付与する最も簡単な方法は、FileProvider クラスを使用することです。パーミッションとファイルの共有の詳細については、ファイルの共有をご覧ください。

ユーザー補助機能の改善

Android 7.0 には、低視力のユーザーまたは視覚障害のあるユーザー向けのプラットフォームのユーザビリティを改善するための変更がいくつか追加されています。通常は、これらの変更によってアプリのコードを変更する必要はありませんが、この機能について理解し、アプリでテストして、ユーザー エクスペリエンスに与える潜在的な影響を評価する必要があります。

画面のズーム

Android 7.0 では、ディスプレイ サイズを設定して、画面上のすべての要素を拡大または縮小することができるので、視覚障害のあるユーザーに対する端末のユーザー補助機能が向上しています。ユーザーは、一般的な中くらいのサイズの携帯端末 Nexus 4 の幅である sw320dp の画面最小幅を超えて画面をズームできません。

図 3. 右側の画面では、Android 7.0 システム イメージを実行している端末のディスプレイ サイズを拡大している

端末の画面密度が変更されると、以下の方法で実行中のアプリに通知されます。

Android のベスト プラクティスに従っているほとんどのアプリでは、この機能をサポートするための変更を加える必要はありません。ただし、以下の点は確認する必要があります。

セットアップ ウィザードの [Vision Settings]

Android 7.0 には、オープニング画面に [Vision Settings] が追加されています。ユーザーはこれを使用して、新しい端末でズーム操作フォントサイズディスプレイ サイズTalkBack のユーザー補助機能設定を設定できます。この変更により、さまざまな画面設定に関連するバグが顕在化する可能性があります。この機能が及ぼす影響を評価するには、これらの設定を有効にしてアプリをテストする必要があります。設定は、[Settings] > [Accessibility] にあります。

プラットフォーム ライブラリにリンクした NDK アプリ

Android 7.0 以降、NDK 以外のライブラリを動的にリンクできなくなります。その結果、アプリがクラッシュする可能性があります。この動作の変更は、プラットフォームが更新されたり、さまざまな端末で使用したときでもアプリの操作感に一貫性を持たせるためです。自作のコードでプライベート ライブラリにリンクしていなくても、アプリ内のサードパーティの静的ライブラリで NDK 以外のライブラリにリンクしている可能性があります。そのため、すべてのデベロッパーは Android 7.0 を搭載している端末でアプリがクラッシュしないことを確認する必要があります。アプリがネイティブ コードを使用している場合は、パブリック NDK API のみを使用するようにしてください。

アプリでプライベート プラットフォーム API にアクセスを試みるケースには、次の 3 つがあります。

NDK に含まれていないネイティブ ライブラリは使用しないでください。Android のバージョンが変わると、変更または削除される可能性があります。OpenSSL から BoringSSL への移行は、そのような変更の一例です。また、NDK に含まれていないプラットフォーム ライブラリには互換性要件がないため、端末によって互換性レベルが異なる場合があります。

現在リリースされているアプリに対するこの制限の影響を軽減するため、よく使われているライブラリ(libandroid_runtime.solibcutils.solibcrypto.solibssl.so など)は、API レベル 23 以下を対象とするアプリ向けに、Android N で一時的にアクセス可能になっています。アプリがこのようなライブラリを読み込むと、logcat で警告が生成され、対象の端末でトースト通知が表示されます。このような警告が表示されたら、目的のライブラリをコピーして含めるか、パブリック NDK API のみを使用するようにアプリを更新する必要があります。Android プラットフォームの今後のリリースではプライベート ライブラリの使用がすべて制限され、アプリがクラッシュする可能性があります。

パブリック ライブラリではなく一時的なアクセスもできない API を呼び出すと、必ずアプリでランタイムエラーが生成されます。その結果、System.loadLibrarydlopen(3)NULL が返され、アプリがクラッシュする可能性があります。アプリのコードを確認して、プライベート プラットフォーム API を削除し、プレビュー端末またはエミュレータを使用して、アプリを十分にテストしてください。アプリでプライベート ライブラリを使用しているか不明な場合は、logcat を確認してランタイム エラーを特定できます。

次の表に、プライベート ネイティブ ライブラリの使用状況とターゲット API レベル(android:targetSdkVersion)を確認するために調査すべき動作をまとめています。

ライブラリ ターゲット API レベル 動的リンカーからのランタイム アクセス N Developer Preview の動作 N 最終リリース版の動作 将来の Android プラットフォームの動作
NDK パブリック すべて アクセス可能 想定どおりの動作 想定どおりの動作 想定どおりの動作
プライベート(一時的にアクセス可能なプライベート ライブラリ) 23 以降 一時的にアクセス可能 想定どおりの動作。ただし logcat で警告が表示され、対象端末でメッセージが表示される。 想定どおりの動作。ただし logcat で警告が表示される。 ランタイムエラー
プライベート(一時的にアクセス可能なプライベート ライブラリ) 24 以上 制限あり ランタイムエラー ランタイムエラー ランタイムエラー
プライベート(その他) すべて 制限あり ランタイムエラー ランタイムエラー ランタイムエラー

アプリのプライベート ライブラリの使用状況を確認する

プライベート ライブラリの読み込みに関する問題を特定できるように、logcat で警告またはランタイムエラーが生成されます。たとえば、アプリのターゲット API レベルが 23 以下で、Android 7.0 を搭載している端末でプライベート ライブラリへのアクセスを試みると、次のような警告が表示される場合があります。

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120

このような logcat の警告によって、プライベート プラットフォーム API にアクセスしようとしたもののアプリがクラッシュしなかったライブラリを特定できます。ただしアプリのターゲット API レベルが 24 以上の場合は、logcat で次のランタイムエラーが生成され、アプリがクラッシュする可能性があります。

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)

プライベート プラットフォーム API に動的にリンクするサードパーティ ライブラリをアプリが使用している場合も、logcat でこのように出力される場合があります。次のコマンドを実行して、Android 7.0DK の readelf ツールを使用すると、指定した .so ファイルの共有ライブラリのうち動的にリンクされているものをすべてリストアップできます。

aarch64-linux-android-readelf -dW libMyLibrary.so

アプリのアップデート

このようなエラーを修正し、今後のプラットフォームのアップデートでアプリのクラッシュを防止するための手順を説明します。

Android for Work

Android 7.0 には、証明書のインストール、パスワードの再設定、セカンダリ ユーザーの管理、端末識別子へのアクセスなど、Android for Work をターゲットにしているアプリに対する変更が含まれています。Android for Work 環境向けのアプリをビルドしている場合、これらの変更点を確認し、変更に応じてアプリを修正する必要があります。

Android 7.0 での Android for Work の変更の詳細については、Android for Work のアップデートをご覧ください。

アノテーションの保持

Android 7.0 では、アノテーションの表示が無視されていたバグが修正されました。この問題によって、ランタイムがこれまでできなかったアノテーションへのアクセスが可能になっていました。対象となるアノテーションは以下のとおりです。

アプリでこの動作を利用している場合は、実行時に表示されるアノテーションに保持ポリシーを追加してください。これは @Retention(RetentionPolicy.RUNTIME) を使用して実行できます。

その他の重要事項

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 short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)