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] &gt; [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 -&gt; GetJavaVM from &lt;jni.h&gt;
433AndroidRuntime::getJNIEnv -&gt; JavaVM::GetEnv or
434JavaVM::AttachCurrentThread from &lt;jni.h&gt;.
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 &lt;sys/system_properties.h&gt;
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>] &gt; [<strong>Display</strong>] &gt; [<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