summaryrefslogtreecommitdiff
path: root/docs/html/preview/behavior-changes.jd
blob: 66dce7a5d0beea20a0f338b7e421cf764c941864 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
page.title=Behavior Changes
page.keywords=preview,sdk,compatibility
meta.tags="preview", "compatibility"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-changes_2x.png
@jd:body


<div id="qv-wrapper">
<div id="qv">

<h2>In this document</h2>

<ol>
  <li><a href="#perf">Performance Improvements</a>
    <ol>
      <li><a href="#doze">Doze</a></li>
      <li><a href="#bg-opt">Background Optimizations</a></li>
    </ol>
  </li>
  <li><a href="#perm">Permissions Changes</a>
  </li>
  <li><a href="#sharing-files">Sharing Files Between Apps</a></li>
  <li><a href="#accessibility">Accessibility Improvements</a>
    <ol>
      <li><a href="#screen-zoom">Screen Zoom</a></li>
      <li><a href="#vision-settings">Vision Settings in Setup Wizard</a></li>
    </ol>
  </li>
  <li><a href="#ndk">NDK Apps Linking to Platform Libraries</a></li>
  <li><a href="#afw">Android for Work</a></li>
  <li><a href="#annotations">Annotations Retention</a></li>
  <li><a href="#other">Other Important Points</a></li>
</ol>

<h2>See Also</h2>
<ol>
  <li><a href="{@docRoot}preview/api-overview.html">
    Android N API Overview</a></li>
</ol>

</div>
</div>


<p>
  Along with new features and capabilities, Android N
  includes a variety of system and API behavior changes. This document
  highlights some of the key changes that you should understand and account for
  in your apps.
</p>

<p>
  If you have previously published an app for Android, be aware that your app
  might be affected by these changes in the platform.
</p>


<h2 id="perf">Battery and Memory</h2>

<p>
Android N includes system behavior changes aimed at improving the battery life
of devices and reducing RAM usage. These changes can affect your app’s access to
system resources, along with the way your app interacts with other apps via
certain implicit intents.
</p>

<h3 id="doze">Doze</h3>

<p>
  Introduced in Android 6.0 (API level 23), Doze improves battery life by
  deferring CPU and network activities when a user leaves a device unplugged,
  stationary, and with the screen turned off. Android N brings further
  enhancements to Doze by applying a subset of CPU and network restrictions
  while the device is unplugged with the screen turned off, but not necessarily
  stationary, for example, when a handset is traveling in a user’s pocket.
</p>


<img src="{@docRoot}preview/images/doze-diagram-1.png"
  alt="" height="251px" id="figure1" />
<p class="img-caption">
  <strong>Figure 1.</strong> Illustration of how Doze applies a first level of
  system activity restrictions to improve battery life.
</p>

<p>
  When a device is on battery power, and the screen has been off for a certain
  time, the device enters Doze and applies the first subset of restrictions: It
  shuts off app network access, and defers jobs and syncs. If the device is
  stationary for a certain time after entering Doze, the system applies the
  rest of the Doze restrictions to {@link android.os.PowerManager.WakeLock},
  {@link android.app.AlarmManager} alarms, GPS, and Wi-Fi scans. Regardless of
  whether some or all Doze restrictions are being applied, the system wakes the
  device for brief maintenance windows, during which applications are allowed
  network access and can execute any deferred jobs/syncs.
</p>


<img src="{@docRoot}preview/images/doze-diagram-2.png"
  alt="" id="figure2" />
<p class="img-caption">
  <strong>Figure 2.</strong> Illustration of how Doze applies a second level of
  system activity restrictions after the device is stationary for a certain time.
</p>

<p>
  Note that activating the screen on or plugging in the device exits Doze and
  removes these processing restrictions. The additional behavior does not
  affect recommendations and best practices in adapting your app to the prior
  version of Doze introduced in Android 6.0 (API level 23), as discussed in
  <a href="{@docRoot}training/monitoring-device-state/doze-standby.html">
  Optimizing for Doze and App Standby</a>. You should still
  follow those recommendations, such as using Google Cloud Messaging (GCM) to
  send and receive messages, and start planning updates to accomodate the
  additional Doze behavior.
</p>


<h3 id="bg-opt">Project Svelte: Background Optimizations</h3>

<p>
  Android N removes three implicit broadcasts in order to help optimize both
  memory use and power consumption. This change is necessary because implicit
  broadcasts frequently start apps that have registered to listen for them in
  the background. Removing these broadcasts can substantially benefit device
  performance and user experience.
</p>

<p>
  Mobile devices experience frequent connectivity changes, such as when moving
  between Wi-Fi and mobile data. Currently, apps can monitor for changes in
  connectivity by registering a receiver for the implicit {@link
  android.net.ConnectivityManager#CONNECTIVITY_ACTION} broadcast in their
  manifest. Since many apps register to receive this broadcast, a single
  network switch can cause them all to wake up and process the broadcast at
  once.
</p>

<p>
  Similarly, in previous versions of Android, apps could register to receive implicit {@link
  android.hardware.Camera#ACTION_NEW_PICTURE} and {@link
  android.hardware.Camera#ACTION_NEW_VIDEO} broadcasts from other apps, such as
  Camera. When a user takes a picture with the Camera app, these apps wake up
  to process the broadcast.
</p>

<p>
  To alleviate these issues, Android N applies the following
  optimizations:
</p>

<ul>
  <li>Apps targeting Android N do not receive {@link
  android.net.ConnectivityManager#CONNECTIVITY_ACTION} broadcasts, even if they
  have manifest entries to request notification of these events. Apps that are
  running can still listen for {@code CONNECTIVITY_CHANGE} on their main thread
  if they request notification with a {@link android.content.BroadcastReceiver}.
  </li>

  <li>Apps cannot send or receive {@link
  android.hardware.Camera#ACTION_NEW_PICTURE} or {@link
  android.hardware.Camera#ACTION_NEW_VIDEO} broadcasts. This optimization
  affects all apps, not only those targeting Android N.
  </li>
</ul>

<p>If your app uses any of these intents, you should remove dependencies
  on them as soon as possible so that you can target Android N devices properly.
  The Android framework provides several solutions to mitigate the need for
  these implicit broadcasts. For example, the {@link
  android.app.job.JobScheduler} API provides a robust mechanism to schedule
  network operations when specified conditions, such as connection to an
  unmetered network, are met. You can even use {@link
  android.app.job.JobScheduler} to react to changes to content providers.
</p>

<p>
  For more information about background optimizations in N and how to adapt your app,
  see <a href=
  "{@docRoot}preview/features/background-optimization.html">Background
  Optimizations</a>.
</p>

<h2 id="perm">Permissions Changes</h2>

<p>
  Android N includes changes to permissions that may affect your app.
</p>

<h3 id="permfilesys">File system permission changes</h3>

<p>
  In order to improve the security of private files, the private directory of
  apps targeting Android N or higher has restricted access (<code>0700</code>).
  This setting prevents leakage of metadata of private files, such as their size
  or existence. This permission change has multiple side effects:
</p>

<ul>
  <li>
    Private files’ file permissions should no longer be relaxed by the owner,
    and an attempt to do so using
    {@link android.content.Context#MODE_WORLD_READABLE} and/or
    {@link android.content.Context#MODE_WORLD_WRITEABLE}, will trigger a
    {@link java.lang.SecurityException}.
    <p class="note">
      <strong>Note:</strong> As of yet, this restriction is not fully enforced.
      Apps may still modify permissions to their private directory using
      native APIs or the {@link java.io.File File} API. However, we strongly
      discourage relaxing the permissions to the private directory.
    </p>
  </li>
  <li>
    Passing <code>file://</code> URIs outside the package domain may leave the
    receiver with an unaccessible path. Therefore, attempts to pass a
    <code>file://</code> URI trigger a
    <code>FileUriExposedException</code>. The recommended way to share the
    content of a private file is using the {@link
    android.support.v4.content.FileProvider}.
  </li>
  <li>
    The {@link android.app.DownloadManager} can no longer share privately
    stored files by filename. Legacy applications may end up with an
    unaccessible path when accessing {@link
    android.app.DownloadManager#COLUMN_LOCAL_FILENAME}. Apps targeting
    Android N or higher trigger a {@link java.lang.SecurityException} when
    attempting to access
    {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}.
    Legacy applications that set the download location to a public location by
    using
    {@link
    android.app.DownloadManager.Request#setDestinationInExternalFilesDir
    DownloadManager.Request.setDestinationInExternalFilesDir()} or
    {@link
    android.app.DownloadManager.Request#setDestinationInExternalPublicDir
    DownloadManager.Request.setDestinationInExternalPublicDir()}
    can still access the path in
    {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}, however, this
    method is strongly discouraged. The preferred way of accessing a file
    exposed by the {@link android.app.DownloadManager} is using
    {@link android.content.ContentResolver#openFileDescriptor
    ContentResolver.openFileDescriptor()}.
  </li>
</ul>

<h2 id="sharing-files">Sharing Files Between Apps</h2>

<p>
For apps targeting Android N, the Android framework enforces
the {@link android.os.StrictMode} API policy that prohibits exposing {@code file://} URIs
outside your app. If an intent containing a file URI leaves your app, the app fails
with a {@code FileUriExposedException} exception.
</p>

<p>
To share files between applications, you should send a {@code content://} URI
and grant a temporary access permission on the URI. The easiest way to grant this permission is by
using the {@link android.support.v4.content.FileProvider} class. For more information
on permissions and sharing files,
see <a href="{@docRoot}training/secure-file-sharing/index.html">Sharing Files</a>.
</p>

<h2 id="accessibility">Accessibility Improvements</h2>

<p>
  Android N includes changes intended to improve the usability of the
  platform for users with low or impaired vision. These changes should
  generally not require code changes in your app, however you should review
  these feature and test them with your app to assess potential impacts to user
  experience.
</p>


<h3 id="screen-zoom">Screen Zoom</h3>

<p>
  Android N enables users to set <strong>Display size</strong>which magnifies
  or shrinks all elements on the screen, thereby improving device accessibility
  for users with low vision. Users cannot zoom the screen past a minimum screen
  width of <a href=
  "http://developer.android.com/guide/topics/resources/providing-resources.html">
  sw320dp</a>, which is the width of a Nexus 4, a common medium-sized phone.
</p>

<div class="cols">

<div class="col-6">
  <img src="{@docRoot}preview/images/screen-zoom-1.png" alt="" height="XXX" id="figure1" />
</div>
<div class="col-6">
  <img src="{@docRoot}preview/images/screen-zoom-2.png" alt="" height="XXX" id="figure1" />
</div>

</div> <!-- end cols -->
<p class="img-caption">
  <strong>Figure 3.</strong> The screen on the right shows the effect of
  increasing the Display size of a device running an Android N system image.
</p>


<p>
  When the device density changes, the system notifies running apps in the
  following ways:
</p>

<ul>
  <li>If an app targets API level 23 or lower, the system automatically kills
  all its background processes. This means that if a user switches away from
  such an app to open the <em>Settings</em> screen and changes the
  <strong>Display size</strong> setting, the system kills the app in the same
  manner that it would in a low-memory situation. If the app has any foreground
  processes, the system notifies those processes of the configuration change as
  described in <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Handling
  Runtime Changes</a>, just as if the device's orientation had changed.
  </li>

  <li>If an app targets Android N, all of its processes
  (foreground and background) are notified of the configuration change as
  described in <a href=
  "{@docRoot}guide/topics/resources/runtime-changes.html">Handling
  Runtime Changes</a>.
  </li>
</ul>

<p>
  Most apps do not need to make any changes to support this feature, provided
  the apps follow Android best practices. Specific things to check for:
</p>

<ul>
  <li>Test your app on a device with screen width <code><a href=
  "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
  and be sure it performs adequately.
  </li>

  <li>When the device configuration changes, update any density-dependent
  cached information, such as cached bitmaps or resources loaded from the
  network. Check for configuration changes when the app resumes from the paused
  state.
    <p class="note">
      <strong>Note:</strong> If you cache configuration-dependent data, it's a
      good idea to include relevant metadata such as the appropriate screen
      size or pixel density for that data. Saving this metadata allows you to
      decide whether you need to refresh the cached data after a configuration
      change.
    </p>
  </li>

  <li>Avoid specifying dimensions with px units, since they do not scale with
  screen density. Instead, specify dimensions with <a href=
  "{@docRoot}guide/practices/screens_support.html">density-independent
  pixel</a> (<code>dp</code>) units.
  </li>
</ul>

<h3 id="vision-settings">Vision Settings in Setup Wizard</h3>

<p>
  Android N includes Vision Settings on the Welcome screen, where users can
  set up the following accessibility settings on a new device:
  <strong>Magnification gesture</strong>, <strong>Font size</strong>,
  <strong>Display size</strong> and <strong>TalkBack</strong>. This change
  increases the visibility of bugs related to different screen settings. To
  assess the impact of this feature, you should test your apps with these
  settings enabled. You can find the settings under <strong>Settings &gt;
  Accessibility</strong>.
</p>

<h2 id="ndk">NDK Apps Linking to Platform Libraries</h2>

<p>
  Android N includes namespace changes to prevent loading of non-public APIs.
  If you use the NDK, you should only be using public APIs from the Android
  platform. Using non-public APIs in the next official release of Android
  can cause your app to crash.
</p>

<p>
  In order to alert you to use of non-public APIs, apps running on an Android N
  device generate an error in logcat output when an app calls a non-public API.
  This error is also displayed on the device screen as a message to help
  raise awareness of this situation. You should review your app code to
  remove use of non-public platform APIs and thoroughly test your apps using
  a preview device or emulator.
</p>

<p>
  If your app depends on platform libraries, see the NDK documentation for
  typical fixes for replacing common private APIs with public API equivalents.
  You may also be linking to platform libraries without realizing it,
  especially if your app uses a library that is part of the platform (such as
  <code>libpng</code>), but is not part of the NDK. In that case, ensure that
  your APK contains all the .so files you intended to link against.
</p>

<p class="caution">
  <strong>Caution:</strong> Some third-party libraries may link to non-public
  APIs. If your app uses these libraries, your app may crash when running
  on the next official release of Android.
</p>

<p>
  Apps should not depend on or use native libraries that are not included in
  the NDK, because they may change, or be removed from one Android release to
  another. The switch from OpenSSL to BoringSSL is an example of such a change.
  Also, different devices may offer different levels of compatibility, because
  there are no compatibility requirements for platform libraries not included
  in the NDK. If you must access non-NDK libraries on older devices, make the
  loading dependent on the Android API level.
</p>

<p>
  To help you diagnose these types problems here are some example Java and NDK
  errors you might encounter when attempting to build your app with Android N:
</p>

<p>Example Java error:</p>
<pre class="no-pretty-print">
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libcutils.so"
    is not accessible for the namespace "classloader-namespace"
</pre>

<p>Example NDK error:</p>
<pre class="no-pretty-print">
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
</pre>


<p>
  Here are some typical fixes for apps encountering these types of errors:
</p>

<ul>
  <li>Use of getJavaVM and getJNIEnv from libandroid_runtime.so can be replaced
  with standard JNI functions:
<pre class="no-pretty-print">
AndroidRuntime::getJavaVM -&gt; GetJavaVM from &lt;jni.h&gt;
AndroidRuntime::getJNIEnv -&gt; JavaVM::GetEnv or
JavaVM::AttachCurrentThread from &lt;jni.h&gt;.
</pre>
  </li>

  <li>Use of {@code property_get} symbol from {@code libcutils.so} can be
    replaced with the public {@code alternative __system_property_get}.
   To do this, use {@code __system_property_get} with the following include:
<pre>
#include &lt;sys/system_properties.h&gt;
</pre>
  </li>

  <li>Use of {@code SSL_ctrl} symbol from {@code libcrypto.so} should be
  replaced with an app local version. For example, you should statically link
  {@code libcyrpto.a} in your {@code .so} file or include your own dynamically
  {@code libcrypto.so} from BoringSSL or OpenSSL in your app.
  </li>
</ul>

<h2 id="afw">Android for Work</h2>
<p>
  Android N contains changes for apps that target Android for Work, including
  changes to certificate installation, password resetting, secondary user
  management, and access to device identifiers. If you are building apps for
  Android for Work environments, you should review these changes and modify
  your app accordingly.
</p>

<ul>
  <li>You must install a delegated certificate installer before the DPC can set
  it. For both profile and device-owner apps targeting the N SDK, you should
  install the delegated certificate installer before the device policy
  controller (DPC) calls
  <code>DevicePolicyManager.setCertInstallerPackage()</code>. If the installer
  is not already installed, the system throws an
  <code>IllegalArgumentException</code>.
  </li>

  <li>Reset password restrictions for device admins now apply to profile
  owners. Device admins can no longer use
  {@code DevicePolicyManager.resetPassword()} to clear passwords or change
  ones that are already set. Device admins can still set a password, but only
  when the device has no password, PIN, or pattern.
  </li>

  <li>Device and profile owners can manage accounts even if restrictions are
  set. Device owners and profile owners can call the Account Management APIs
  even if <code>DISALLOW_MODIFY_ACCOUNTS</code> user restrictions are in place.
  </li>

  <li>Device owners can manage secondary users more easily. When a device is
  running in device owner mode, the <code>DISALLOW_ADD_USER</code> restriction
  is automatically set. This prevents users from creating unmanaged secondary
  users. In addition, the <code>CreateUser()</code> and
  <code>createAndInitializeUser()</code> methods are deprecated; the new
  <code>DevicePolicyManager.createAndManageUser()</code> method replaces them.
  </li>

  <li>Device owners can access device identifiers. A Device owner can access the
  Wi-Fi MAC address of a device, using
  <code>DevicePolicyManagewr.getWifiMacAddress()</code>. If Wi-Fi has never
  been enabled on the device, this method returns a value of {@code null}.
  </li>

  <li>The Work Mode setting controls access to work apps. When work mode is off the
  system launcher indicates work apps are unavailable by greying them out. Enabling
  work mode again restores normal behavior.
</ul>

<p>
  For more information about changes to Android for Work in Android N, see
  <a href="{@docRoot}preview/features/afw.html">Android for Work Updates</a>.
</p>

<h2 id="annotations">Annotations Retention</h2>

<p>
Android N fixes a bug where the visibility of annotations was being ignored.
This issue enabled the runtime to access annotations that it should not have been
able to. These annotations included:
</p>

<ul>
   <li>{@code VISIBILITY_BUILD}: Intended to be visible only at build time.</li>
   <li>{@code VISIBILITY_SYSTEM}: Intended to be visible at runtime, but only to the
   underlying system.</li>
</ul>

<p>
If your app has relied on this behavior, please add a retention policy to annotations that must
be available at runtime. You do so by using {@code @Retention(RetentionPolicy.RUNTIME)}.
</p>

<h2 id="other">Other Important Points</h2>

<ul>
<li>When an app is running on Android N, but targets a lower API level,
and the user changes display size, the app process is killed. The app
must be able to gracefully handle this scenario. Otherwise, it crashes
when the user restores it from Recents.

<p>
You should test your app to ensure
that this behavior does not occur.
You can do so by causing an identical crash
when killing the app manually via DDMS.
</p>

<p>
Apps targeting N and above are not automatically killed on density changes;
however, they may still respond poorly to configuration changes.
</p>
</li>

<li>
Apps on Android N should be able to gracefully handle configuration changes,
and should not crash on subsequent starts. You can verify app behavior
by changing font size (<strong>Setting</strong> >
<strong>Display</strong> > <strong>Font size</strong>), and then restoring
the app from Recents.
</li>

<li>
Due to a bug in previous versions of Android, the system did not flag writing
to a TCP socket on the main thread as a strict-mode violation. Android N fixes this bug.
Apps that exhibit this behavior now throw an {@code android.os.NetworkOnMainThreadException}.
Generally, performing network operations on the main thread is a bad idea because these operations
usually have a high tail latency that causes ANRs and jank.
</li>

<li>
The {@code Debug.startMethodTracing()} family of methods now defaults to
storing output in your package-specific directory on shared storage,
instead of at the top level
of the SD card.  This means apps no longer need to request the {@code WRITE_EXTERNAL_STORAGE} permission to use these APIs.
</li>

<li>
Many platform APIs have now started checking for large payloads being sent
across {@link android.os.Binder} transactions, and the
system now rethrows {@code TransactionTooLargeExceptions}
as {@code RuntimeExceptions}, instead of silently logging or suppressing them.  One
common example is storing too much data in
{@link android.app.Activity#onSaveInstanceState Activity.onSaveInstanceState()},
which causes {@code ActivityThread.StopInfo} to throw a
{@code RuntimeException} when your app targets Android N.
</li>

<li>
If an app posts {@link java.lang.Runnable} tasks to a {@link android.view.View}, and
the {@link android.view.View}
is not attached to a window, the system
queues the {@link java.lang.Runnable} task with the {@link android.view.View};
the {@link java.lang.Runnable} task does not execute until the
{@link android.view.View} is attached
to a window. This behavior fixes the following bugs:
<ul>
   <li>If an app posted to a {@link android.view.View} from a thread other than the intended
   window’s UI thread, the {@link java.lang.Runnable} may run on the wrong thread as a result.
   </li>
   <li>If the {@link java.lang.Runnable} task was posted from a thread other than
   a looper thread, the app could expose the {@link java.lang.Runnable} task.</li>
</ul>
</li>

<li>
If an app on Android N with
{@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES}
permission tries to delete a package, but a different app had installed that package,
the system requires user confirmation. In this scenario, apps should expect
{@link android.content.pm.PackageInstaller#STATUS_PENDING_USER_ACTION STATUS_PENDING_USER_ACTION}
as the return status when they invoke
{@link android.content.pm.PackageInstaller#uninstall PackageInstaller.uninstall()}.
</li>

</ul>