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 > 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 -> GetJavaVM from <jni.h> 433AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or 434JavaVM::AttachCurrentThread from <jni.h>. 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 <sys/system_properties.h> 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> > 552<strong>Display</strong> > <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