デベロッパー向け 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 を使用すると、通知でカスタムビューを使用する際に、通知ヘッダーやアクションなどのシステム デコレーションを活用できるようになります。
バンドルされたメッセージの通知を表示するモバイル
単一メッセージ通知を表示するモバイル
通知インターフェース内にインライン メッセージ返信を表示するモバイル

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

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

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

Android 7.0 では、ART にプロファイリングするコードを使用する Just in Time(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 は CPU とネットワークの完全な制限を PowerManager.WakeLock アラーム、AlarmManager アラーム、GPS/Wi-Fi スキャンに適用します。

アプリを Doze に適合させるためのベスト プラクティスは、デバイスが動いているかどうかにかかわらず同じです。そのため、Doze を適切に処理するようにすでにアプリを更新していれば、準備は完了です。まだ Doze モードになっていない場合は、アプリの Doze への対応を開始してください。

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

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

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

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

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

今後も、より多くのユースケースに対応するために 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 コンテンツをレンダリングする場合、スクロールとアニメーション動画の位置があるアプリでは、TextureView よりも SurfaceView の方が消費電力が少なくなります。

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

SurfaceView オブジェクトのコンテンツの位置が、それを含むアプリ コンテンツと同期して更新されるようになりました。この変更の結果、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 ドキュメントをご覧ください。

クイック設定 Tile 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 を有効にする前に、Android N における互換性とランタイム パフォーマンスに関するフィードバックを求めています。このバージョンでは、起動時間、合計メモリ使用量、ソフトウェア レンダリング パフォーマンスの回帰が想定されています。

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

ページ読み込み前に JavaScript を実行する

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

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

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

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

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

WebView は定期的に更新されるため、WebView の Beta チャンネルを使用してアプリとの互換性を頻繁にテストすることをおすすめします。Android 7.0 でプレリリース版の WebView のテストを開始するには、Chrome Dev または Chrome ベータ版をダウンロードしてインストールし、前述のように開発者向けオプションで WebView 実装として選択します。WebView の新しいバージョンがリリースされる前に Google が修正できるように、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 入力サービスのコンテンツを録画および再生する機能が追加されています。既存のタイムシフト 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 権限が取得されている場合でも、アプリがセキュアなハードウェアに存在する鍵とやり取りすることがさらに確実になります。ハードウェア格納型キーストアの鍵をアプリで使用する場合、特に鍵を使用してアプリ内の機密情報を検証する場合に、このツールを使用する必要があります。

鍵構成証明を使用すると、RSA または EC 鍵ペアが作成され、デバイスの高信頼実行環境(TEE)内にあるデバイスのハードウェア格納型キーストアに保持されていることを確認できます。また、このツールを使用すると、アプリのバックエンド サーバーなどのデバイス外のサービスを使用して、鍵ペアの使用と有効性を判定し、その有効性を厳密に検証することもできます。こうした機能により、デバイスの 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 と Gradle 2.2 用の Android プラグインは、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 は長時間実行されるアプリのデバイス パフォーマンス機能に関するヒントを提供できます。アプリ デベロッパーはこれらのヒントを使用して、長期にわたって予測可能で一貫したレベルのデバイス パフォーマンスを実現するようアプリを調整できます。

アプリ デベロッパーは、Android 7.0 以降、Nexus 6P デバイス上でのみこの新しい 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 では、ストレージ アクセス フレームワークに仮想ファイルのコンセプトが追加されています。仮想ファイル機能を使用すると、DocumentsProvider は、直接的なバイトコード表現がない場合でも、ACTION_VIEW インテントで使用できるドキュメント URI を返すことができます。Android 7.0 では、ユーザー ファイル(仮想ファイルまたはそれ以外)に代替形式を提供することもできます。

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