• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Cambios en los comportamientos
2page.keywords=versión preliminar,sdk,compatibilidad
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>En este documento</h2>
13
14<ol>
15  <li><a href="#perf">Mejoras de rendimiento</a>
16    <ol>
17      <li><a href="#doze">Descanso</a></li>
18      <li><a href="#bg-opt">Optimizaciones en segundo plano</a></li>
19    </ol>
20  </li>
21  <li><a href="#perm">Cambios en los permisos</a>
22  </li>
23  <li><a href="#sharing-files">Intercambio de archivos entre aplicaciones</a></li>
24  <li><a href="#accessibility">Mejoras de accesibilidad</a>
25    <ol>
26      <li><a href="#screen-zoom">Zoom de la pantalla</a></li>
27      <li><a href="#vision-settings">Vision Settings en el asistente de configuración</a></li>
28    </ol>
29  </li>
30  <li><a href="#ndk">Aplicaciones del NDK con vínculos a bibliotecas de plataformas</a></li>
31  <li><a href="#afw">Android for Work</a></li>
32  <li><a href="#annotations">Retención de anotaciones</a></li>
33  <li><a href="#other">Otros aspectos importantes</a></li>
34</ol>
35
36<h2>Consulta también</h2>
37<ol>
38  <li><a href="{@docRoot}preview/api-overview.html">
39    Información general sobre la API de Android N</a></li>
40</ol>
41
42</div>
43</div>
44
45
46<p>
47  Además de nuevas características y capacidades, Android N
48  incluye diversos cambios en el sistema y en los comportamientos de la API. En este documento,
49  se destacan algunos de los cambios principales que debes comprender y justificar
50  en tus aplicaciones.
51</p>
52
53<p>
54  Si publicaste anteriormente una aplicación para Android, ten en cuenta que tu aplicación
55  podría verse afectada por estos cambios en la plataforma.
56</p>
57
58
59<h2 id="perf">Batería y memoria</h2>
60
61<p>
62Android N incluye cambios en los comportamientos del sistema para mejorar la duración de la batería
63de los dispositivos y reducir el uso de la memoria RAM. Estos cambios pueden afectar el acceso de tu aplicación a
64recursos del sistema, además de la manera en que tu aplicación interactúa con otras aplicaciones mediante
65determinadas intents implícitas.
66</p>
67
68<h3 id="doze">Descanso</h3>
69
70<p>
71  Descanso, presentado en Android 6.0 (nivel de API 23), prolonga la duración de la batería
72 aplazando actividades de CPU y red cuando un usuario deja un dispositivo desenchufado,
73 quieto y con la pantalla apagada. En Android N se ofrecen más
74  mejoras para Descanso a través de la aplicación de un subconjunto de restricciones de CPU y red
75  mientras el dispositivo se encuentra desenchufado y con la pantalla apagada, aunque no necesariamente
76  quieto; por ejemplo, al ir dentro del bolsillo de un usuario en movimiento.
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>Figura 1:</strong> Ilustración del modo en que Descanso aplica un primer nivel de
83  restricciones de actividad del sistema para prolongar la duración de la batería.
84</p>
85
86<p>
87  Cuando un dispositivo funciona con la batería y la pantalla permanece apagada durante un tiempo
88  determinado, se activa en este el modo Descanso y se aplica el primer subconjunto de restricciones: se
89  desactiva el acceso de las aplicaciones a la red y se aplazan tareas y sincronizaciones. Si el dispositivo
90  permanece quieto durante un tiempo determinado tras activarse el modo Descanso, el sistema aplica el
91  resto de las restricciones del modo a {@link android.os.PowerManager.WakeLock},
92  alarmas de {@link android.app.AlarmManager}, GPS y análisis de Wi-Fi. Independientemente de que
93  se apliquen algunas o todas las restricciones del modo Descanso, el sistema activa el
94  dispositivo durante plazos de mantenimiento breves en los cuales las aplicaciones tienen
95  acceso a la red y pueden ejecutar sincronizaciones o procesos aplazados.
96</p>
97
98
99<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
100<p class="img-caption">
101  <strong>Figura 2:</strong> Ilustración del modo en que Descanso aplica un segundo nivel de
102  restricciones de actividad del sistema después de que el dispositivo permanece quieto durante un tiempo determinado.
103</p>
104
105<p>
106  Ten en cuenta que, cuando se activa la pantalla o se enchufa el dispositivo, se desactiva el modo Descanso y
107 se retiran estas restricciones de procesamiento. El comportamiento adicional no
108  tiene efecto sobre las recomendaciones ni las prácticas recomendadas para adaptar tu aplicación a la versión
109  anterior de Descanso, presentada en Android 6.0 (nivel de API 23), según lo descrito en
110   <a href="{@docRoot}training/monitoring-device-state/doze-standby.html">
111  Optimización para Descanso y App Standby</a>. De todos modos, debes
112  seguir las recomendaciones; por ejemplo, la de usar Google Cloud Messaging (GCM) para
113  enviar y recibir mensajes, y la de planificar actualizaciones para adaptar
114  el comportamiento adicional de Descanso.
115</p>
116
117
118<h3 id="bg-opt">Project Svelte: Optimizaciones en segundo plano</h3>
119
120<p>
121  En Android N, se eliminan tres transmisiones implícitas para ayudar a optimizar el uso de la
122  memoria y el consumo de energía. Este cambio es necesario porque las transmisiones
123  implícitas a menudo inician aplicaciones que se registran para realizar un seguimiento de ellas en
124  segundo plano. La eliminación de estas transmisiones puede mejorar sustancialmente el rendimiento  del dispositivo
125 y la experiencia del usuario.
126</p>
127
128<p>
129  Los dispositivos móviles están sujetos a cambios de conectividad frecuentes
130  entre los modos de datos Wi-Fi y móviles. Actualmente, las aplicaciones pueden realizar controles en busca de cambios en la
131  conectividad registrando un receptor para la transmisión implícita {@link
132  android.net.ConnectivityManager#CONNECTIVITY_ACTION} en su
133  manifiesto. Debido a que muchas aplicaciones se registran para recibir esta transmisión, un cambio de
134  red puede hacer que todas se activen y procesen la transmisión a la
135  vez.
136</p>
137
138<p>
139  Asimismo, en versiones anteriores de Android, las aplicaciones podían registrarse para recibir las transmisiones implícitas {@link
140  android.hardware.Camera#ACTION_NEW_PICTURE} y {@link
141  android.hardware.Camera#ACTION_NEW_VIDEO} de otras aplicaciones, como la
142  cámara. Cuando un usuario toma una foto con la aplicación de la cámara, estas aplicaciones se activan
143  para procesar la transmisión.
144</p>
145
146<p>
147  Para corregir estos problemas, en Android N se aplican las siguientes
148  optimizaciones:
149</p>
150
151<ul>
152  <li>Las aplicaciones orientadas a Android N no reciben transmisiones {@link
153  android.net.ConnectivityManager#CONNECTIVITY_ACTION}, aun cuando contengan
154 entradas de manifiesto que les permitan solicitar notificaciones de estos eventos. Las aplicaciones que
155  se ejecutan aún pueden escuchar {@code CONNECTIVITY_CHANGE} en su subproceso principal
156 si solicitan una notificación con un {@link android.content.BroadcastReceiver}.
157  </li>
158
159  <li>Las aplicaciones no pueden enviar ni recibir transmisiones {@link
160  android.hardware.Camera#ACTION_NEW_PICTURE} ni {@link
161  android.hardware.Camera#ACTION_NEW_VIDEO}. Esta optimización
162  afecta a todas las aplicaciones, no solo a aquellas orientadas a Android N.
163  </li>
164</ul>
165
166<p>Si la aplicación utiliza cualquiera de estas intents, debes quitar las dependencias
167  en ellas lo antes posible a fin de poder orientar los dispositivos con Android N correctamente.
168  El framework de Android ofrece varias soluciones para mitigar la necesidad de
169  estas transmisiones implícitas. Por ejemplo, la API {@link
170  android.app.job.JobScheduler} proporciona un mecanismo sólido para programar
171  operaciones de red cuando se cumplen las condiciones especificadas, como una conexión a una
172  red de uso no medido. Puedes usar {@link
173  android.app.job.JobScheduler} para responder a cambios en proveedores de contenido.
174</p>
175
176<p>
177  Para obtener más información sobre optimizaciones en segundo plano en Android N y la manera de adaptar tu aplicación,
178  consulta <a href="{@docRoot}preview/features/background-optimization.html">Optimizaciones
179  en segundo plano</a>.
180</p>
181
182<h2 id="perm">Cambios en los permisos</h2>
183
184<p>
185  En Android N, se incorporan cambios en permisos que pueden afectar tu aplicación.
186</p>
187
188<h3 id="permfilesys">Cambios en los permisos del sistema de archivos</h3>
189
190<p>
191  Para mejorar la seguridad de los archivos privados, el directorio privado de
192  las aplicaciones orientadas a Android N o versiones posteriores tiene acceso restringido. (<code>0700</code>).
193  Esta configuración evita la fuga de metadatos de archivos privados, como su tamaño
194  o existencia. Este cambio en los permisos tiene varios efectos secundarios:
195</p>
196
197<ul>
198  <li>
199    Los propietarios ya no pueden reducir los permisos de archivo de los archivos privados,
200    y un intento de hacerlo utilizando
201    {@link android.content.Context#MODE_WORLD_READABLE} o
202    {@link android.content.Context#MODE_WORLD_WRITEABLE} activará una
203   {@link java.lang.SecurityException}.
204    <p class="note">
205      <strong>Nota:</strong> Desde ahora, esta restricción no se aplica planamente.
206      Las aplicaciones pueden seguir modificando los permisos para sus directorios privados con
207      las API nativas o la API {@link java.io.File File}. Sin embargo, desaconsejamos
208      reducir los permisos para el directorio privado.
209    </p>
210  </li>
211  <li>
212    Pasar URI <code>file://</code> fuera del dominio del paquete puede dar al
213    receptor una ruta de acceso inaccesible. Por lo tanto, los intentos de pasar un
214    URI <code>file://</code> activan una
215    <code>FileUriExposedException</code>. La manera recomendada para compartir el
216    contenido de un archivo privado consiste en utilizar el {@link
217    android.support.v4.content.FileProvider}.
218  </li>
219  <li>
220    El {@link android.app.DownloadManager} ya no puede compartir archivos
221    almacenados de manera privada por nombre de archivo. Las aplicaciones heredadas pueden terminar con una
222    ruta de acceso inaccesible cuando acceden a {@link
223    android.app.DownloadManager#COLUMN_LOCAL_FILENAME}. Las aplicaciones orientadas a
224    Android N o versiones posteriores activan una {@link java.lang.SecurityException} cuando
225    intentan acceder a
226    {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}.
227    Las aplicaciones heredadas que establecen la ubicación de descarga en una ubicación pública
228    usando
229    {@link
230    android.app.DownloadManager.Request#setDestinationInExternalFilesDir
231    DownloadManager.Request.setDestinationInExternalFilesDir()} o
232    {@link
233    android.app.DownloadManager.Request#setDestinationInExternalPublicDir
234    DownloadManager.Request.setDestinationInExternalPublicDir()}
235    siguen teniendo acceso a la ruta de acceso en
236    {@link android.app.DownloadManager#COLUMN_LOCAL_FILENAME}; sin embargo, se desaconseja
237    seguir este método. El método preferido para acceder a un archivo
238    expuesto por el{@link android.app.DownloadManager} consiste en utilizar
239    {@link android.content.ContentResolver#openFileDescriptor
240    ContentResolver.openFileDescriptor()}.
241  </li>
242</ul>
243
244<h2 id="sharing-files">Intercambio de archivos entre aplicaciones</h2>
245
246<p>
247En las aplicaciones orientadas a Android N, el framework de Android aplica
248la política de la API {@link android.os.StrictMode} que prohíbe exponer URI {@code file://}
249fuera de la aplicación. Si una intent con un URI de archivo sale de tu aplicación, la aplicación falla
250con una excepción {@code FileUriExposedException}.
251</p>
252
253<p>
254Para compartir archivos entre aplicaciones, debes enviar un URI {@code content://}
255y otorgar un permiso de acceso temporal en el URI. La forma más sencilla de otorgar este permiso es
256utilizando la clase {@link android.support.v4.content.FileProvider}. Para obtener más información
257sobre permisos e intercambio de archivos,
258consulta <a href="{@docRoot}training/secure-file-sharing/index.html">Intercambio de archivos</a>.
259</p>
260
261<h2 id="accessibility">Mejoras de accesibilidad</h2>
262
263<p>
264  En Android N, se incluyen cambios destinados a mejorar la usabilidad de la
265  plataforma para usuarios con defectos o discapacidades visuales. Estos cambios
266  generalmente no deben exigir modificaciones en el código de tu aplicación. Sin embargo, debes revisar
267  estas funciones y probarlas con tu aplicación para avaluar el posible impacto en la experiencia
268  del usuario.
269</p>
270
271
272<h3 id="screen-zoom">Zoom de la pantalla</h3>
273
274<p>
275  Android N permite a los usuarios configurar <strong>Display size</strong>, el ajuste que expande
276  o contrae todos los elementos de la pantalla, lo cual mejora la accesibilidad al dispositivo
277  para usuarios con poca visión. Estos no podrán superar el valor de zoom
278  mínimo de <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">
279  sw320dp</a> para el ancho de pantalla, que es el ancho de un Nexus 4, un teléfono común de tamaño intermedio.
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>Figura 3:</strong> En la pantalla de la derecha se muestra el efecto que tiene
294  aumentar Display size para un dispositivo con una imagen de sistema de Android N.
295</p>
296
297
298<p>
299  Al cambiar la densidad del dispositivo, el sistema notifica a las aplicaciones de las
300  siguientes maneras:
301</p>
302
303<ul>
304  <li>Si una aplicación se orienta hacia el nivel de API 23 o uno inferior, el sistema automáticamente finaliza
305  todos los procesos en segundo plano. Esto significa que, si un usuario hace a un lado
306  dicha aplicación para abrir la pantalla <em>Settings</em> y cambiar la configuración de
307  <strong>Display size</strong>, el sistema finalizará la aplicación tal
308  como lo haría en una situación de bajos recursos de memoria. Si en la aplicación hay procesos en
309  primer plano, el sistema notifica a estos procesos el cambio en la configuración como se
310  indica en <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Manejo de cambios
311  en tiempo de ejecución</a>, así como lo haría si cambiara la orientación del dispositivo.
312  </li>
313
314  <li>Si una aplicación se orienta hacia Android N, se notifica a todos los procesos
315  (en primer y segundo plano) el cambio en la configuración, como se
316  indica en <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Manejo de cambios
317  en tiempo de ejecución</a>.
318  </li>
319</ul>
320
321<p>
322  En la mayoría de las aplicaciones, no se necesitan cambios para admitir esta función, si
323  en ellas se siguen las prácticas recomendadas de Android. Verificaciones específicas que deben realizarse:
324</p>
325
326<ul>
327  <li>Prueba tu aplicación en un dispositivo con ancho de pantalla <code><a href=
328  "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
329  y asegúrate de que funcione bien.
330  </li>
331
332  <li>Cuando se modifique la configuración del dispositivo, actualiza la información almacenada en caché que
333  dependa de la densidad, como los mapas de bits o recursos almacenados en caché que se carguen desde la
334  red. Busca de cambios en la configuración cuando se reanude la actividad de la aplicación, después de la
335  pausa.
336    <p class="note">
337      <strong>Nota:</strong> Si almacenaste en caché datos que dependen de la configuración, te
338      convendrá incluir metadatos relacionados, como el tamaño de pantalla
339      correspondiente o la densidad de píxeles para dichos datos. Guardar estos metadatos te permite
340      decidir si necesitas actualizar los datos almacenados en caché después de un cambio en la
341      configuración.
342    </p>
343  </li>
344
345  <li>Evita especificar dimensiones con unidades px, ya que no responden a la
346  densidad de pantalla. En lugar de ello, recurre a unidades de <a href="{@docRoot}guide/practices/screens_support.html">píxeles
347  (<code>dp</code>) independientes de la densidad</a>.
348  </li>
349</ul>
350
351<h3 id="vision-settings">Vision Settings en el asistente de configuración</h3>
352
353<p>
354  Vision Settings se incluye en la pantalla de Bienvenida de Android N, en la cual los usuarios pueden
355  configurar los siguientes ajustes de accesibilidad para un nuevo dispositivo:
356  <strong>Magnification gesture</strong>, <strong>Font size</strong>,
357  <strong>Display size</strong> y <strong>TalkBack</strong>. Este cambio
358  aumenta la visibilidad de errores relacionados con diferentes ajustes de pantalla. Para
359  evaluar el impacto de esta función, debes probar tus aplicaciones con estos
360  ajustes habilitados. Puedes encontrarlos en <strong>Settings &gt;
361  Accessibility</strong>.
362</p>
363
364<h2 id="ndk">Aplicaciones del NDK con vínculos a bibliotecas de plataformas</h2>
365
366<p>
367  En Android N, se incluyen cambios en el espacio de nombres a fin de evitar la carga de API no públicas.
368  Si usas el NDK, solo debes emplear API públicas de la plataforma de
369  Android. El uso de API no públicas en la próxima versión oficial de Android
370  puede hacer que tu aplicación se bloquee.
371</p>
372
373<p>
374  Con el propósito de alertarte sobre el uso de API no públicas, las aplicaciones que funcionen en un dispositivo con
375  Android N producirán un error de salida de logcat cuando una de ellas llame a una API no pública.
376  Este error también aparecerá en la pantalla del dispositivo como un mensaje para ayudar a
377  generar conciencia respecto de la situación. Debes revisar el código de tu aplicación para
378  quitar el uso de API de plataformas no públicas y probar por completo tus aplicaciones con
379  un dispositivo de prueba o emulador.
380</p>
381
382<p>
383  Si tu aplicación depende de bibliotecas de plataformas, consulta la documentación sobre el NDK a fin de hallar
384  soluciones típicas para el reemplazo de API privadas comunes por API públicas equivalentes.
385  También es posible que establezcas vínculos con bibliotecas de plataformas sin notarlo,
386  en especial si tu aplicación usa una biblioteca que forma parte de la plataforma (como
387  <code>libpng</code>), pero no del NDK. En ese caso, asegúrate de que
388  tu APK contenga todos los archivos .so con los cuales intentaste establecer vínculos.
389</p>
390
391<p class="caution">
392  <strong>Advertencia:</strong> Algunas bibliotecas de terceros pueden establecer vínculos con API
393  no públicas. Si tu aplicación usa estas bibliotecas, es probable que se bloquee al ejecutarse
394  en la próxima versión oficial de Android.
395</p>
396
397<p>
398  Las aplicaciones no deben depender de bibliotecas nativas no incluidas en el NDK
399  ni usarlas, ya que pueden modificarse o eliminarse en la transición de una versión de Android a
400  otra. El cambio de OpenSSL a BoringSSL es un ejemplo de modificaciones como esta.
401  A su vez, los diferentes dispositivos pueden ofrecer distintos niveles de compatibilidad, debido a que
402  no existen requisitos de compatibilidad para bibliotecas de plataformas no incluidas
403  en el NDK. Si debes acceder a bibliotecas no relacionadas con el NDK en dispositivos anteriores, haz que la
404  carga dependa del nivel de la API de Android.
405</p>
406
407<p>
408  Para ayudarte a diagnosticar estos tipos de problemas, a continuación, se ofrecen ejemplos de errores de Java y
409  del NDK que podrías hallar al intentar compilar tu aplicación con Android N:
410</p>
411
412<p>Ejemplo de error de 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>Ejemplo de error de 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  Aquí se ofrecen soluciones típicas para aplicaciones en las que se produzcan estos tipos de errores:
426</p>
427
428<ul>
429  <li>getJavaVM y getJNIEnv de libandroid_runtime.so pueden reemplazarse
430  por funciones estándares de JNI:
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>El símbolo {@code property_get} de {@code libcutils.so} puede
439    reemplazarse por la API pública {@code alternative __system_property_get}.
440   Para hacerlo, usa {@code __system_property_get} con el siguiente elemento include:
441<pre>
442#include &lt;sys/system_properties.h&gt;
443</pre>
444  </li>
445
446  <li>El símbolo {@code SSL_ctrl} de {@code libcrypto.so} debe
447    reemplazarse por una versión local de la aplicación. Por ejemplo, debes establecer un vínculo estático de
448  {@code libcyrpto.a} en tu archivo {@code .so} o incluir un vínculo dinámico propio de
449  {@code libcrypto.so} de BoringSSL u OpenSSL en tu aplicación.
450  </li>
451</ul>
452
453<h2 id="afw">Android for Work</h2>
454<p>
455  Android N contiene cambios para aplicaciones orientadas a Android for Work, entre los que se incluyen
456  modificaciones en la instalación de certificados, el restablecimiento de contraseñas, la gestión de usuarios
457  secundarios y el acceso a identificadores de dispositivos. Si creas aplicaciones para entornos de
458  Android for Work, debes estudiar estos cambios y modificar
459  tu aplicación según corresponda.
460</p>
461
462<ul>
463  <li>Debes usar un instalador de certificados delegados para que el controlador de políticas de dispositivos (DPC) pueda
464  configurarlo. Para aplicaciones de propietarios de perfiles y de dispositivos orientadas al SDK de Android N, debes
465  usar el instalador de certificados delegados para que el
466  DPC llame a
467  <code>DevicePolicyManager.setCertInstallerPackage()</code>. Si el instalador
468  no está instalado de antemano, el sistema emite una
469  <code>IllegalArgumentException</code>.
470  </li>
471
472  <li>Las restricciones de restablecimiento de contraseñas para administradores de dispositivos ahora se aplican a los propietarios de
473  perfiles. Los administradores de dispositivos ya no pueden usar
474  {@code DevicePolicyManager.resetPassword()} para borrar contraseñas ni modificar
475  las que ya están establecidas. No obstante, pueden establecer una contraseña, aunque solo
476  cuando el dispositivo no tiene contraseña, PIN ni patrón.
477  </li>
478
479  <li>Los propietarios de dispositivos y perfiles pueden administrar cuentas aun cuando haya
480  restricciones. Tienen la posibilidad de llamar a las API de administración de cuentas
481  incluso al haber restricciones <code>DISALLOW_MODIFY_ACCOUNTS</code> para el usuario.
482  </li>
483
484  <li>Los propietarios de dispositivos pueden administrar usuarios secundarios de manera más sencilla. Cuando un dispositivo
485  funciona en el modo de propietario de dispositivo, automáticamente se establece la restricción <code>DISALLOW_ADD_USER</code>
486. Esto evita que los usuarios creen usuarios secundarios no
487  administrados. A su vez, los métodos <code>CreateUser()</code> y
488  <code>createAndInitializeUser()</code> han sido dados de baja; los reemplaza el nuevo método
489  <code>DevicePolicyManager.createAndManageUser()</code>.
490  </li>
491
492  <li>Los propietarios de dispositivos pueden acceder a identificadores de dispositivos. Tienen la posibilidad de acceder a la
493  dirección MAC de Wi-Fi de un dispositivo a través de
494  <code>DevicePolicyManagewr.getWifiMacAddress()</code>. Si nunca se habilitó la función Wi-Fi
495  en el dispositivo, este método devuelve un valor {@code null}.
496  </li>
497
498  <li>La configuración Work Mode controla el acceso a las aplicaciones de trabajo. Cuando este ajuste está desactivado, el
499  launcher del sistema indica que las aplicaciones de trabajo no están disponibles atenuándolas. Para volver
500  a restaurar el comportamiento normal, habilita el modo de trabajo nuevamente.
501</ul>
502
503<p>
504  Para obtener más información sobre los cambios de Android for Work en Android N, consulta
505  <a href="{@docRoot}preview/features/afw.html">Actualizaciones de Android for Work</a>.
506</p>
507
508<h2 id="annotations">Retención de anotaciones</h2>
509
510<p>
511Android N soluciona un error por el cual la visibilidad de las anotaciones se había ignorado.
512Este problema permitió que el tiempo de ejecución accediera a anotaciones a las que no debía
513tener acceso. Entre estas anotaciones se incluyen las siguientes:
514</p>
515
516<ul>
517   <li>{@code VISIBILITY_BUILD}: destinada a ser visible solo en el momento de compilación.</li>
518   <li>{@code VISIBILITY_SYSTEM}: destinada a ser visible en el tiempo de ejecución, pero únicamente al
519    sistema subyacente.</li>
520</ul>
521
522<p>
523Si tu aplicación se basa en este comportamiento, agrega una política de retención para las anotaciones que deben
524estar disponibles en el tiempo de ejecución. Para ello, usa {@code @Retention(RetentionPolicy.RUNTIME)}.
525</p>
526
527<h2 id="other">Otros aspectos importantes</h2>
528
529<ul>
530<li>Cuando una aplicación funcione en Android N, pero esté orientada a un nivel de API inferior,
531y el usuario modifique el tamaño de pantalla, el proceso de la aplicación finalizará. La aplicación
532debe tener capacidad para manejar correctamente esta situación. De lo contrario, se bloqueará
533cuando el usuario la restaure desde Recents.
534
535<p>
536Debes probar tu aplicación para controlar que no tenga lugar
537este comportamiento.
538Puedes hacerlo produciendo un error idéntico
539al finalizarla manualmente a través del panel DDMS.
540</p>
541
542<p>
543Las aplicaciones orientadas a Android N y versiones posteriores no finalizarán automáticamente por cambios en la densidad;
544sin embargo, es posible que respondan en forma deficiente a los cambios en la configuración.
545</p>
546</li>
547
548<li>
549En Android N, las aplicaciones deben tener capacidad para manejar correctamente los cambios de configuración
550y no deben bloquearse durante inicios posteriores. Puedes verificar el comportamiento de las aplicaciones
551modificando el tamaño de la fuente (<strong>Setting</strong> &gt;
552<strong>Display</strong> &gt; <strong>Font size</strong>) y restaurándolas
553desde Recents.
554</li>
555
556<li>
557Debido a un error en versiones anteriores de Android, el sistema no indicaba la escritura
558a un socket del TCP en el subproceso principal como una violación del modo strict. En Android N, se corrige este error.
559Las aplicaciones que tienen este comportamiento, ahora emiten una {@code android.os.NetworkOnMainThreadException}.
560Generalmente, realizar operaciones de red en el subproceso principal no es una buena idea porque estas operaciones
561suelen tener una latencia alta de cola que genera mensajes que indican que la aplicación no responde y bloqueos.
562</li>
563
564<li>
565De manea predeterminada, la familia de métodos {@code Debug.startMethodTracing()} ahora
566almacena los resultados en el directorio específico del paquete en el almacenamiento compartido,
567en lugar de hacerlo en el nivel superior
568de la tarjeta SD.  Esto significa que las aplicaciones ya no tienen que solicitar el permiso {@code WRITE_EXTERNAL_STORAGE} para usar estas API.
569</li>
570
571<li>
572Muchas API de la plataforma han comenzado a controlar en busca del envío de cargas grandes
573a través de transacciones {@link android.os.Binder}. Además, el
574sistema ahora vuelve a emitir {@code TransactionTooLargeExceptions}
575como {@code RuntimeExceptions}, en lugar de registrarlas o suprimirlas silenciosamente.  Un
576ejemplo común es almacenar demasiados datos en
577{@link android.app.Activity#onSaveInstanceState Activity.onSaveInstanceState()},
578 lo que hace que {@code ActivityThread.StopInfo} emita una
579{@code RuntimeException} cuando la aplicación se orienta a Android N.
580</li>
581
582<li>
583Si una aplicación publica tareas {@link java.lang.Runnable} en una {@link android.view.View}, y
584la {@link android.view.View}
585no está anexada a una ventana, el sistema
586pone en cola la tarea {@link java.lang.Runnable} con la {@link android.view.View}.
587La tarea {@link java.lang.Runnable} no se ejecuta hasta que la
588{@link android.view.View} esté anexada
589a una ventana. Este comportamiento soluciona los siguientes errores:
590<ul>
591   <li>Si una aplicación publicaba una {@link android.view.View} desde un subproceso que no fuera el subproceso de la IU
592   de la ventana prevista, la tarea {@link java.lang.Runnable} podía ejecutarse en el subproceso incorrecto.
593   </li>
594   <li>Si la tarea {@link java.lang.Runnable} se publicaba desde un subproceso que no fuera
595   un subproceso de looper, la aplicación podía exponer la terea {@link java.lang.Runnable}.</li>
596</ul>
597</li>
598
599<li>
600Si una aplicación en Android N con el permiso
601{@link android.Manifest.permission#DELETE_PACKAGES DELETE_PACKAGES}
602intentaba borrar un paquete instalado por otra aplicación,
603el sistema solicitaba la confirmación del usuario. En este escenario, las aplicaciones debían esperar recibir el estado
604{@link android.content.pm.PackageInstaller#STATUS_PENDING_USER_ACTION STATUS_PENDING_USER_ACTION}
605al invocar
606{@link android.content.pm.PackageInstaller#uninstall PackageInstaller.uninstall()}.
607</li>
608
609</ul>
610
611