page.title=動作の変更点 page.keywords=preview,sdk,compatibility meta.tags="preview", "compatibility" page.tags="preview", "developer preview" page.image=images/cards/card-n-changes_2x.png @jd:body
新しい機能に加えて、Android N では、さまざまなシステムおよび API の動作が変更されています。 このドキュメントでは、アプリ開発において把握しておくべき主な変更点について説明します。
過去に Android 向けのアプリを公開したことがある場合は、そのアプリが今回のプラットフォームの変更による影響を受ける可能性があることに注意してください。
Android N では、端末の電池寿命を改善したり、RAM の使用量を削減したりするために、システムの動作がいくつか変更されています。 これらの変更は、システム リソースへのアプリのアクセスに加え、特定の暗黙的インテントを介して他のアプリとやり取りする方法に影響を及ぼす可能性があります。
Android 6.0(API レベル 23)で Doze が導入されました。これは、ユーザーが端末を電源と接続せずに静止状態にし、画面をオフにすると、CPU とネットワークのアクティビティを保留して電池寿命を改善するものです。 Android N では、Doze が改良されています。端末を電源と接続せずに画面をオフにすると、端末が静止していなくても(たとえば、ユーザーが携帯端末をポケットに入れて持ち歩いている場合)、CPU およびネットワーク制限のサブセットがアプリに適用されます。
端末が電池電源で動作しているときに画面をしばらくオフにすると、端末は Doze モードになり、制限の最初のサブセットが適用されます。 これにより、アプリのネットワーク アクセスが切断されてジョブと同期が保留されます。 端末が Doze モードに入った後、しばらくの間静止状態になると、残りの Doze 制限が {@link android.os.PowerManager.WakeLock}、{@link android.app.AlarmManager} アラーム、GPS、Wi-Fi スキャンに適用されます。 適用される Doze 制限が一部であるか完全なものであるかには関係なく、端末は Doze モードから短時間抜け出し、メンテナンス ウィンドウと呼ばれる状態になります。このとき、アプリはネットワーク アクセスを許可され、保留されたジョブや同期を実行することができます。
画面をオンにするか、端末を電源に接続すると、Doze モードは解除され、これらの処理の制限は適用されなくなります。 Doze とアプリ スタンバイ用に最適化するで説明したように、今回追加された動作は、Android 6.0(API レベル 23)で導入された以前のバージョンの Doze にアプリを対応させるための推奨事項とベスト プラクティスには影響を及ぼしません。 メッセージの送受信に Google Cloud Messaging(GCM)を使用するなどの推奨事項を引き続き順守して、追加の Doze 動作に対応するためにアップデートを計画する必要があります。
Android N では、メモリ使用量と消費電力を最適化するために、3 つの暗黙的なブロードキャストが削除されています。 この変更が必要になるのは、暗黙的なブロードキャストが行われると、バックグラウンドでブロードキャストをリッスンするように登録されているアプリが頻繁に起動されるためです。 これらのブロードキャストを削除すると端末のパフォーマンスとユーザー エクスペリエンスが大幅に向上します。
モバイル端末では、Wi-Fi とモバイルデータ間を移動するときなど、接続が頻繁に変化します。 現在のアプリでは、暗黙的な {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストのレシーバーをマニフェストに登録することにより、接続の変化を監視できるようになっています。 多くのアプリがこのブロードキャストを受信する登録を行っているので、一度ネットワークの切り替えが起こるだけですべてのアプリがアクティブになり、ブロードキャストが同時に処理されます。
同様に、旧バージョンの Android では、暗黙的な {@link android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストと {@link android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストをカメラなどの他のアプリから受信するよう登録できました。 ユーザーがカメラアプリで写真を撮ると、これらのアプリがアクティブになり、ブロードキャストが処理されます。
Android N では、こういった問題を緩和するために、以下の最適化手法が適用されます。
アプリでこれらのインテントのいずれかを使用する場合は、Android N 端末を適切にターゲットにできるよう可能な限りインテントとの依存性を削除する必要があります。 Android フレームワークは、これらの暗黙的なブロードキャストの必要性を軽減するいくつかのソリューションを提供します。 たとえば、{@link android.app.job.JobScheduler} API は、従量制ではないネットワークへの接続など、指定された条件のときに、ネットワーク操作をスケジュールするための堅牢なメカニズムを提供します。 また、{@link android.app.job.JobScheduler} を使用して、コンテンツ プロバイダの変更に対応することもできます。
N でのバックグラウンド処理の最適化や、アプリで必要となる対応の詳細については、バックグラウンド処理の最適化をご覧ください。
Android N では、アプリに影響を及ぼす可能性のあるパーミッションが変更されています。
プライベート ファイルのセキュリティを強化するために、Android N 以降向けのアプリのプライベート ディレクトリにはアクセス制限があります(0700
)。
この設定により、サイズや存在など、プライベート ファイルのメタデータの漏洩を防ぐことができます。
このパーミッションの変更には、以下のような複数の副作用があります。
注:現在のところ、この制限は完全には適用されていません。 アプリはネイティブ API や {@link java.io.File File} API を使用して、プライベート ディレクトリのパーミッションを変更できる場合があります。 ただし、プライベート ディレクトリのパーミッションを緩和できないようにすることをお勧めします。
file://
URI を渡すと、レシーバーがアクセスできないパスになる可能性があります。
そのため、file://
URI を渡そうとすると、FileUriExposedException
がトリガーされます。
プライベート ファイルのコンテンツの共有には、{@link
android.support.v4.content.FileProvider} を使用することをお勧めします。
Android N 向けのアプリでは、Android フレームワークにより、アプリ以外の {@code file://} URI の公開を禁止する {@link android.os.StrictMode} API ポリシーが適用されます。 ファイル URI を含むインテントがアプリからなくなると、{@code FileUriExposedException} 例外によりアプリはエラーになります。
アプリ間でファイルを共有するには、{@code content://} URI を送信して、この URI に一時的なアクセス パーミッションを付与する必要があります。 このパーミッションを付与する最も簡単な方法は、{@link android.support.v4.content.FileProvider} クラスを使用することです。 パーミッションとファイルの共有の詳細については、ファイルの共有をご覧ください。
Android N には、低視力のユーザーまたは視覚障害のあるユーザー向けのプラットフォームのユーザビリティを改善するための変更がいくつか追加されています。 通常は、これらの変更によってアプリのコードを変更する必要はありませんが、この機能について理解し、アプリでテストして、ユーザー エクスペリエンスに与える潜在的な影響を評価する必要があります。
Android N では、ディスプレイ サイズを設定して、画面上のすべての要素を拡大または縮小することができるので、視覚障害のあるユーザーに対する端末のユーザー補助機能が向上しています。 ユーザーは、一般的な中くらいのサイズの携帯端末 Nexus 4 の幅である sw320dp の画面最小幅を超えて画面をズームできません。
端末の画面密度が変更されると、以下の方法で実行中のアプリに通知されます。
Android のベスト プラクティスに従っているほとんどのアプリでは、この機能をサポートするための変更を加える必要はありません。 以下の点は確認する必要があります。
sw320dp
の端末でアプリをテストして、適切に機能することを確認します。
注:設定に依存したデータをキャッシュに保存する場合は、そのデータ用の適切な画面サイズやピクセル密度など、関連するメタデータを含めることをお勧めします。 このメタデータを保存しておくと、設定を変更した後、キャッシュ データを更新する必要があるかどうかを決定できます。
dp
)単位で寸法を指定します。
Android N には、オープニング画面に [Vision Settings] が追加されています。ユーザーはこれを使用して、新しい端末で以下のユーザー補助機能設定を設定できます。 ズーム操作、フォントサイズ、ディスプレイ サイズ、TalkBack。 この変更により、さまざまな画面設定に関連するバグが顕在化する可能性があります。 この機能が及ぼす影響を評価するには、これらの設定を有効にしてアプリをテストする必要があります。 設定は、[Settings] > [Accessibility] にあります。
Android N では、非パブリック API のロードを防止するために、名前空間が変更されています。 NDK を使用する場合、Android プラットフォームのパブリック API のみを使用する必要があります。 Android の次の公式リリースで非パブリック API を使用すると、アプリがクラッシュする可能性があります。
非パブリック API を使用していることを警告するために、アプリが非パブリック API を呼び出すと、Android N 端末で実行されているアプリは logcat 出力でエラーを生成します。 この状態を認識してもらえるよう、このエラーはメッセージとして端末の画面にも表示されます。 アプリのコードを確認して、非パブリック プラットフォーム API を削除し、プレビュー端末またはエミュレータを使用して、アプリを十分にテストしてください。
アプリがプラットフォーム ライブラリに依存している場合は、NDK ドキュメントにある一般的な修正例を参照して、共通のプライベート API をそれと同等の機能を持つパブリック API に置き換えます。
特に、libpng
など、プラットフォームに含まれていて NDK には含まれていないライブラリをアプリで使用している場合、気付かないうちにプラットフォーム ライブラリにリンクしていることがあります。
この場合、APK にリンク対象のすべての .so ファイルが含まれていることを確認します。
警告:サードパーティのライブラリの中には非パブリック API にリンクしているものもあります。 アプリがこれらのライブラリを使用している場合、Android の次の公式リリースでアプリを実行すると、アプリがクラッシュする可能性があります。
NDK に含まれていないネイティブ ライブラリは Android のリリース版が変わると変更または削除される場合があるため、アプリでは、こういったライブラリへの依存やその使用を避けてください。 OpenSSL から BoringSSL への移行は、そのような変更の一例です。 また、NDK に含まれていないプラットフォーム ライブラリには互換性要件がないため、端末によって互換性レベルが異なる場合があります。 古い端末で非 NDK ライブラリにアクセスする必要がある場合は、Android API レベルに応じてロードしてください。
こうしたタイプの問題の診断を支援するために、Android N でアプリをビルドするときに発生する可能性のある Java および NDK のエラーの例を以下に示します。
Java のエラー例
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" is not accessible for the namespace "classloader-namespace"
NDK のエラー例
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
こうしたタイプのエラーが発生しているアプリの典型的な修正例を以下に示します。
AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or JavaVM::AttachCurrentThread from <jni.h>.
#include <sys/system_properties.h>
Android N には、証明書のインストール、パスワードの再設定、セカンダリ ユーザーの管理、端末識別子へのアクセスなど、Android for Work をターゲットにしているアプリに対する変更が含まれています。 Android for Work 環境向けのアプリをビルドしている場合、これらの変更点を確認し、変更に応じてアプリを修正する必要があります。
DevicePolicyManager.setCertInstallerPackage()
を呼び出す前に代理証明書インストーラをインストールする必要があります。
このインストーラがインストールされていない場合、IllegalArgumentException
がスローされます。
DISALLOW_MODIFY_ACCOUNTS
ユーザー制限が適用されている場合でもアカウント管理 API を呼び出すことができます。
DISALLOW_ADD_USER
制限が自動的に設定されます。
これにより、管理されていないセカンダリ ユーザーが作成されることを防ぐことができます。
また、CreateUser()
メソッドと createAndInitializeUser()
メソッドは廃止され、新しい DevicePolicyManager.createAndManageUser()
メソッドに置き換えられました。
DevicePolicyManagewr.getWifiMacAddress()
を使用して、端末の Wi-Fi MAC アドレスにもアクセスできます。
端末で Wi-Fi が有効にされたことがない場合、このメソッドは {@code null} 値を返します。
Android N での Android for Work の変更の詳細については、Android for Work のアップデートをご覧ください。
Android N では、アノテーションの表示が無視されていたバグを修正しています。この問題は、ランタイムがこれまでできなかったアノテーションへのアクセスを可能にしました。 これらのアノテーションは以下のとおりです。
アプリでこの動作を利用している場合は、実行時に表示されるアノテーションに保持ポリシーを追加してください。 これは {@code @Retention(RetentionPolicy.RUNTIME)} を使用して実行できます。
アプリをテストして、この動作が発生しないようにしてください。DDMS でアプリを手動で強制終了させて同様のクラッシュを発生させることにより、アプリのテストを行うことができます。
N 以上をターゲットにしたアプリは、画面密度の変更時に自動的に強制終了しませんが、設定変更への対応が不十分なままである可能性があります。