1page.title=行为变更
2page.keywords=Preview、SDK、兼容性
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">低电耗模式</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">设置向导中的视觉设置</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这些变更可能会影响您的应用访问系统资源,以及您的系统通过特定隐式 Intent 与其他应用互动的方式。
64
65
66</p>
67
68<h3 id="doze">低电耗模式</h3>
69
70<p>
71  Android 6.0(API 级别 23)引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟 CPU 和网络活动,从而延长电池寿命。而 Android N 则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络限制,进一步增强了低电耗模式。
72
73
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> 低电耗模式如何应用第一级系统活动限制以延长电池寿命的图示。
83
84</p>
85
86<p>
87  当设备处于充电状态且屏幕已关闭一定时间后,设备会进入低电耗模式并应用第一部分限制:
88关闭应用网络访问、推迟作业和同步。
89如果进入低电耗模式后设备处于静止状态达到一定时间,系统则会对 {@link android.os.PowerManager.WakeLock}、{@link android.app.AlarmManager} 闹铃、GPS 和 Wi-Fi 扫描应用余下的低电耗模式限制。
90
91
92无论是应用部分还是全部低电耗模式限制,系统都会唤醒设备以提供简短的维护时间窗口,在此窗口期间,应用程序可以访问网络并执行任何被推迟的作业/同步。
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> 低电耗模式如何在设备处于静止状态达到一定时间后应用第二级系统活动限制的图示。
102
103</p>
104
105<p>
106  请注意,激活屏幕或插接设备电源时,系统将退出低电耗模式并取消这些处理限制。
107此项新增的行为不会影响有关使您的应用适应 Android 6.0(API 级别 23)中所推出的旧版本低电耗模式的建议和最佳实践,如<a href="{@docRoot}training/monitoring-device-state/doze-standby.html">低电耗模式和应用待机模式优化</a>中所讨论。
108
109
110
111您仍应遵循这些建议(例如使用 Google Cloud Messaging (GCM) 发送和接收消息)并开始安排更新计划以适应新增的低电耗模式行为。
112
113
114
115</p>
116
117
118<h3 id="bg-opt">Project Svelte:后台优化</h3>
119
120<p>
121  Android N 删除了三项隐式广播,以帮助优化内存使用和电量消耗。
122此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。
123
124删除这些广播可以显著提升设备性能和用户体验。
125
126</p>
127
128<p>
129  移动设备会经历频繁的连接变更,例如在 Wi-Fi 和移动数据之间切换时。
130目前,可以通过在应用清单中注册一个接收器来侦听隐式 {@link  android.net.ConnectivityManager#CONNECTIVITY_ACTION} 广播,让应用能够监控这些变更。
131
132
133由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。
134
135
136</p>
137
138<p>
139  同理,应用可以注册接收来自其他应用(例如相机)的隐式 {@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
160android.hardware.Camera#ACTION_NEW_PICTURE} 或 {@link
161android.hardware.Camera#ACTION_NEW_VIDEO} 广播。此项优化会影响所有应用,而不仅仅是面向 Android N 的应用。
162
163  </li>
164</ul>
165
166<p>如果您的应用使用任何 Intent,您仍需要尽快移除它们的依赖关系,以正确适配 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  如需了解有关 Android 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} 时可能出现无法访问的路径。
223面向 Android 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>
247对于面向 Android N 的应用,Android 框架执行的 {@link android.os.StrictMode} API 政策禁止向您的应用外公开 {@code file://} URI。
248
249如果一项包含文件 URI 的 Intent 离开您的应用,应用失败,并出现 {@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>,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度<a href="http://developer.android.com/guide/topics/resources/providing-resources.html">
276 sw320dp</a>,该宽度是 Nexus 4 的宽度,也是常规中等大小手机的宽度。
277
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这意味着如果用户切换离开此类应用,转而打开“Settings”屏幕并更改 <strong>Display size</strong> 设置,则系统会像处理内存不足的情况一样终止该应用。
306
307<em></em>
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>避免用像素单位指定尺寸,因为像素不会随屏幕密度缩放。应改为使用<a href="{@docRoot}guide/practices/screens_support.html">与密度无关像素</a> (<code>dp</code>) 单位指定尺寸。
346
347
348  </li>
349</ul>
350
351<h3 id="vision-settings">设置向导中的视觉设置</h3>
352
353<p>
354  Android N 在“Welcome”屏幕中加入了“Vision Settings”,用户可以在新设备上设置以下无障碍功能设置:
355
356  <strong>Magnification gesture</strong>、<strong>Font size</strong>、<strong>Display size</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。
369在下一个官方发布的 Android 版本上使用非公开 API 会导致应用崩溃。
370
371</p>
372
373<p>
374  为提醒您使用了非公开 API,在 Android N 设备上运行的应用会在有应用调用非公开 API 时在日志消息输出中生成一个错误。
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
400例如,从 OpenSSL 切换至 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>可以使用标准 JNI 函数来替代使用 libandroid_runtime.so 中的 getJavaVM 和 getJNIEnv:
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 alternative __system_property_get} 来替代使用 {@code libcutils.so} 中的 {@code property_get} 符号。如需这样做,请使用 {@code __system_property_get} 及以下 include 函数:
439
440
441<pre>
442#include &lt;sys/system_properties.h&gt;
443</pre>
444  </li>
445
446  <li>应使用应用本地版本来替代使用 {@code libcrypto.so} 中的 {@code SSL_ctrl} 符号。例如,您应在 {@code .so} 文件中静态链接 {@code libcyrpto.a},或者在应用中包含您自己的来自 BoringSSL 或 OpenSSL 的动态 {@code libcrypto.so}。
447
448
449
450  </li>
451</ul>
452
453<h2 id="afw">Android for Work</h2>
454<p>
455  Android N 包含一些针对面向 Android for Work 的应用的变更,包括对证书安装、密码重置、二级用户管理、设备标识符访问权限的变更。如果您是要针对 Android for Work 环境开发应用,则应仔细检查这些变更并相应地修改您的应用。
456
457
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>即使设置了限制,设备所有者和个人资料所有者仍可以管理帐户。而且,即使具有 <code>DISALLOW_MODIFY_ACCOUNTS</code> 用户限制,设备所有者和个人资料所有者仍可调用 Account Management API。
480
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>设备所有者可以访问设备标识符。设备所有者可以使用
493 <code>DevicePolicyManagewr.getWifiMacAddress()</code> 访问设备的 Wi-Fi MAC 地址。
494如果设备上从未启用 Wi-Fi,则此方法将返回一个 {@code null} 值。
495
496  </li>
497
498  <li>工作模式设置控制工作应用访问。当工作模式关闭时,系统启动器通过使工作应用显示为灰色来指示它们不可用。
499启用工作模式会再次恢复正常行为。
500
501</ul>
502
503<p>
504  如需了解有关 Android N 中针对 Android for Work 所做变更的详细信息,请参阅
505 <a href="{@docRoot}preview/features/afw.html">Android for Work 更新</a>。
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否则,当用户从最近使用记录中恢复运行应用时,应用将会出现崩溃现象。
533
534
535<p>
536您应测试应用以确保不会发生此行为。要进行此测试,您可以通过 DDMS 手动终止应用,以造成相同的崩溃现象。
537
538
539
540</p>
541
542<p>
543在密度发生更改时,系统不会自动终止面向 N 及更高版本的应用;不过,这些应用仍可能对配置变更做出不良响应。
544
545</p>
546</li>
547
548<li>
549Android N 上的应用应能够正常处理配置变更,并且在后续启动时不会出现崩溃现象。您可以通过更改字体大小 (<strong>Setting</strong> &gt;
550<strong>Display</strong> &gt; <strong>Font size</strong>) 并随后从最近使用记录中恢复运行应用,来验证应用行为。
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 卡顶级。
566
567
568这意味着应用不再需要请求 {@code WRITE_EXTERNAL_STORAGE} 使用这些 API 的权限。
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()} 上存储过多数据,导致 {@code ActivityThread.StopInfo} 在您的应用面向 Android N 时引发 {@code RuntimeException}。
576
577
578
579
580</li>
581
582<li>
583如果应用向 {@link android.view.View} 发布 {@link java.lang.Runnable} 任务,并且 {@link android.view.View} 未附加到窗口,系统会用 {@link android.view.View} 为 {@link java.lang.Runnable} 任务排队;在 {@link android.view.View} 附加到窗口之前,{@link java.lang.Runnable} 任务不会执行。
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如果 Android N 上一项有 {@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES} 权限的应用尝试删除一个软件包,但另一项应用已经安装了这个软件包,则系统可能要求用户确认。
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