デベロッパー向け Android 7.0

Android 7.0 Nougat では、ユーザーとデベロッパー向けのさまざまな新機能が導入されています。このドキュメントでは、デベロッパー向けの新機能について説明します。

プラットフォームの変更がアプリに影響する領域については、 Android 7.0 の動作変更をご確認ください。

Android 7.0 の一般ユーザー向け機能について詳しくは、www.android.com をご覧ください。

マルチウィンドウのサポート

Android 7.0 では、ご要望の多かった新しいマルチタスク機能であるマルチウィンドウ サポートがプラットフォームに導入されました。

2 つのアプリを同時に画面にポップアップして開けるようになりました。

  • Android 7.0 を搭載したスマートフォンやタブレットでは、分割画面モードで 2 つのアプリを左右または上下に並べて実行できます。ユーザーは、アプリ間の分割線をドラッグしてアプリのサイズを変更できます。
  • Android TV デバイスでは、アプリをピクチャー イン ピクチャー モードにすると、ユーザーが他のアプリをブラウジングしたり他のアプリを操作したりしている間も、コンテンツの表示を継続できます。
分割画面モードで実行中のモバイルアプリ

図 1. 分割画面モードで実行されるアプリ。

特にタブレットやその他の大画面デバイスでは、マルチウィンドウのサポートにより、新しい方法でユーザーを引き付けることができます。アプリ内でドラッグ&ドロップを有効にして、ユーザーがアプリとの間でコンテンツを簡単にドラッグできるようにすることもできます。これは、ユーザー エクスペリエンスを向上させるのに最適な方法です。

アプリにマルチウィンドウのサポートを追加し、マルチウィンドウ ディスプレイの処理方法を構成するのは簡単です。たとえば、アクティビティの最小許容ディメンションを指定して、ユーザーがアクティビティをそのサイズ以下にサイズ変更できないようにします。また、アプリのマルチウィンドウ ディスプレイを無効にして、アプリが全画面モードでのみ表示されるようにすることもできます。

詳細については、マルチウィンドウのサポートに関するデベロッパー向けドキュメントをご覧ください。

通知の機能強化

Android 7.0 では、通知が再設計され、さらに使いやすく高速になりました。変更の一部は次のとおりです。

  • テンプレートの更新: 通知テンプレートを更新して、ヒーロー画像とアバターに新たに重点を置いています。デベロッパーは、コードに最小限の変更を加えるだけで、新しいテンプレートを活用できます。
  • メッセージ スタイルのカスタマイズ: MessagingStyle クラスを使用すると、通知に関連付けられたユーザー インターフェース ラベルをさらにカスタマイズできます。メッセージ、会話のタイトル、コンテンツ ビューを構成できます。
  • バンドル通知: システムは、メッセージをトピック別などにグループ化し、そのグループを表示できます。ユーザーは、それらに対して「閉じる」や「アーカイブ」などの操作を行うことができます。Android Wear 向けの通知を実装したことがあるなら、このモデルはおなじみのものです。
  • ダイレクト リプライ: リアルタイム通信アプリの場合、Android システムはインライン リプライをサポートしているため、ユーザーは通知インターフェース内で SMS またはテキスト メッセージに直接すばやく応答できます。
  • カスタムビュー: 2 つの新しい API を使用すると、通知でカスタムビューを使用するときに、通知ヘッダーやアクションなどのシステム デコレーションを利用できます。
バンドルのメッセージ通知を表示するモバイル
1 通のメッセージの通知を表示しているモバイル
通知インターフェース内にインライン メッセージ返信を表示しているモバイル

図 2. バンドル通知とダイレクト返信。

新機能の実装方法については、通知ガイドをご覧ください。

プロファイルに基づく JIT/AOT コンパイル

Android 7.0 では、ART にコード プロファイリングを行うジャストインタイム(JIT)コンパイラを追加しました。これにより、実行中の Android アプリのパフォーマンスを継続的に改善できます。JIT コンパイラは、ART の現在の事前(AOT)コンパイラを補完し、ランタイム パフォーマンスの向上、ストレージ容量の節約、アプリのアップデートとシステム アップデートの高速化を支援します。

プロファイル ガイド付きコンパイルを使用すると、ART は実際の使用状況とデバイス上の条件に応じて、各アプリの AOT/JIT コンパイルを管理できます。たとえば、ART は各アプリのホットメソッドのプロファイルを保持し、最適なパフォーマンスを得るために、これらのメソッドをプリコンパイルしてキャッシュに保存します。アプリの他の部分は、実際に使用されるまでコンパイルされません。

プロファイル ガイド付きコンパイルは、アプリの主要部分のパフォーマンスを向上させるだけでなく、関連するバイナリを含むアプリの全体的な RAM 使用量を削減するのに役立ちます。この機能は、メモリの少ないデバイスで特に重要です。

ART は、デバイスのバッテリーへの影響を最小限に抑えるようにプロファイル ベースのコンパイルを管理します。プリコンパイルは、デバイスがアイドル状態で充電中の場合にのみ行われるため、事前にプリコンパイルを行うことで時間とバッテリーを節約できます。

アプリのインストールまでのクイック パス

ART の JIT コンパイラの最も明確なメリットの一つは、アプリのインストールとシステム アップデートの速度です。Android 6.0 では、大規模なアプリであっても最適化とインストールに数分かかる場合でも、わずか数秒でインストールできるようになりました。また、最適化の手順がなくなるため、システム アップデートにかかる時間も短縮されます。

Doze on the Go...

Android 6.0 で導入された Doze は、デバイスがアイドル状態のとき(テーブルや引き出しに置いているときなど)にアプリの CPU とネットワーク アクティビティを保留することでバッテリーを節約するシステムモードです。

Android 7.0 では、Doze がさらに一歩踏み込み、外出先からバッテリーを節約できるようになりました。 画面が一定時間オフでデバイスを電源から外すと、Doze により、使い慣れた CPU とネットワークの制限の一部がアプリに適用されます。 つまり、デバイスをポケットに入れて持ち運んでいても、バッテリーを節約できます。

Doze が第 1 レベルのシステム アクティビティ制限を適用してバッテリーを長持ちさせる仕組みを示すイラスト

図 3. Doze では、デバイスが静止していない場合でもバッテリー寿命を延ばすため、制限が適用されるようになりました。

デバイスがバッテリーで動作しているときに画面がオフになってからしばらくすると、Doze はネットワーク アクセスを制限し、ジョブと同期を保留します。短いメンテナンスの時間枠内に、アプリケーションにネットワーク アクセスが許可され、延期されたジョブ/同期が実行されます。画面をオンにするか、デバイスを電源に接続すると、デバイスの Doze モードは解除されます。

デバイスが再び静止状態になり、画面が一定期間オフでバッテリーが持続すると、Doze は PowerManager.WakeLock アラーム、AlarmManager アラーム、GPS/Wi-Fi スキャンに CPU とネットワーク全体の制限を適用します。

アプリを Doze に適応させるためのおすすめの方法は、デバイスが動いているかどうかにかかわらず同じです。そのため、Doze を適切に処理するようにすでにアプリを更新していれば、準備は完了です。そうでない場合は、アプリの Doze への適応を開始します。

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

Project Svelte は、エコシステム内のさまざまな Android デバイスでシステムとアプリによる RAM の使用を最小限に抑えるための継続的な取り組みです。Android 7.0 でのプロジェクト Svelte は、バックグラウンドでのアプリの実行方法の最適化に重点を置いています。

バックグラウンド処理は、ほとんどのアプリに不可欠な要素です。適切に処理すれば、コンテキストアウェアで瞬時に処理され、優れたユーザー エクスペリエンスを実現できます。バックグラウンド処理が正しく処理されないと、RAM(およびバッテリー)が不必要に消費され、他のアプリのシステム パフォーマンスに影響する可能性があります。

Android 5.0 以降、ユーザーに適した方法でバックグラウンド処理を実行するために、JobScheduler が推奨されています。アプリは、メモリ、電源、接続の状態に基づいてシステムを最適化しながら、ジョブをスケジュールできます。JobScheduler には制御とシンプルさが備わっているため、すべてのアプリで JobScheduler を使用することをおすすめします。

また、Google Play 開発者サービスの一部である GCMNetworkManager もおすすめです。同様のジョブ スケジューリングが提供され、以前のバージョンの Android と互換性があります。

Google は、より多くのユースケースに対応するために JobSchedulerGCMNetworkManager の拡張を続けています。たとえば、Android 7.0 では、コンテンツ プロバイダの変更に基づいてバックグラウンド処理をスケジュールできるようになりました。それと同時に、特にメモリの少ないデバイスでシステム パフォーマンスを低下させる可能性がある古いパターンの一部のサポートを終了し始めます。

Android 7.0 では、よく使用される 3 つの非明示的ブロードキャスト(CONNECTIVITY_ACTIONACTION_NEW_PICTUREACTION_NEW_VIDEO)が削除されます。これらは、複数のアプリのバックグラウンド プロセスを一度に起動して、メモリと電池を消耗させる可能性があるためです。アプリがこれらを受信している場合は、Android 7.0 を利用して、JobScheduler と関連 API に移行してください。

詳しくは、バックグラウンド処理の最適化のドキュメントをご覧ください。

SurfaceView

Android 7.0 では、SurfaceView クラスに同期移動が導入され、特定のケースにおいて、TextureView よりもバッテリーのパフォーマンスが向上します。動画や 3D コンテンツをレンダリングする場合、スクロールとアニメーション動画の位置を使用するアプリでは、SurfaceView の方が TextureView よりも消費電力が少なくなります。

SurfaceView クラスは、アプリ ウィンドウのコンテンツとは別に専用のハードウェアで合成されるため、画面上でのバッテリー効率の高い合成が可能になります。その結果、中間コピーは TextureView よりも少なくなります。

SurfaceView オブジェクトのコンテンツの位置が、それを含むアプリ コンテンツと同期して更新されるようになりました。この変更の結果の 1 つとして、SurfaceView で再生される動画の単純な翻訳やスケーリングでは、ビューの移動に伴って黒いバーが表示されなくなりました。

Android 7.0 以降では、TextureView ではなく SurfaceView を使用して電力を節約することを強くおすすめします。

データセーバー

[設定] のデータセーバー

図 4. [設定] のデータセーバー

通常、モバイル デバイスの全期間において、モバイルデータプランのコストは、デバイス自体のコストを上回ります。多くのユーザーにとって、モバイルデータは、節約したい高価なリソースです。

Android 7.0 ではデータセーバー モードが導入されています。これは新しいシステム サービスで、ローミング時、請求期間の終了間際、小規模なプリペイド データパックのいずれにおいても、アプリによるモバイルデータ使用量を削減できます。データセーバーを使用すると、ユーザーはアプリによるモバイルデータの使用方法を制御し、データセーバーがオンの場合にデベロッパーはより効率的にサービスを提供できるようになります。

ユーザーが [設定] でデータセーバーを有効にし、デバイスが従量制課金ネットワークに接続されている場合、システムはバックグラウンドでのデータ使用をブロックし、可能な限りフォアグラウンドでのデータ使用を減らすようアプリに指示します(ストリーミングのビットレートの制限、画質の低下、オプティミスティック プレキャッシュの延期など)。ユーザーは、データセーバーがオンになっていても、特定のアプリでバックグラウンドでの従量制課金接続を許可することができます。

Android 7.0 では ConnectivityManager が拡張され、ユーザーのデータセーバー設定を取得して設定変更を監視する方法をアプリに提供できます。すべてのアプリは、ユーザーがデータセーバーを有効にしているかどうかを確認し、フォアグラウンドとバックグラウンドでのデータ使用量を抑えるようにする必要があります。

Vulkan API

Android 7.0 では、新しい 3D レンダリング API である VulkanTM がプラットフォームに統合されています。OpenGLTM ES と同様に、Vulkan は Khronos Group が管理する 3D グラフィックとレンダリングのオープン スタンダードです。

Vulkan は、ドライバの CPU オーバーヘッドを最小限に抑え、アプリが GPU の動作をより直接的に制御できるようにゼロから設計されています。また、Vulkan は複数のスレッドが処理(コマンド バッファの構築など)を行えるようにすることで、並列化を改善します。

Vulkan の開発ツールとライブラリは Android 7.0 SDK に含まれています。これには、次のようなものがあります。

  • ヘッダー
  • 検証レイヤ(デバッグ ライブラリ)
  • SPIR-V シェーダー コンパイラ
  • SPIR-V ランタイム シェーダー コンパイル ライブラリ

Vulkan は、Nexus 5X、Nexus 6P、Nexus Player などの Vulkan 対応ハードウェアを備えたデバイスのアプリでのみ使用できます。Google はパートナーと緊密に連携し、できる限り早く Vulkan をより多くのデバイスに導入できるよう取り組んでいます。

詳細については、API ドキュメントをご覧ください。

クイック設定タイル API

通知シェードのクイック設定タイル

図 5. 通知シェードのクイック設定タイル

クイック設定は、通知シェードから主要な設定とアクションを直接公開するための一般的な方法です。Android 7.0 では、クイック設定の範囲が拡張され、さらに便利で便利になりました。

クイック設定タイル用のスペースが広がりました。ユーザーは、左または右にスワイプして、ページ分割された表示領域全体にアクセスできます。また、クイック設定タイルの表示場所や表示場所をユーザーが制御できるようにしました。タイルをドラッグ&ドロップするだけで、タイルを追加したり移動したりできます。

デベロッパー向けに、Android 7.0 では新しい API も追加されています。これにより、独自のクイック設定タイルを定義して、ユーザーがアプリの主なコントロールやアクションに簡単にアクセスできるようになります。

クイック設定タイルは、緊急に必要な、または頻繁に使用されるコントロールやアクション用に予約されており、アプリを起動するためのショートカットとしては使用しないでください。

タイルを定義すると、そのタイルをユーザーに表示できるようになります。ユーザーはタイルをドラッグ&ドロップするだけでクイック設定に追加できます。

アプリタイルの作成については、Tile のリファレンス ドキュメントをご覧ください。

番号のブロック

Android 7.0 では、プラットフォームで番号のブロックがサポートされ、サービス プロバイダがブロックした番号のリストを維持できるようにするフレームワーク API が提供されています。デフォルトの SMS アプリ、デフォルトの電話アプリ、携帯通信会社アプリは、ブロックする番号のリストに対する読み取り / 書き込みを行うことができます。他のアプリはこのリストにアクセスできません。

Android では、番号ブロックをプラットフォームの標準機能にすることで、さまざまなデバイスで一貫した方法で番号のブロックをアプリでサポートできます。アプリが活用できるその他のメリットは次のとおりです。

  • 通話時にブロックした電話番号はテキスト メッセージでもブロックされます
  • ブロックした電話番号は、バックアップと復元機能を使用することで、リセットした場合やデバイスが変わっても保持できます
  • 複数のアプリで同一のブロック済み電話番号のリストを使用できます。

また、Android を介した携帯通信会社アプリの統合により、携帯通信会社はデバイス上でブロックされた番号のリストを読み取り、ユーザーに対してサービス側のブロックを実行することで、VOIP エンドポイントや転送電話などの任意のメディアからユーザーに不要な通話やテキストが届かないようにすることができます。

詳細については、BlockedNumberContract のリファレンス ドキュメントをご覧ください。

コール スクリーニング

Android 7.0 では、デフォルトの電話アプリで着信をスクリーニングできます。スマートフォン アプリは、新しい CallScreeningService を実装することでこれを行います。これにより、スマートフォン アプリは着信の Call.Details に基づいて、次のようなさまざまなアクションを実行できます。

  • 着信を拒否する
  • 通話履歴の呼び出しを許可しない
  • ユーザーに通話の通知を表示しない

詳細については、CallScreeningService のリファレンス ドキュメントをご覧ください。

マルチロケールのサポート、対応言語の追加

Android 7.0 では、ユーザーが [設定] で複数の言語 / 地域を選択できるようになり、バイリンガルのユースケースのサポートが強化されました。アプリでは、新しい API を使用してユーザーが選択した言語 / 地域を取得し、マルチロケールのユーザーに対し、より洗練されたユーザー エクスペリエンスを提供できます。たとえば、検索結果を複数の言語で表示したり、ユーザーが知っている言語でウェブページを翻訳したりできます。

Android 7.0 では、マルチロケールのサポートに加えて、ユーザーが利用できる言語の範囲も拡大されています。英語、スペイン語、フランス語、アラビア語など、一般的に使用される言語ごとに 25 を超えるバリエーションが用意されています。また、100 を超える新しい言語に対する部分的なサポートも追加されています。

アプリは、LocaleList.GetDefault() を呼び出すことで、ユーザーが設定したロケールのリストを取得できます。ロケール数の増加に対応するために、Android 7.0 ではリソースの解決方法が変更されました。新しいリソース解決ロジックでアプリが正常に機能することをテストおよび確認してください。

新しいリソース解決動作と従うべきベスト プラクティスについては、多言語サポートをご覧ください。

新しい絵文字

Android 7.0 には、肌の色の絵文字やバリエーション セレクタのサポートなど、追加の絵文字と絵文字関連機能が導入されています。アプリが絵文字をサポートしている場合は、以下のガイドラインに沿って、絵文字関連の機能を利用します。

  • 絵文字を挿入する前に、デバイスに絵文字が含まれていることを確認します。 システム フォントに表示される絵文字を確認するには、hasGlyph(String) メソッドを使用します。
  • 絵文字がバリエーション セレクタに対応していることを確認する。 バリエーション セレクタを使用すると、特定の絵文字をカラーまたは白黒で表示できます。 モバイル デバイスでは、アプリは絵文字をモノクロではなくカラーで表す必要があります。ただし、アプリでテキストにインラインで絵文字を表示する場合は、白黒のバリエーションを使用する必要があります。 絵文字にバリエーションがあるかどうかを確認するには、バリエーション セレクタを使用します。 バリエーションがある文字の完全なリストについては、 バリエーションに関する Unicode ドキュメント絵文字バリエーション シーケンスのセクションをご覧ください。
  • 絵文字が肌の色に対応していることを確認します。Android 7.0 では、レンダリングされる絵文字の肌の色を好みに合わせて変更できます。キーボード アプリでは、複数の肌の色を持つ絵文字を視覚的に表示し、ユーザーが好みの肌の色を選択できるようにする必要があります。肌の色の修飾子があるシステム絵文字を確認するには、hasGlyph(String) メソッドを使用します。どの絵文字が肌の色を使用しているかを確認するには、 Unicode のドキュメントをご覧ください。

Android の ICU4J API

Android 7.0 では、Android フレームワークの android.icu パッケージで ICU4J API のサブセットが提供されるようになりました。移行は簡単で、ほとんどの場合、com.java.icu 名前空間から android.icu に変更するだけです。アプリですでに ICU4J バンドルを使用している場合は、Android フレームワークで提供される android.icu API に切り替えることで、APK サイズを大幅に削減できます。

Android ICU4J API の詳細については、ICU4J のサポートをご覧ください。

WebView

Chrome と WebView の連携

Android 7.0 以降の Chrome バージョン 51 以降では、デバイス上の Chrome APK が Android システムの WebView の提供とレンダリングに使用されます。このアプローチにより、デバイス自体のメモリ使用量が改善され、WebView を最新の状態に保つために必要な帯域幅も削減されます(Chrome が有効である限り、スタンドアロンの WebView APK は更新されなくなるため)。

WebView プロバイダを選択するには、開発者向けオプションを有効にして [WebView の実装] を選択します。WebView 実装として機能させるには、デバイスにインストールされている互換性のある Chrome バージョン(Dev、Beta、Stable)のいずれか、またはスタンドアロンの WebView APK を使用できます。

マルチプロセス

Android 7.0 の Chrome バージョン 51 以降、開発者向けオプションの [WebView のマルチプロセス] を有効にすると、WebView は別のサンドボックス プロセスでウェブ コンテンツを実行します。

Android の今後のバージョンでマルチプロセス WebView を有効にする前に、N での互換性とランタイム パフォーマンスに関するフィードバックを求めています。このバージョンでは、起動時間、合計メモリ使用量、ソフトウェア レンダリング パフォーマンスの低下が予想されます。

マルチプロセス モードで予期しない問題が見つかった場合は、お知らせください。Chromium バグトラッカーで WebView チームにお問い合わせください。

ページの読み込み前に JavaScript が実行される

Android 7.0 以降を対象とするアプリでは、新しいページが読み込まれると JavaScript のコンテキストがリセットされます。現在、コンテキストは新しい WebView インスタンスで最初に読み込まれるページに引き継がれます。

WebView に JavaScript を挿入する場合は、ページの読み込みが始まった後にスクリプトを実行する必要があります。

安全でないオリジンの位置情報

Android 7.0 以降を対象とするアプリでは、Geolocation API は安全なオリジン(HTTPS 経由)でのみ許可されます。このポリシーは、ユーザーが安全でない接続を使用しているときにユーザーの個人情報を保護することを目的としています。

WebView(ベータ版)を使用したテスト

WebView は定期的に更新されるため、WebView のベータ版チャンネルを使用して、アプリとの互換性を頻繁にテストすることをおすすめします。Android 7.0 でプレリリース版の WebView のテストを開始するには、Chrome Dev または Chrome ベータ版をダウンロードしてインストールし、前述のように開発者向けオプションで WebView 実装として選択します。WebView の新しいバージョンがリリースされる前に修正できるよう、Chromium バグトラッカーから問題を報告してください。

OpenGLTM ES 3.2 API

Android 7.0 には、次のような OpenGL ES 3.2 のフレームワーク インターフェースとプラットフォーム サポートが追加されています。

  • Android 拡張機能パック(AEP)のすべての拡張機能(EXT_texture_sRGB_decode を除く)。
  • HDR と遅延シェーディング用の浮動小数点フレームバッファ。
  • バッチ処理とストリーミング処理を改善するための BaseVertex 描画呼び出し。
  • WebGL のオーバーヘッドを削減する堅牢なバッファ アクセス制御。

Android 7.0 の OpenGL ES 3.2 用のフレームワーク API は、GLES32 クラスで提供されます。OpenGL ES 3.2 を使用する場合は、<uses-feature> タグと android:glEsVersion 属性を使用して、マニフェスト ファイルで要件を宣言してください。

デバイスでサポートされている OpenGL ES バージョンを実行時にチェックする方法など、OpenGL ES の使用方法については、OpenGL ES API ガイドをご覧ください。

Android TV の録画機能

Android 7.0 では、新しい録画 API を使用して Android TV 入力サービスのコンテンツを録画して再生する機能が追加されています。TV 入力サービスは、既存のタイムシフト API に基づいて構築されており、録画できるチャンネル データ、録画セッションの保存方法を制御し、録画コンテンツに対するユーザー操作を管理できます。

詳しくは、Android TV Recording API をご覧ください。

Android for Work

Android for Work では、Android 7.0 搭載デバイス向けに多くの新機能や API が追加されています。主な機能は次のとおりです。機能の完全なリストについては、Android Enterprise の機能リストをご覧ください。

仕事用プロファイルのセキュリティ チャレンジ

N SDK をターゲットとするプロファイル オーナーは、仕事用プロファイルで実行されるアプリに対して、別のセキュリティ チャレンジを指定できます。ユーザーが仕事用アプリを開こうとすると、仕事用チャレンジが表示されます。セキュリティの確認に成功すると、仕事用プロファイルのロックが解除され、必要に応じて復号されます。プロファイル オーナーの場合、ACTION_SET_NEW_PASSWORD はユーザーに仕事用チャレンジを設定するように求め、ACTION_SET_NEW_PARENT_PROFILE_PASSWORD はユーザーにデバイスのロックを設定するように求めます。

プロファイル所有者は、setPasswordQuality()setPasswordMinimumLength()、および関連するメソッドを使用して、仕事用プロファイルの本人確認に個別のパスコード ポリシー(PIN に必要な期間、プロファイルのロック解除に指紋を使用できるかどうかなど)を設定できます。プロファイルの所有者は、新しい getParentProfileInstance() メソッドから返される DevicePolicyManager インスタンスを使用してデバイスのロックを設定することもできます。 さらに、プロファイル オーナーは、新しい setOrganizationColor() メソッドと setOrganizationName() メソッドを使用して、ワーク チャレンジの認証情報画面をカスタマイズできます。

仕事用アプリをオフにする

仕事用プロファイルが設定されたデバイスでは、ユーザーは仕事用モードを切り替えることができます。ワークモードがオフの場合、管理対象ユーザーは一時的にシャットダウンされ、仕事用プロファイルのアプリ、バックグラウンド同期、通知が無効になります。これには、プロファイル所有者アプリが含まれます。ワークモードがオフの場合、仕事用アプリを起動できないことを示すステータス アイコンが常に表示されます。ランチャーは、仕事用アプリとウィジェットにアクセスできないことを示します。

常時接続 VPN

デバイス オーナーとプロファイル オーナーは、指定した VPN を介して仕事用アプリが常に接続するように設定できます。デバイスが起動すると、システムは VPN を自動的に開始します。

新しい DevicePolicyManager メソッドは setAlwaysOnVpnPackage()getAlwaysOnVpnPackage() です。

VPN サービスは、アプリの操作なしでシステムによって直接バインドできるため、常時接続 VPN の新しいエントリ ポイントを VPN クライアントが処理する必要があります。前述のように、サービスはインテント フィルタ マッチング アクション android.net.VpnService によってシステムに通知されます。

[設定] > [その他] > [VPN] を使用して、VPNService メソッドを実装する常時接続 VPN クライアントを手動で設定することもできます。[設定] から常時接続 VPN を有効にするオプションは、VPN クライアントが API レベル 24 をターゲットとしている場合にのみ使用できます。

カスタマイズされたプロビジョニング

アプリでは、コーポレート カラーやロゴを使用して、プロファイル オーナーとデバイス オーナーのプロビジョニング フローをカスタマイズできます。DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR はフローの色をカスタマイズします。DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI は、会社のロゴでフローをカスタマイズします。

ユーザー補助機能の機能強化

Android 7.0 では、新しいデバイスのセットアップのウェルカム画面で [ビジョン設定] が直接使用できるようになりました。これにより、ユーザーは、拡大操作、フォントサイズ、表示サイズ、TalkBack などのユーザー補助機能をデバイスで見つけて設定することがはるかに簡単になります。

こうしたユーザー補助機能がより目立つ位置に配置されるため、ユーザーがその機能を有効にしてアプリを試用する可能性が高まります。これらの設定を有効にして、早い段階でアプリをテストしてください。これは [設定] > [ユーザー補助] で有効にできます。

また、Android 7.0 では、ユーザー補助サービスにより、運動障がいのあるユーザーでも画面をタップできるようになりました。新しい API を使用すると、顔追跡、視線追跡、ポイント スキャンなどの機能を備えたサービスを構築し、ユーザーのニーズを満たすことができます。

詳細については、GestureDescription のリファレンス ドキュメントをご覧ください。

ダイレクト ブート

ダイレクト ブートにより、デバイスの起動時間を短縮できます。また、予期しない再起動の後でも、登録済みのアプリの機能が制限されます。たとえば、ユーザーが睡眠中に暗号化されたデバイスが再起動した場合、登録済みのアラーム、メッセージ、着信で引き続き通常どおりユーザーに通知できます。つまり、再起動後すぐにユーザー補助サービスも利用できます。

ダイレクト ブートは、Android 7.0 のファイルベースの暗号化を利用して、システムとアプリデータの両方に対してきめ細かい暗号化ポリシーを有効にします。システムは、一部のシステムデータと明示的に登録されたアプリデータに対して、デバイス暗号化ストアを使用します。デフォルトでは、他のすべてのシステムデータ、ユーザーデータ、アプリ、アプリデータには、認証情報暗号化ストアが使用されます。

起動時に、システムは制限付きモードで起動し、デバイス暗号化データのみにアクセスでき、アプリやデータへの一般的なアクセスは行いません。このモードで実行するコンポーネントがある場合は、マニフェストでフラグを設定して登録できます。再起動後、システムは LOCKED_BOOT_COMPLETED インテントをブロードキャストして、登録済みのコンポーネントを有効にします。システムは、ロック解除前に、登録済みのデバイス暗号化アプリデータを使用できるようにします。その他のデータはすべて、ユーザーがロック画面の認証情報を確認して復号するまで使用できません。

詳細については、ダイレクト ブートをご覧ください。

鍵構成証明

Android 7.0 では、鍵構成証明が導入されています。これは、デバイスのハードウェア格納型キーストアに格納されている鍵ペアが、アプリで使用する機密情報を適切に保護していることを確認するための新しいセキュリティ ツールです。このツールを使用すると、アプリを実行しているデバイスの root 権限が取得されている場合でも、アプリがセキュアなハードウェアに存在する鍵を操作できるようになります。ハードウェア格納型キーストアの鍵をアプリで使用する場合、特に鍵を使用してアプリ内の機密情報を検証する場合は、このツールを使用する必要があります。

キーの構成証明を使用すると、デバイスの高信頼実行環境(TEE)内のデバイスのハードウェア格納型キーストアに、RSA または EC の鍵ペアが作成されて保存されていることを確認できます。このツールを使用すると、アプリのバックエンド サーバーなどのデバイス外のサービスを使用して、鍵ペアの使用と有効性を判断し、厳密な検証を行うことができます。こうした機能により、デバイスの root 権限が取得された場合や、デバイス上で実行されている Android プラットフォームのセキュリティが侵害された場合でも、鍵ペアを保護するためのセキュリティが強化されます。

注: ハードウェア レベルのキー構成証明をサポートしているのは、Android 7.0 を搭載したごく一部のデバイスのみです。Android 7.0 を搭載している他のすべてのデバイスでは、ソフトウェアレベルのキー構成証明が使用されます。実稼働レベルの環境でデバイスのハードウェア格納型キーのプロパティを検証する前に、デバイスがハードウェア レベルのキー構成証明をサポートしていることを確認する必要があります。そのためには、Google 構成証明ルートキーによって署名されたルート証明書が構成証明書チェーン内に含まれているか、キー説明データ構造内の attestationSecurityLevel 要素が TrustedEnvironment セキュリティ レベルに設定されているかを確認する必要があります。

詳細については、鍵構成証明のデベロッパー向けドキュメントをご覧ください。

ネットワーク セキュリティ構成

Android 7.0 では、エラーが発生しやすい従来のプログラム API(X509TrustManager など)の代わりに宣言型のネットワーク セキュリティ構成を使用することで、コードを変更せずに安全な(HTTPS、TLS)接続の動作をアプリで安全にカスタマイズできます。

サポートされる機能:

  • カスタム トラスト アンカー。アプリケーションで、セキュアな接続でどの認証局(CA)を信頼するかをカスタマイズできます。たとえば、特定の自己署名証明書や制限された一連の公開 CA を信頼します。
  • デバッグ専用のオーバーライド。アプリ デベロッパーは、インストール ベースに対する追加リスクなしに、アプリのセキュアな接続を安全にデバッグできます。
  • クリアテキスト トラフィックのオプトアウト。クリアテキスト トラフィックの意図しない使用からアプリを保護できます。
  • 証明書のピン留め。安全な接続で信頼するサーバーキーをアプリケーションで制限できる高度な機能です。

詳細については、ネットワーク セキュリティ構成をご覧ください。

デフォルトの信頼できる認証局

デフォルトでは、Android 7.0 をターゲットとするアプリはシステムが提供する証明書のみを信頼し、ユーザーが追加した認証局(CA)を信頼しなくなります。Android 7.0(API レベル 24)をターゲットとするアプリで、ユーザーが追加した CA を信頼する場合は、ネットワーク セキュリティ構成を使用して、ユーザー CA の信頼方法を指定する必要があります。

APK 署名スキーム v2

Android 7.0 では、APK 署名スキーム v2 が導入されています。これは、アプリのインストール時間を短縮し、APK ファイルの不正な変更に対する保護を強化する新しいアプリ署名スキームです。デフォルトでは、Android Studio 2.2 と Android Plugin for Gradle 2.2 は、APK 署名スキーム v2 と従来の署名スキーム(JAR 署名を使用する)の両方を使用してアプリに署名します。

APK 署名スキーム v2 をアプリに適用することをおすすめしますが、この新しいスキームは必須ではありません。APK 署名スキーム v2 の使用時にアプリが正しくビルドされない場合は、新しいスキームを無効にできます。無効化プロセスにより、Android Studio 2.2 と Android Plugin for Gradle 2.2 は、従来の署名スキームのみを使用してアプリに署名します。従来のスキームのみで署名するには、モジュール レベルの build.gradle ファイルを開き、v2SigningEnabled false の行をリリース署名設定に追加します。

  android {
    ...
    defaultConfig { ... }
    signingConfigs {
      release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
        v2SigningEnabled false
      }
    }
  }

注意: APK 署名スキーム v2 を使用してアプリに署名した後、さらにアプリに変更を加えると、アプリの署名は無効になります。このため、APK 署名スキーム v2 を使用してアプリに署名した後ではなく、署名する前に zipalign などのツールを使用してください。

詳しくは、Android Studio で アプリに署名する方法と、Android Plugin for Gradle を使用して アプリに署名するためのビルドファイルを設定する方法が記載された Android Studio のドキュメントをご覧ください。

特定のディレクトリへのアクセス

Android 7.0 では、アプリで新しい API を使用して、特定の外部ストレージ ディレクトリ(SD カードなどのリムーバブル メディア上のディレクトリを含む)へのアクセスをリクエストできます。新しい API を使用すると、アプリが標準の外部ストレージ ディレクトリ(Pictures ディレクトリなど)にアクセスする方法が大幅に簡素化されます。写真アプリなどのアプリでは、すべてのストレージ ディレクトリへのアクセス権を付与する READ_EXTERNAL_STORAGE や、ユーザーにディレクトリに移動させるストレージ アクセス フレームワークの代わりに、これらの API を使用できます。

また、新しい API により、ユーザーがアプリに外部ストレージへのアクセスを許可する手順が簡素化されます。新しい API を使用すると、システムは、アプリがアクセスをリクエストしているディレクトリを明示するシンプルな権限 UI を使用します。

詳細については、特定のディレクトリへのアクセスに関するデベロッパー向けドキュメントをご覧ください。

キーボード ショートカット ヘルパー

Android 7.0 では、ユーザーが Meta + / を押して [キーボード ショートカット] 画面をトリガーできます。この画面には、システムと、フォーカスされているアプリの両方で使用できるすべてのショートカットが表示されます。ショートカットが存在する場合、これらのショートカットはアプリのメニューから自動的に取得されます。微調整済みの独自のショートカット リストを画面に用意することもできます。そのためには、onProvideKeyboardShortcuts() メソッドをオーバーライドします。

注: Meta キーはすべてのキーボードに存在するわけではありません。Macintosh キーボードでは Command キー、Windows キーボードでは Windows キー、Pixel C と ChromeOS キーボードでは検索キーです。

アプリ内のどこからでもキーボード ショートカット ヘルパーをトリガーするには、関連するアクティビティから requestShowKeyboardShortcuts() を呼び出します。

カスタム ポインタ API

Android 7.0 には、ポインタの外観、可視性、動作をカスタマイズできるカスタム ポインタ API が導入されています。この機能は、ユーザーがマウスやタッチパッドを使用して UI オブジェクトを操作する場合に特に便利です。デフォルトのポインタでは標準アイコンが使用されます。この API には、マウスやタッチパッドの特定の動きに基づいてポインタ アイコンの外観を変更するなど、高度な機能も含まれています。

ポインタ アイコンを設定するには、View クラスの onResolvePointerIcon() メソッドをオーバーライドします。このメソッドは、PointerIcon オブジェクトを使用して、特定のモーション イベントに対応するアイコンを描画します。

パフォーマンス維持 API

長時間実行されるアプリでは、デバイス コンポーネントが温度の上限に達するとシステムがシステム オン チップ エンジンをスロットリングするため、パフォーマンスが大幅に変動する可能性があります。この変動は、高パフォーマンスで長時間実行されるアプリを作成するアプリ デベロッパーにとって、ターゲットが動くことを示唆しています。

こうした制限に対処するために、Android 7.0 ではパフォーマンス維持モードがサポートされており、OEM は長時間実行されるアプリのデバイス パフォーマンス機能に関するヒントを提供できます。アプリ デベロッパーはこれらのヒントを使用して、長期にわたって予測可能で一貫したレベルのデバイス パフォーマンスに合わせてアプリを調整できます。

アプリ デベロッパーは、Nexus 6P デバイスでのみ、Android 7.0 でこの新しい API を試すことができます。この機能を使用するには、パフォーマンス維持モードで実行するウィンドウにパフォーマンス維持ウィンドウ フラグを設定します。このフラグは、Window.setSustainedPerformanceMode() メソッドを使用して設定します。ウィンドウがフォーカスされなくなると、このモードは自動的に無効になります。

VR のサポート

Android 7.0 では、新しい VR モードに対するプラットフォームのサポートと最適化が追加され、デベロッパーはユーザー向けに高品質なモバイル VR 体験を構築できるようになりました。VR アプリ専用の CPU コアへのアクセスなど、多くのパフォーマンスが強化されています。アプリでは、VR に適したインテリジェントなヘッド トラッキングやステレオ通知を利用できます。最も重要な点は、Android 7.0 は非常に低レイテンシのグラフィックを提供していることです。Android 7.0 用の VR アプリの作成について詳しくは、Google VR SDK for Android をご覧ください。

Android 7.0 では、印刷サービスのデベロッパーが、個々のプリンタや印刷ジョブに関する追加情報を表示できるようになりました。

個々のプリンタを一覧表示する場合、印刷サービスは次の 2 つの方法でプリンタごとのアイコンを設定できるようになりました。

さらに、setInfoIntent() を呼び出すことで、プリンタごとのアクティビティで追加情報を表示できます。

印刷ジョブ通知で印刷ジョブの進行状況とステータスを指定するには、それぞれ setProgress()setStatus() を呼び出します。

フレーム指標 API

Frame Metrics API を使用すると、アプリで UI レンダリング パフォーマンスをモニタリングできます。この API は、アプリの現在のウィンドウのフレーム タイミング情報を転送するためのストリーミング Pub/Sub API を公開することで、この機能を提供します。返されるデータは、adb shell dumpsys gfxinfo framestats で表示されるデータと同じですが、過去 120 フレームに限定されません。

Frame Metrics API を使用すると、USB 接続を使用せずに、本番環境でインタラクション レベルの UI パフォーマンスを測定できます。この API を使用すると、adb shell dumpsys gfxinfo よりもはるかに細かい粒度でデータを収集できます。このように詳細な粒度が実現されるのは、システムがアプリ内の特定の操作に関するデータを収集できるためです。システムは、アプリ全体のパフォーマンスのグローバル サマリーをキャプチャしたり、グローバルな状態をクリアしたりする必要はありません。この機能を使用してパフォーマンス データを収集し、アプリ内の実際のユースケースで UI パフォーマンスの低下を検出できます。

ウィンドウをモニタリングするには、OnFrameMetricsAvailableListener.onFrameMetricsAvailable() コールバック メソッドを実装し、そのウィンドウに登録します。

この API には FrameMetrics オブジェクトが用意されています。このオブジェクトには、レンダリング サブシステムがフレームのライフサイクルのさまざまなマイルストーンで報告する時間データが含まれています。サポートされている指標は、UNKNOWN_DELAY_DURATIONINPUT_HANDLING_DURATIONANIMATION_DURATIONLAYOUT_MEASURE_DURATIONDRAW_DURATIONSYNC_DURATIONCOMMAND_ISSUE_DURATIONSWAP_BUFFERS_DURATIONTOTAL_DURATIONFIRST_DRAW_FRAME です。

仮想ファイル

以前のバージョンの Android では、アプリでストレージ アクセス フレームワークを使用して、ユーザーが Google ドライブなどのクラウド ストレージ アカウントからファイルを選択できるようにしていました。しかし、バイトコードを直接表現していないファイルを表現する方法はありませんでした。すべてのファイルは入力ストリームを提供する必要がありました。

Android 7.0 では、ストレージ アクセス フレームワークに仮想ファイルのコンセプトが追加されています。仮想ファイル機能を使用すると、直接バイトコード表現がない場合でも、ACTION_VIEW インテントで使用できるドキュメント URI を DocumentsProvider から返すことができます。Android 7.0 では、ユーザー ファイル(仮想またはそれ以外)に代替形式を提供することもできます。

仮想ファイルを開く方法については、ストレージ アクセス フレームワーク ガイドの仮想ファイルを開くをご覧ください。