page.title=動作の変更点 page.keywords=preview,sdk,compatibility meta.tags="プレビュー"、"互換性" 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 およびネットワーク制限のサブセットがアプリに適用されます。
図 1. Doze が第 1 レベルのシステム アクティビティ制限を適用して、バッテリーの寿命を改善
デバイスがバッテリー電源で動作しているときに画面をしばらくオフにすると、デバイスは Doze モードになります。それによって制限の最初のサブセットが適用され、アプリのネットワーク アクセスが切断されてジョブと同期が保留されます。デバイスが Doze モードに入った後、しばらくの間動かさずに放置していると、残りの Doze 制限が {@link android.os.PowerManager.WakeLock}、 {@link android.app.AlarmManager} アラーム、GPS、Wi-Fi スキャンに適用されます。適用される Doze 制限が一部であるか完全なものであるかには関係なく、デバイスは Doze モードから短時間抜け出し、メンテナンス ウィンドウと呼ばれる状態になります。このとき、アプリはネットワーク アクセスを許可され、保留されたジョブや同期を実行することができます。
図 2. デバイスがしばらくの間静止状態になると、Doze が第 2 レベルのシステム アクティビティ制限を適用する
画面をオンにするか、デバイスを電源に接続すると、Doze モードは解除され、処理の制限は適用されなくなります。Doze と App Standby 用に最適化するで説明したように、今回追加された動作は、Android 6.0(API レベル 23)で導入された以前のバージョンの Doze にアプリを対応するための推奨事項とベストプラクティスには影響を及ぼしません。Google Cloud Messaging(GCM)を使用してメッセージを受送信することなどの推奨事項を引き続き順守して、追加の Doze 動作に対応するためにアップデートを計画する必要があります。
Android N では、メモリ使用量と消費電力を最適化するために、3 つの暗黙的なブロードキャストが削除されています。この変更が必要になるのは、暗黙的なブロードキャストが行われると、バックグラウンドでブロードキャストをリッスンするように登録されているアプリが頻繁に起動されるためです。このブロードキャストを削除するとデバイスのパフォーマンスとユーザー エクスペリエンスが大幅に向上します。
モバイル端末では、Wi-Fi とモバイルデータの切り替えなど、接続が頻繁に変化します。現在のアプリでは、暗黙的な {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストのレシーバーをマニフェストに登録することにより、接続の変化を監視できるようになっています。多くのアプリがこのブロードキャストを受信する登録を行っているので、1 度ネットワークの切り替えが起こるだけですべてのアプリがアクティブになり、ブロードキャストが同時に処理されます。
同様に、暗黙的な {@link android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストおよび {@link android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストをカメラなどの他のアプリから受信するよう登録している場合、ユーザーがカメラアプリで写真を撮ると、登録されたアプリがアクティブになり、ブロードキャストの処理が行われます。
Android N では、こういった問題を緩和するために、以下の最適化手法が適用されます。
Android の将来のリリースでは、追加の暗黙的なブロードキャストに加えて、バインドされていないバックグラウンド サービスが廃止される可能性があります。このため、マニフェストで宣言されている暗黙的なブロードキャスト用のレシーバーやバックグラウンド サービスとの依存関係は回避または削除する必要があります。
Android フレームワークは、これらの暗黙的なブロードキャストやバックグラウンド サービスの必要性を軽減するいくつかのソリューションを提供しています。たとえば、{@link android.app.job.JobScheduler} API は、従量制ではないネットワークへの接続など、特定の条件が満たされたときに、ネットワーク操作をスケジュールするための堅牢なメカニズムを提供します。また、{@link android.app.job.JobScheduler} を使用して、コンテンツ プロバイダの変更に対応することもできます。
この動作の変更や、アプリで必要となる対応の詳細については、バックグラウンド処理の最適化をご覧ください。
Android N には、ユーザー アカウント パーミッションや外部ストレージに書き込むための新しいパーミッションなど、アプリに影響を及ぼす可能性のあるパーミッションが変更されています。ここでは、今回のプレビューで変更されたパーミションの概要について説明します。
GET_ACCOUNTS パーミッションは廃止予定となりました。システムは、Android N をターゲットにしたアプリでこのパーミションを無視します。
Android N には、低視力のユーザーまたは視覚障害のあるユーザー向けのプラットフォームのユーザビリティを改善するための変更が追加されています。通常は、これによってアプリのコードを変更する必要はありませんが、この機能について理解し、アプリをテストして、ユーザー エクスペリエンスに与える潜在的な影響を評価する必要があります。
Android N では、ディスプレイ サイズを設定して、画面上のすべての要素を拡大または縮小することができるので、低視力のユーザーに対するデバイスのアクセシビリティが向上しています。ユーザーは、一般的な中くらいのサイズの携帯端末 Nexus 4 の幅である sw320dp の画面最小幅を超えて画面をズームできません。
図 3. 右側の画面では、Android N システム イメージを実行しているデバイスのディスプレイ サイズを拡大している
デバイスの画面密度が変更されると、以下の方法で実行中のアプリに通知されます。
Android のベストプラクティスに従っているほとんどのアプリでは、この機能をサポートするための変更を加える必要はありませんが、以下の点は確認する必要があります。
sw320dp のデバイスでアプリをテストして、適切に機能することを確認します。
注: 構成に依存したデータをキャッシュする場合は、そのデータ用の適切な画面サイズやピクセル密度など、関連するメタデータを含めることをお勧めします。このメタデータを保存しておくと、構成を変更した後、キャッシュ データを更新する必要があるかどうかを決定できます。
dp)単位で寸法を指定します。
Android N には、オープニング画面に [Vision Settings] が追加されています。ユーザーは [Vision Settings] を使用して、新しいデバイスでズーム操作、フォントサイズ、ディスプレイ サイズ、TalkBack などのアクセシビリティ機能を設定できます。この変更により、さまざまな画面設定に関連するバグが顕在化する可能性があります。この機能が及ぼす影響を評価するには、これらの設定を有効にしてアプリをテストする必要があります。設定は、[Settings] > [Accessibility] にあります。
Android N では、非パブリック API のロードを防止するために、名前空間が変更されています。NDK を使用する場合、Android プラットフォームのパブリック API のみを使用する必要があります。Android の次の公式リリースで非パブリック API を使用すると、アプリがクラッシュする可能性があります。
非パブリック API を使用していることをデベロッパーに警告するため、Android N で実行されているアプリが非パブリック API を呼び出すと、logcat にエラーが出力されます。この状態を認識してもらえるよう、エラー メッセージはデバイスの画面にも表示されます。アプリのコードを確認して、非パブリック API を削除し、プレビュー デバイスまたはエミュレータを使用して、アプリを十分にテストしてください。
アプリがプラットフォーム ライブラリに依存している場合は、NDK ドキュメントにある一般的な修正例を参照して、共通のプライベート API をそれと同等な機能を持つパブリック API に置き換えます。特に、プラットフォームに含まれていて NDK には含まれていないライブラリ(libpng など)をアプリで使用している場合、気付かないうちにプラットフォーム ライブラリにリンクしていることがあります。この場合、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 をスローします。
DevicePolicyManager.resetPassword() を使用して、既に設定されているパスワードを削除または変更できなくなりました。デバイスの管理者は、デバイスにパスワード、PIN、またはパターンが設定されていない場合のみ、パスワードを設定できます。
DISALLOW_MODIFY_ACCOUNTS ユーザー制限が適用されている場合でもアカウント管理 API を呼び出すことができます。
DISALLOW_ADD_USER 制限が自動的に設定されます。これにより、管理されていないセカンダリ ユーザーが作成されることを防ぐことができます。また、CreateUser() メソッドと createAndInitial() メソッドは廃止され、新しい DevicePolicyManager.createAndManageUser() メソッドに置き換えられました。
DevicePolicyManagewr.getWifiMacAddress() を使用して、デバイスの Wi-Fi MAC アドレスにもアクセスできます。デバイスで Wi-Fi が有効にされたことがない場合、このメソッドは {@code null} 値を返します。
Android N の Android for Work の変更に関する詳細については、Android for Work のアップデートをご覧ください。
アプリをテストして、この動作が発生しないようにしてください。DDMS でアプリを手動で強制終了させて同様のクラッシュを発生させることにより、アプリのテストを行なうことができます。
N 以上をターゲットにしたアプリは、画面密度の変更時に自動的に強制終了しませんが、構成変更への対応が不十分なままである可能性があります。