1page.title=動作の変更点 2page.keywords=preview,sdk,compatibility 3meta.tags="preview", "compatibility" 4page.tags="preview", "developer preview" 5page.image=images/cards/card-n-changes_2x.png 6@jd:body 7 8 9<div id="qv-wrapper"> 10<div id="qv"> 11 12<h2>このドキュメントの内容</h2> 13 14<ol> 15 <li><a href="#perf">パフォーマンスの向上</a> 16 <ol> 17 <li><a href="#doze">Doze</a></li> 18 <li><a href="#bg-opt">バックグラウンド処理の最適化</a></li> 19 </ol> 20 </li> 21 <li><a href="#perm">パーミッションの変更</a> 22 </li> 23 <li><a href="#sharing-files">アプリ間のファイルの共有</a></li> 24 <li><a href="#accessibility">ユーザー補助機能の改善</a> 25 <ol> 26 <li><a href="#screen-zoom">画面のズーム</a></li> 27 <li><a href="#vision-settings">セットアップ ウィザードの [Vision Settings]</a></li> 28 </ol> 29 </li> 30 <li><a href="#ndk">プラットフォーム ライブラリにリンクした NDK アプリ</a></li> 31 <li><a href="#afw">Android for Work</a></li> 32 <li><a href="#annotations">アノテーションの保持</a></li> 33 <li><a href="#other">その他の重要事項</a></li> 34</ol> 35 36<h2>関連ドキュメント</h2> 37<ol> 38 <li><a href="{@docRoot}preview/api-overview.html">Android N API の概要</a> 39</li> 40</ol> 41 42</div> 43</div> 44 45 46<p> 47 新しい機能に加えて、Android N では、さまざまなシステムおよび API の動作が変更されています。 48このドキュメントでは、アプリ開発において把握しておくべき主な変更点について説明します。 49 50 51</p> 52 53<p> 54 過去に Android 向けのアプリを公開したことがある場合は、そのアプリが今回のプラットフォームの変更による影響を受ける可能性があることに注意してください。 55 56</p> 57 58 59<h2 id="perf">電池とメモリ</h2> 60 61<p> 62Android N では、端末の電池寿命を改善したり、RAM の使用量を削減したりするために、システムの動作がいくつか変更されています。 63これらの変更は、システム リソースへのアプリのアクセスに加え、特定の暗黙的インテントを介して他のアプリとやり取りする方法に影響を及ぼす可能性があります。 64 65 66</p> 67 68<h3 id="doze">Doze</h3> 69 70<p> 71 Android 6.0(API レベル 23)で Doze が導入されました。これは、ユーザーが端末を電源と接続せずに静止状態にし、画面をオフにすると、CPU とネットワークのアクティビティを保留して電池寿命を改善するものです。 72 73Android N では、Doze が改良されています。端末を電源と接続せずに画面をオフにすると、端末が静止していなくても(たとえば、ユーザーが携帯端末をポケットに入れて持ち歩いている場合)、CPU およびネットワーク制限のサブセットがアプリに適用されます。 74 75 76 77</p> 78 79 80<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" /> 81<p class="img-caption"> 82 <strong>図 1.</strong> Doze が第 1 レベルのシステム アクティビティ制限を適用して、電池寿命を改善 83 84</p> 85 86<p> 87 端末が電池電源で動作しているときに画面をしばらくオフにすると、端末は Doze モードになり、制限の最初のサブセットが適用されます。 88これにより、アプリのネットワーク アクセスが切断されてジョブと同期が保留されます。 89端末が Doze モードに入った後、しばらくの間静止状態になると、残りの Doze 制限が {@link android.os.PowerManager.WakeLock}、{@link android.app.AlarmManager} アラーム、GPS、Wi-Fi スキャンに適用されます。 90 91 92適用される Doze 制限が一部であるか完全なものであるかには関係なく、端末は Doze モードから短時間抜け出し、メンテナンス ウィンドウと呼ばれる状態になります。このとき、アプリはネットワーク アクセスを許可され、保留されたジョブや同期を実行することができます。 93 94 95 96</p> 97 98 99<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" /> 100<p class="img-caption"> 101 <strong>図 2.</strong> 端末がしばらくの間静止状態になると、Doze が第 2 レベルのシステム アクティビティ制限を適用する 102 103</p> 104 105<p> 106 画面をオンにするか、端末を電源に接続すると、Doze モードは解除され、これらの処理の制限は適用されなくなります。 107<a href="{@docRoot}training/monitoring-device-state/doze-standby.html">Doze とアプリ スタンバイ用に最適化する</a>で説明したように、今回追加された動作は、Android 6.0(API レベル 23)で導入された以前のバージョンの Doze にアプリを対応させるための推奨事項とベスト プラクティスには影響を及ぼしません。 108 109 110 111メッセージの送受信に Google Cloud Messaging(GCM)を使用するなどの推奨事項を引き続き順守して、追加の Doze 動作に対応するためにアップデートを計画する必要があります。 112 113 114 115</p> 116 117 118<h3 id="bg-opt">Project Svelte:バックグラウンド処理の最適化</h3> 119 120<p> 121 Android N では、メモリ使用量と消費電力を最適化するために、3 つの暗黙的なブロードキャストが削除されています。 122この変更が必要になるのは、暗黙的なブロードキャストが行われると、バックグラウンドでブロードキャストをリッスンするように登録されているアプリが頻繁に起動されるためです。 123 124これらのブロードキャストを削除すると端末のパフォーマンスとユーザー エクスペリエンスが大幅に向上します。 125 126</p> 127 128<p> 129 モバイル端末では、Wi-Fi とモバイルデータ間を移動するときなど、接続が頻繁に変化します。 130現在のアプリでは、暗黙的な {@link 131 android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストのレシーバーをマニフェストに登録することにより、接続の変化を監視できるようになっています。 132 133多くのアプリがこのブロードキャストを受信する登録を行っているので、一度ネットワークの切り替えが起こるだけですべてのアプリがアクティブになり、ブロードキャストが同時に処理されます。 134 135 136</p> 137 138<p> 139 同様に、旧バージョンの Android では、暗黙的な {@link 140 android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストと {@link 141 android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストをカメラなどの他のアプリから受信するよう登録できました。 142ユーザーがカメラアプリで写真を撮ると、これらのアプリがアクティブになり、ブロードキャストが処理されます。 143 144</p> 145 146<p> 147 Android N では、こういった問題を緩和するために、以下の最適化手法が適用されます。 148 149</p> 150 151<ul> 152 <li>Android N 向けのアプリは、{@link 153 android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストを受信しません。これは、アプリにこれらのイベントの通知をリクエストするマニフェスト エントリがある場合も同様です。 154実行されているアプリが {@link android.content.BroadcastReceiver} で通知をリクエストした場合は、メインスレッドで {@code CONNECTIVITY_CHANGE} を引き続きリッスンできます。 155 156 157 </li> 158 159 <li>アプリは、{@link 160 android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストまたは {@link 161 android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストを送受信できません。この最適化は、Android N 向けのアプリだけでなく、すべてのアプリに影響を及ぼします。 162 163 </li> 164</ul> 165 166<p>アプリでこれらのインテントのいずれかを使用する場合は、Android N 端末を適切にターゲットにできるよう可能な限りインテントとの依存性を削除する必要があります。 167 168 Android フレームワークは、これらの暗黙的なブロードキャストの必要性を軽減するいくつかのソリューションを提供します。 169たとえば、{@link 170 android.app.job.JobScheduler} API は、従量制ではないネットワークへの接続など、指定された条件のときに、ネットワーク操作をスケジュールするための堅牢なメカニズムを提供します。 171 172また、{@link 173 android.app.job.JobScheduler} を使用して、コンテンツ プロバイダの変更に対応することもできます。 174</p> 175 176<p> 177 N でのバックグラウンド処理の最適化や、アプリで必要となる対応の詳細については、<a href="{@docRoot}preview/features/background-optimization.html">バックグラウンド処理の最適化</a>をご覧ください。 178 179 180</p> 181 182<h2 id="perm">パーミッションの変更</h2> 183 184<p> 185 Android N では、アプリに影響を及ぼす可能性のあるパーミッションが変更されています。 186</p> 187 188<h3 id="permfilesys">ファイル システムのパーミッションの変更</h3> 189 190<p> 191 プライベート ファイルのセキュリティを強化するために、Android N 以降向けのアプリのプライベート ディレクトリにはアクセス制限があります(<code>0700</code>)。 192 193 この設定により、サイズや存在など、プライベート ファイルのメタデータの漏洩を防ぐことができます。 194このパーミッションの変更には、以下のような複数の副作用があります。 195</p> 196 197<ul> 198 <li> 199 プライベート ファイルの所有者はこのファイル パーミッションを緩和することができず、{@link android.content.Context#MODE_WORLD_READABLE} や {@link android.content.Context#MODE_WORLD_WRITEABLE} を使用してこれを実行しようとすると、{@link java.lang.SecurityException} がトリガーされます。 200 201 202 203 204 <p class="note"> 205 <strong>注:</strong>現在のところ、この制限は完全には適用されていません。 206 アプリはネイティブ API や {@link java.io.File File} API を使用して、プライベート ディレクトリのパーミッションを変更できる場合があります。 207ただし、プライベート ディレクトリのパーミッションを緩和できないようにすることをお勧めします。 208 209 </p> 210 </li> 211 <li> 212 パッケージ ドメイン以外の <code>file://</code> URI を渡すと、レシーバーがアクセスできないパスになる可能性があります。 213そのため、<code>file://</code> URI を渡そうとすると、<code>FileUriExposedException</code> がトリガーされます。 214 215プライベート ファイルのコンテンツの共有には、{@link 216 android.support.v4.content.FileProvider} を使用することをお勧めします。 217 218 </li> 219 <li> 220 {@link android.app.DownloadManager} では、ファイル名でプライベートに保存されたファイルを共有することはできなくなりました。 221以前のアプリで {@link 222 android.app.DownloadManager#COLUMN_LOCAL_FILENAME} にアクセスした場合、このパスにアクセスできないことがあります。 223Android N 以降向けのアプリが、{@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME} にアクセスしようとすると、{@link java.lang.SecurityException} がトリガーされます。 224 225 226 227 ダウンロードの場所を {@link 228 android.app.DownloadManager.Request#setDestinationInExternalFilesDir 229 DownloadManager.Request.setDestinationInExternalFilesDir()} や {@link 230 android.app.DownloadManager.Request#setDestinationInExternalPublicDir 231 DownloadManager.Request.setDestinationInExternalPublicDir()} を使用してパブリックな場所に設定する以前のアプリは、{@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME} でこのパスにアクセスできますが、このメソッドは使用しないことをお勧めします。 232 233 234 235 236 237{@link android.app.DownloadManager} で公開されているファイルへのアクセスには、{@link android.content.ContentResolver#openFileDescriptor 238 ContentResolver.openFileDescriptor()} を使用することをお勧めします。 239 240 241 </li> 242</ul> 243 244<h2 id="sharing-files">アプリ間のファイルの共有</h2> 245 246<p> 247Android N 向けのアプリでは、Android フレームワークにより、アプリ以外の {@code file://} URI の公開を禁止する {@link android.os.StrictMode} API ポリシーが適用されます。 248 249ファイル URI を含むインテントがアプリからなくなると、{@code FileUriExposedException} 例外によりアプリはエラーになります。 250 251</p> 252 253<p> 254アプリ間でファイルを共有するには、{@code content://} URI を送信して、この URI に一時的なアクセス パーミッションを付与する必要があります。 255このパーミッションを付与する最も簡単な方法は、{@link android.support.v4.content.FileProvider} クラスを使用することです。 256パーミッションとファイルの共有の詳細については、<a href="{@docRoot}training/secure-file-sharing/index.html">ファイルの共有</a>をご覧ください。 257 258 259</p> 260 261<h2 id="accessibility">ユーザー補助機能の改善</h2> 262 263<p> 264 Android N には、低視力のユーザーまたは視覚障害のあるユーザー向けのプラットフォームのユーザビリティを改善するための変更がいくつか追加されています。 265通常は、これらの変更によってアプリのコードを変更する必要はありませんが、この機能について理解し、アプリでテストして、ユーザー エクスペリエンスに与える潜在的な影響を評価する必要があります。 266 267 268 269</p> 270 271 272<h3 id="screen-zoom">画面のズーム</h3> 273 274<p> 275 Android N では、<strong>ディスプレイ サイズ</strong>を設定して、画面上のすべての要素を拡大または縮小することができるので、視覚障害のあるユーザーに対する端末のユーザー補助機能が向上しています。 276 277ユーザーは、一般的な中くらいのサイズの携帯端末 Nexus 4 の幅である <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">sw320dp</a> の画面最小幅を超えて画面をズームできません。 278 279 280</p> 281 282<div class="cols"> 283 284<div class="col-6"> 285 <img src="{@docRoot}preview/images/screen-zoom-1.png" alt="" height="XXX" id="figure1" /> 286</div> 287<div class="col-6"> 288 <img src="{@docRoot}preview/images/screen-zoom-2.png" alt="" height="XXX" id="figure1" /> 289</div> 290 291</div> <!-- end cols --> 292<p class="img-caption"> 293 <strong>図 3.</strong> 右側の画面では、Android N システム イメージを実行している端末のディスプレイ サイズを拡大している 294 295</p> 296 297 298<p> 299 端末の画面密度が変更されると、以下の方法で実行中のアプリに通知されます。 300 301</p> 302 303<ul> 304 <li>アプリが API レベル 23 以前をターゲットにしている場合は、すべてのバックグラウンド処理が自動的に強制終了します。 305つまり、ユーザーがそのようなアプリから移動して [<em>Settings</em>] 画面を開き、<strong>ディスプレイ サイズ</strong>の設定を変更すると、メモリ不足の場合と同じように、アプリが強制終了します。 306 307 308アプリになんらかのフォアグラウンド処理がある場合は、<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>に記載されている設定変更の処理が通知されます。これは、端末の画面の向きが変わったときの処理と同様です。 309 310 311 312 </li> 313 314 <li>アプリが Android N をターゲットにしている場合、<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>に記載されているように、すべての処理(フォアグラウンド処理およびバックグラウンド処理)に対して設定変更が通知されます。 315 316 317 318 </li> 319</ul> 320 321<p> 322 Android のベスト プラクティスに従っているほとんどのアプリでは、この機能をサポートするための変更を加える必要はありません。 323以下の点は確認する必要があります。 324</p> 325 326<ul> 327 <li>画面幅 <code><a href= 328 "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code> の端末でアプリをテストして、適切に機能することを確認します。 329 330 </li> 331 332 <li>端末設定が変更された場合、キャッシュ済みのビットマップやネットワークからロードされるリソースなど、画面密度に依存するキャッシュ情報を更新してください。 333 334また、アプリが一時停止状態から再開された場合は、設定変更をチェックしてください。 335 336 <p class="note"> 337 <strong>注:</strong>設定に依存したデータをキャッシュに保存する場合は、そのデータ用の適切な画面サイズやピクセル密度など、関連するメタデータを含めることをお勧めします。 338 339このメタデータを保存しておくと、設定を変更した後、キャッシュ データを更新する必要があるかどうかを決定できます。 340 341 342 </p> 343 </li> 344 345 <li>ピクセル単位は画面密度に対応しないため、ピクセル単位で寸法を指定することは避けてください。 346その代わり、<a href="{@docRoot}guide/practices/screens_support.html">密度非依存ピクセル</a>(<code>dp</code>)単位で寸法を指定します。 347 348 </li> 349</ul> 350 351<h3 id="vision-settings">セットアップ ウィザードの [Vision Settings]</h3> 352 353<p> 354 Android N には、オープニング画面に [Vision Settings] が追加されています。ユーザーはこれを使用して、新しい端末で以下のユーザー補助機能設定を設定できます。 355 356 <strong>ズーム操作</strong>、<strong>フォントサイズ</strong>、<strong>ディスプレイ サイズ</strong>、<strong>TalkBack</strong>。 357この変更により、さまざまな画面設定に関連するバグが顕在化する可能性があります。 358この機能が及ぼす影響を評価するには、これらの設定を有効にしてアプリをテストする必要があります。 359 360設定は、<strong>[Settings] > [Accessibility]</strong> にあります。 361 362</p> 363 364<h2 id="ndk">プラットフォーム ライブラリにリンクした NDK アプリ</h2> 365 366<p> 367 Android N では、非パブリック API のロードを防止するために、名前空間が変更されています。 368 NDK を使用する場合、Android プラットフォームのパブリック API のみを使用する必要があります。 369Android の次の公式リリースで非パブリック API を使用すると、アプリがクラッシュする可能性があります。 370 371</p> 372 373<p> 374 非パブリック API を使用していることを警告するために、アプリが非パブリック API を呼び出すと、Android N 端末で実行されているアプリは logcat 出力でエラーを生成します。 375 376 この状態を認識してもらえるよう、このエラーはメッセージとして端末の画面にも表示されます。 377アプリのコードを確認して、非パブリック プラットフォーム API を削除し、プレビュー端末またはエミュレータを使用して、アプリを十分にテストしてください。 378 379 380</p> 381 382<p> 383 アプリがプラットフォーム ライブラリに依存している場合は、NDK ドキュメントにある一般的な修正例を参照して、共通のプライベート API をそれと同等の機能を持つパブリック API に置き換えます。 384 385 特に、<code>libpng</code> など、プラットフォームに含まれていて NDK には含まれていないライブラリをアプリで使用している場合、気付かないうちにプラットフォーム ライブラリにリンクしていることがあります。 386 387この場合、APK にリンク対象のすべての .so ファイルが含まれていることを確認します。 388 389</p> 390 391<p class="caution"> 392 <strong>警告:</strong>サードパーティのライブラリの中には非パブリック API にリンクしているものもあります。 393アプリがこれらのライブラリを使用している場合、Android の次の公式リリースでアプリを実行すると、アプリがクラッシュする可能性があります。 394 395</p> 396 397<p> 398 NDK に含まれていないネイティブ ライブラリは Android のリリース版が変わると変更または削除される場合があるため、アプリでは、こういったライブラリへの依存やその使用を避けてください。 399 400OpenSSL から BoringSSL への移行は、そのような変更の一例です。 401 また、NDK に含まれていないプラットフォーム ライブラリには互換性要件がないため、端末によって互換性レベルが異なる場合があります。 402 403古い端末で非 NDK ライブラリにアクセスする必要がある場合は、Android API レベルに応じてロードしてください。 404 405</p> 406 407<p> 408 こうしたタイプの問題の診断を支援するために、Android N でアプリをビルドするときに発生する可能性のある Java および NDK のエラーの例を以下に示します。 409 410</p> 411 412<p>Java のエラー例</p> 413<pre class="no-pretty-print"> 414java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so" 415 is not accessible for the namespace "classloader-namespace" 416</pre> 417 418<p>NDK のエラー例</p> 419<pre class="no-pretty-print"> 420dlopen failed: cannot locate symbol "__system_property_get" referenced by ... 421</pre> 422 423 424<p> 425 こうしたタイプのエラーが発生しているアプリの典型的な修正例を以下に示します。 426</p> 427 428<ul> 429 <li>libandroid_runtime.so の getJavaVM と getJNIEnv を使用している場合は、標準の JNI 関数に置き換えることができます。 430 431<pre class="no-pretty-print"> 432AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h> 433AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or 434JavaVM::AttachCurrentThread from <jni.h>. 435</pre> 436 </li> 437 438 <li>{@code libcutils.so} の {@code property_get} シンボルを使用している場合は、public {@code alternative __system_property_get} に置き換えることができます。 439 440 これを行うには、次の include 文とともに {@code __system_property_get} を使用します。 441<pre> 442#include <sys/system_properties.h> 443</pre> 444 </li> 445 446 <li>{@code libcrypto.so} の {@code SSL_ctrl} シンボルを使用している場合は、ローカル版のアプリに置き換える必要があります。 447たとえば、{@code .so} ファイルに {@code libcyrpto.a} を静的にリンクするか、BoringSSL や OpenSSL の {@code libcrypto.so} をアプリに動的に含める必要があります。 448 449 450 </li> 451</ul> 452 453<h2 id="afw">Android for Work</h2> 454<p> 455 Android N には、証明書のインストール、パスワードの再設定、セカンダリ ユーザーの管理、端末識別子へのアクセスなど、Android for Work をターゲットにしているアプリに対する変更が含まれています。 456 457Android for Work 環境向けのアプリをビルドしている場合、これらの変更点を確認し、変更に応じてアプリを修正する必要があります。 458 459 460</p> 461 462<ul> 463 <li>DPC が代理証明書を設定する前に、代理証明書インストーラをインストールする必要があります。 464また、プロファイルと N SDK をターゲットにしているデバイス オーナー アプリに対して、デバイス ポリシー コントローラ(DPC)が <code>DevicePolicyManager.setCertInstallerPackage()</code> を呼び出す前に代理証明書インストーラをインストールする必要があります。 465 466 467このインストーラがインストールされていない場合、<code>IllegalArgumentException</code> がスローされます。 468 469 470 </li> 471 472 <li>端末管理者向けのパスワードの再設定制限がプロファイル オーナーに適用されます。 473端末管理者は、{@code DevicePolicyManager.resetPassword()} を使用して、既に設定されているパスワードを削除または変更できなくなりました。 474 475端末管理者は、端末にパスワード、PIN、またはパターンが設定されていない場合のみ、パスワードを設定できます。 476 477 </li> 478 479 <li>デバイス オーナーとプロファイル オーナーは、制限が設定されている場合でもアカウントを管理することができます。 480デバイス オーナーとプロファイル オーナーは、<code>DISALLOW_MODIFY_ACCOUNTS</code> ユーザー制限が適用されている場合でもアカウント管理 API を呼び出すことができます。 481 482 </li> 483 484 <li>デバイス オーナーによるセカンダリ ユーザーの管理がさらに簡単になりました。端末がデバイス オーナー モードで実行されている場合は、<code>DISALLOW_ADD_USER</code> 制限が自動的に設定されます。 485 486これにより、管理されていないセカンダリ ユーザーが作成されることを防ぐことができます。 487また、<code>CreateUser()</code> メソッドと <code>createAndInitializeUser()</code> メソッドは廃止され、新しい <code>DevicePolicyManager.createAndManageUser()</code> メソッドに置き換えられました。 488 489 490 </li> 491 492 <li>デバイス オーナーは、端末識別子にアクセスできます。また、デバイス オーナーは <code>DevicePolicyManagewr.getWifiMacAddress()</code> を使用して、端末の Wi-Fi MAC アドレスにもアクセスできます。 493 494端末で Wi-Fi が有効にされたことがない場合、このメソッドは {@code null} 値を返します。 495 496 </li> 497 498 <li>ワークモード設定により、仕事用アプリへのアクセスが制御されます。ワークモードがオフになると、システム ランチャーは仕事用アプリをグレーアウトしてこれらが利用できないことを示します。 499ワークモードが再度有効になると、通常の動作が復元されます。 500 501</ul> 502 503<p> 504 Android N での Android for Work の変更の詳細については、<a href="{@docRoot}preview/features/afw.html">Android for Work のアップデート</a>をご覧ください。 505 506</p> 507 508<h2 id="annotations">アノテーションの保持</h2> 509 510<p> 511Android N では、アノテーションの表示が無視されていたバグを修正しています。この問題は、ランタイムがこれまでできなかったアノテーションへのアクセスを可能にしました。 512 513これらのアノテーションは以下のとおりです。 514</p> 515 516<ul> 517 <li>{@code VISIBILITY_BUILD}:ビルド時にのみ表示されます。</li> 518 <li>{@code VISIBILITY_SYSTEM}:実行時に表示されますが、基幹システムにのみ表示されます。 519</li> 520</ul> 521 522<p> 523アプリでこの動作を利用している場合は、実行時に表示されるアノテーションに保持ポリシーを追加してください。 524これは {@code @Retention(RetentionPolicy.RUNTIME)} を使用して実行できます。 525</p> 526 527<h2 id="other">その他の重要事項</h2> 528 529<ul> 530<li>Android N 上で低い API レベルをターゲットにしたアプリが実行されている場合、ユーザーがディスプレイ サイズを変更すると、アプリのプロセスは強制終了されます。 531アプリは、このシナリオを適切に処理する必要があります。 532適切に処理しないと、ユーザーが [Recents] からアプリを復元したときに、アプリがクラッシュします。 533 534 535<p> 536アプリをテストして、この動作が発生しないようにしてください。DDMS でアプリを手動で強制終了させて同様のクラッシュを発生させることにより、アプリのテストを行うことができます。 537 538 539 540</p> 541 542<p> 543N 以上をターゲットにしたアプリは、画面密度の変更時に自動的に強制終了しませんが、設定変更への対応が不十分なままである可能性があります。 544 545</p> 546</li> 547 548<li> 549Android N 上のアプリは設定変更を適切に処理し、次回の起動時にクラッシュしないようにする必要があります。 550フォントのサイズを変更([<strong>Setting</strong>] > [<strong>Display</strong>] > [<strong>Font size</strong>])した後に [Recents] からアプリを復元すると、アプリの動作を確認できます。 551 552 553 554</li> 555 556<li> 557旧バージョンの Android では、バグにより、メインスレッドの TCP ソケットへの書き込みを厳格モード違反として報告していませんでした。 558Android N ではこのバグが修正されています。この動作を表示するアプリから {@code android.os.NetworkOnMainThreadException} がスローされるようになりました。通常、メインスレッドでネットワーク操作を実行することはお勧めできません。それは、これらの操作は一般的に ANR やジャンクを引き起こす大幅なテイル レイテンシが発生するためです。 559 560 561 562</li> 563 564<li> 565メソッドの {@code Debug.startMethodTracing()} ファミリーが、SD カードのトップレベルではなく、共有ストレージ上のパッケージ固有のディレクトリの storing output にデフォルト設定されました。 566 567 568つまり、これらの API を使用するためにアプリで {@code WRITE_EXTERNAL_STORAGE} パーミッションをリクエストする必要はありません。 569</li> 570 571<li> 572多くのプラットフォーム API は、{@link android.os.Binder} トランザクションで送信される大きなペイロードをチェックし、暗黙的にログ記録したり、削除したりするのではなく {@code TransactionTooLargeExceptions} を {@code RuntimeExceptions} として再度スローするようになりました。 573 574 575一般的な例としては、{@link android.app.Activity#onSaveInstanceState Activity.onSaveInstanceState()} で大量のデータを格納することです。これにより、アプリが Android N をターゲットにしている場合は、{@code ActivityThread.StopInfo} で {@code RuntimeException} がスローされます。 576 577 578 579 580</li> 581 582<li> 583アプリが {@link java.lang.Runnable} タスクを {@link android.view.View} に渡し、{@link android.view.View} がウィンドウにアタッチされない場合は、{@link java.lang.Runnable} タスクと {@link android.view.View} がキューに入れられます。{@link java.lang.Runnable} タスクは {@link android.view.View} がウィンドウにアタッチされるまで実行されません。 584 585 586 587 588 589この動作は以下のバグを修正します。 590<ul> 591 <li>対象ウィンドウの UI スレッド以外のスレッドからアプリが {@link android.view.View} に渡すと、結果として不適切なスレッドで {@link java.lang.Runnable} が実行される可能性があります。 592 593 </li> 594 <li>{@link java.lang.Runnable} タスクがルーパー スレッド以外のスレッドから渡されると、アプリは {@link java.lang.Runnable} タスクを公開できました。 595</li> 596</ul> 597</li> 598 599<li> 600{@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES} パーミッションを持つ Android N 上のアプリが、別のアプリがインストールしたパッケージを削除しようとすると、ユーザー確認が要求されます。 601 602 603このシナリオでは、アプリが {@link android.content.pm.PackageInstaller#uninstall PackageInstaller.uninstall()} を呼び出した場合は、{@link android.content.pm.PackageInstaller#STATUS_PENDING_USER_ACTION STATUS_PENDING_USER_ACTION} をリターン ステータスとしてみなす必要があります。 604 605 606 607</li> 608 609</ul> 610 611