summaryrefslogtreecommitdiff
path: root/docs/html-intl/intl/es/preview/behavior-changes.jd
blob: fdc85464df54cb00549d4d147749193a227685c5 (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
page.title=Cambios en los comportamientos
page.keywords=preview,sdk,compatibility
meta.tags=“preview”, “compatibilidad”
page.tags="preview", "developer preview"
page.image=images/cards/card-n-changes_2x.png
@jd:body


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

<h2>Contenido del documento</h2>

<ol>
  <li><a href="#perf">Mejoras de rendimiento</a>
    <ol>
      <li><a href="#doze">Doze</a></li>
      <li><a href="#bg-opt">Optimizaciones en segundo plano</a></li>
    </ol>
  </li>
  <li><a href="#perm">Cambios en los permisos</a></li>
  <li><a href="#accessibility">Mejoras de accesibilidad</a>
    <ol>
      <li><a href="#screen-zoom">Zoom de la pantalla</a></li>
      <li><a href="#vision-settings">Vision Settings en el asistente de configuración</a></li>
    </ol>
  </li>
  <li><a href="#ndk">Aplicaciones de NDK con vínculos a bibliotecas de plataformas</a></li>
  <li><a href="#afw">Android for Work</a></li>
</ol>

<h2>Consulta también</h2>
<ol>
  <li><a href="{@docRoot}preview/api-overview.html">
    Información general sobre la API de Android N</a></li>
</ol>

</div>
</div>


<p>
  Además de nuevas funciones y capacidades, en Android N
  se incluyen varios cambios en el comportamiento del sistema y de las API. En este documento
  se destacan algunos de los cambios principales que debes comprender y tener en cuenta
  en tus aplicaciones.
</p>

<p>
  Si publicaste anteriormente una aplicación para Android, ten en cuenta que tu aplicación
  podría verse afectada por estos cambios en la plataforma.
</p>


<h2 id="perf">Mejoras de rendimiento</h2>

<p>
  Android N contiene cambios en el comportamiento del sistema destinados a lograr mejoras en la duración
  de las baterías de los dispositivos, el uso de la memoria RAM y el rendimiento de las aplicaciones. Estos cambios pueden tener efecto en la
  disponibilidad de recursos y notificaciones de sistema para tu aplicación. Debes
  revisar estos cambios y evaluar las posibles formas en que tu aplicación deba adecuarse a
  ellas.
</p>

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

<p>
  Doze, presentado en Android 6.0 (nivel de API 23), prolonga la duración de la batería
  aplazando actividades de CPU y red cuando un usuario deja un dispositivo desenchufado,
  quieto y con la pantalla apagada. En Android N se ofrecen más
  mejoras para Doze a través de la aplicación de un subconjunto de restricciones de CPU y red
  mientras el dispositivo se encuentra desenchufado y con la pantalla apagada, aunque no necesariamente
  quieto; por ejemplo, al ir dentro del bolsillo de un usuario en movimiento.
</p>


<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" />
<p class="img-caption">
  <strong>Figura 1:</strong> Ilustración del modo en que Doze aplica un primer nivel de
  restricciones de actividad del sistema para prolongar la duración de la batería.
</p>

<p>
  Cuando un dispositivo funciona con la batería y la pantalla permanece apagada durante un tiempo
  determinado, se activa en este el modo Doze y se aplica el primer subconjunto de restricciones: se desactiva
  el acceso de las aplicaciones a la red y se aplazan tareas y sincronizaciones. Si el dispositivo
  permanece quieto durante un tiempo determinado tras activarse el modo Doze, el sistema aplica el
  resto de las restricciones del modo a alarmas de {@link android.os.PowerManager.WakeLock},
  {@link android.app.AlarmManager} y análisis de GPS o Wi-Fi. Independientemente de que
  se apliquen algunas o todas las restricciones del modo Doze, el sistema activa el
  dispositivo durante plazos de mantenimiento breves en los cuales las aplicaciones tienen
  acceso a la red y pueden ejecutar sincronizaciones o procesos aplazados.
</p>


<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
<p class="img-caption">
  <strong>Figura 2:</strong> Ilustración del modo en que Doze aplica un segundo nivel de
  restricciones de actividad del sistema después de que el dispositivo permanece quieto durante un tiempo determinado.
</p>

<p>
  Ten en cuenta que cuando se activar la pantalla o se enchufa el dispositivo se desactiva el modo Doze y
  se retiran estas restricciones de procesamiento. El comportamiento adicional no
  tiene efecto sobre las recomendaciones ni las prácticas recomendadas para adaptar tu aplicación a la versión
  anterior de Doze, presentada en Android 6.0 (nivel de API 23), según lo descrito en
  <a href="{@docRoot}training/monitoring-device-state/doze-standby.html">
  Optimización para Doze y App Standby</a>. De todos modos, debes
  seguir las recomendaciones; por ejemplo, la de usar Google Cloud Messaging (GCM) para
  enviar y recibir mensajes, y la de planificar actualizaciones para considerar
  el comportamiento adicional de Doze.
</p>


<h3 id="bg-opt">Project Svelte: Optimizaciones en segundo plano</h3>

<p>
  En Android N se eliminan tres difusiones implícitas para optimizar el uso de la
  memoria y el consumo de energía. Este cambio es necesario porque las difusiones
  implícitas a menudo inician aplicaciones que se registran para realizar un seguimiento de ellas en
  segundo plano. La eliminación de estas difusiones puede mejorar sustancialmente el rendimiento
  del dispositivo y la experiencia del usuario.
</p>

<p>
  Los dispositivos móviles están sujetos a cambios de conectividad frecuentes
  entre los modos de datos Wi-Fi y móviles. Actualmente, las aplicaciones pueden realizar controles en busca de cambios en la
  conectividad registrando un receptor para la difusión implícita {@link
  android.net.ConnectivityManager#CONNECTIVITY_ACTION} en su
  manifiesto. Debido a que muchas aplicaciones se registran para recibir esta difusión, un cambio de
  red puede hacer que todas se activen y procesen la difusión a la
  vez.
</p>

<p>
  Asimismo, las aplicaciones pueden registrarse para recibir las difusiones implícitas {@link
  android.hardware.Camera#ACTION_NEW_PICTURE} y {@link
  android.hardware.Camera#ACTION_NEW_VIDEO} de otras aplicaciones, como la
  cámara. Cuando un usuario toma una foto con la aplicación de la cámara, estas aplicaciones se activan
  para procesar la difusión.
</p>

<p>
  Para corregir estos problemas, en Android N se aplican las siguientes
  optimizaciones:
</p>

<ul>
  <li>Las aplicaciones orientadas a Android N no reciben difusiones {@link
  android.net.ConnectivityManager#CONNECTIVITY_ACTION}, aún cuando contengan
  entradas de manifiesto que les permitan solicitar notificaciones de estos eventos. No obstante, las aplicaciones que se ejecuten
  en primer plano pueden realizar el seguimiento de {@code CONNECTIVITY_CHANGE} en sus subprocesos
  principales si solicitan notificación a través de {@link
  android.content.BroadcastReceiver}.
  </li>

  <li>Las aplicaciones no pueden enviar ni recibir difusiones {@link
  android.hardware.Camera#ACTION_NEW_PICTURE} ni {@link
  android.hardware.Camera#ACTION_NEW_VIDEO}. Esta optimización
  afecta a todas las aplicaciones, no solo a las que estén orientadas a Android N.
  </li>
</ul>

<p>
  En versiones futuras de Android, es posible que dejen de usarse más difusiones implícitas y
  servicios en segundo plano no asociados. Por esta razón, debes evitar dependencias en receptores declarados en manifiestos para difusiones implícitas o
  eliminarlas de ellos,
  y aplicar lo mismo a los servicios en segundo plano.
</p>

<p>
  El framework de Android proporciona varias soluciones para reducir la necesidad de
  difusiones implícitas o servicios en segundo plano. Por ejemplo, la API de {@link
  android.app.job.JobScheduler} proporciona un mecanismo sólido para programar
  operaciones de red cuando se cumplen condiciones especificadas, como la conexión a una red
  de uso no medido. Puedes incluso usar {@link
  android.app.job.JobScheduler} para responder a cambios de los proveedores de contenido.
</p>

<p>
  Para obtener más información sobre este cambio en el comportamiento y la manera de adaptar tu aplicación,
  consulta <a href="{@docRoot}preview/features/background-optimization.html">Optimizaciones
  en segundo plano</a>.
</p>


<h2 id="perm">Cambios en los permisos</h2>

<p>
  En Android N se incorporan cambios en permisos que pueden tener efecto en tu aplicación.
  Se incluyen cambios en permisos de cuentas de usuarios y un nuevo permiso para operaciones de escritura en
  dispositivos de almacenamiento externo. A continuación, se ofrece un resumen de los permisos que se modificaron en
  la muestra:
</p>

<ul>
  <li>{@code GET_ACCOUNTS} (Obsoleto).
    <p>
      El permiso GET_ACCOUNTS ha quedado en desuso. El sistema ignora este
      permiso para las aplicaciones orientadas a Android N.
    </p>
  </li>

</ul>



<h2 id="accessibility">Mejoras de accesibilidad</h2>

<p>
  En Android N se incluyen cambios destinados a mejorar la utilidad  de la
  plataforma para usuarios con defectos o discapacidades visuales. Estos cambios
  generalmente no exigirán modificaciones en el código de tu aplicación. Sin embargo, debes revisar
  estas funciones y probarlas con tu aplicación para avaluar el posible impacto en la experiencia
  del usuario.
</p>


<h3 id="screen-zoom">Zoom de la pantalla</h3>

<p>
  Android N permite a los usuarios configurar <strong>Display size</strong>, el ajuste que expande
  o contrae todos los elementos de la pantalla lo cual mejora la accesibilidad al dispositivo
  para usuarios con poca visión. Estos no podrán superar el valor de zoom mínimo de zoom de
  <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">
  sw320dp</a> para el ancho de pantalla, que es el ancho de un Nexus 4, un teléfono común de tamaño intermedio.
</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>Figura 3:</strong> En la pantalla de la derecha se muestra el efecto que tiene
  aumentar Display size para un dispositivo con una imagen de sistema de Android N.
</p>


<p>
  Al cambiar la densidad del dispositivo, el sistema notifica a las aplicaciones de las
  siguientes maneras:
</p>

<ul>
  <li>Si una aplicación se orienta hacia el nivel de API 23 o uno inferior, el sistema automáticamente finaliza
  todos sus procesos en segundo plano. Esto significa que si un usuario hace a un lado
  dicha aplicación para abrir la pantalla <em>Settings</em> y cambiar la configuración de
  <strong>Display size</strong>, el sistema finalizará la aplicación tal
  como lo haría en una situación de bajos recursos de memoria. Si en la aplicación hay procesos en
  primer plano activos, el sistema notifica a estos el cambio en la configuración como se
  indica en <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Manejo de cambios
  en tiempo de ejecución</a>, así como lo haría si cambiara la orientación del dispositivo.
  </li>

  <li>Si una aplicación se orienta hacia Android N, se notifica a todos sus procesos
  (en primer y segundo plano) el cambio en la configuración, como se
  indica en <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Manejo de cambios
  en tiempo de ejecución</a>.
  </li>
</ul>

<p>
  En la mayoría de las aplicaciones no se necesitan cambios para admitir esta función, ya que
  en ellas rigen prácticas recomendadas de Android. Verificaciones específicas que deben realizarse:
</p>

<ul>
  <li>Prueba tu aplicación en un dispositivo con ancho de pantalla <code><a href=
  "{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
  y asegúrate de que funcione bien.
  </li>

  <li>Cuando se modifique la configuración del dispositivo, actualiza la información almacenada en caché que
  dependa de la densidad, como los mapas de bits o recursos almacenados en caché que se carguen desde la
  red. Realiza una inspección en busca de cambios en la configuración cuando se reanude la actividad de la aplicación, después de la
  pausa.
    <p class="note">
      <strong>Nota:</strong> Si almacenaste en caché datos que dependen de la configuración, te
      convendrá incluir metadatos relacionados, como el tamaño de pantalla
      correspondiente o la densidad de píxeles para dichos datos. Guardar estos metadatos de permite
      decidir si necesitas actualizar los datos almacenados en caché después de un cambio en la
      configuración.
    </p>
  </li>

  <li>Evita especificar dimensiones con unidades px, ya que no responden a la
  densidad de pantalla. En lugar de ello, recurre a unidades de <a href="{@docRoot}guide/practices/screens_support.html">píxeles
  (<code>dp</code>) independientes de la densidad</a>.
  </li>
</ul>

<h3 id="vision-settings">Vision Settings en el asistente de configuración</h3>

<p>
  Vision Settings se incluye en la pantalla de Bienvenida de Android N, en la cual los usuarios pueden
  pueden configurar los siguientes ajustes de accesibilidad para un nuevo dispositivo:
  <strong>Magnification gesture</strong>, <strong>Font size</strong>,
  <strong>Display size</strong> y <strong>TalkBack</strong>. Este cambio
  aumenta la visibilidad de errores relacionados con diferentes ajustes de pantalla. Para
  evaluar el impacto de esta función, debes probar tus aplicaciones con estos
  ajustes habilitados. Puedes encontrarlos en <strong>Settings &gt;
  Accessibility</strong>.
</p>

<h2 id="ndk">Aplicaciones de NDK con vínculos a bibliotecas de plataformas</h2>

<p>
  En Android N, se incluyen cambios en el espacio de nombres a fin de evitar la carga de API no públicas.
  Si usas el NDK, solo debes emplear API públicas de la plataforma de
  Android. El uso de API no públicas en la próxima versión oficial de Android
  puede hacer que tu aplicación se bloquee.
</p>

<p>
  Con el propósito de alertarte sobre el uso de API no públicas, las aplicaciones que funcionen en un dispositivo con
  Android N producirán un error de salida de logcat cuando una de ellas llame a una API no pública.
  Este error también aparecerá en la pantalla del dispositivo con forma de mensaje para
  generar conciencia respecto de la situación. Debes revisar el código de tu aplicación para
  eliminar el uso de API de plataforma no públicas y probar por completo tus aplicaciones con
  un dispositivo de prueba o emulador.
</p>

<p>
  Si tu aplicación depende de bibliotecas de plataformas, consulta la documentación sobre NDK para hallar
  soluciones típicas para el reemplazo de API privadas comunes por API equivalentes.
  También es posible que establezcas vínculos con bibliotecas de plataformas sin notarlo,
  en especial si tu aplicación usa una biblioteca que forma parte de la plataforma (como
  <code>libpng</code>), pero no del NDK. En ese caso, asegúrate de que
  tu APK contenga todos los archivos .so con los cuales intentaste establecer vínculos.
</p>

<p class="caution">
  <strong>Precaución:</strong> Algunas bibliotecas de terceros pueden establecer vínculos con API
  no públicas. Si tu aplicación usa estas bibliotecas, es probable que se bloquee al ejecutarse
  en la próxima versión oficial de Android.
</p>

<p>
  Las aplicaciones no deben depender de bibliotecas nativas no incluidas en el NDK
  ni usarlas, ya que pueden modificarse o eliminarse en la transición de una versión de Android a
  otra. El cambio de OpenSSL a BoringSSL es un ejemplo de modificaciones como esta.
  A su vez, los diferentes dispositivos pueden ofrecer distintos niveles de compatibilidad debido a que
  no existen requisitos de compatibilidad para bibliotecas de plataformas no incluidas
  en el NDK. Si debes acceder a bibliotecas no relacionadas en dispositivos anteriores, haz que la
  carga dependa del nivel de la Android API.
</p>

<p>
  Para ayudarte a diagnosticar estos tipos de problemas, a continuación se ofrecen ejemplos de errores de Java y
  NDK que podrías hallar al intentar crear tu aplicación con Android N:
</p>

<p>Ejemplo de error de Java:</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>Ejemplo de error de NDK:</p>
<pre class="no-pretty-print">
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
</pre>


<p>
  Aquí se ofrecen soluciones típicas para aplicaciones en las que se produzcan estos tipos de errores:
</p>

<ul>
  <li>getJavaVM y getJNIEnv de libandroid_runtime.so pueden reemplazarse
  por funciones de JNI:
<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>La utilización del símbolo {@code property_get} de {@code libcutils.so} puede
    reemplazarse por la alternativa pública {@code __system_property_get}.
   Para hacerlo, usa {@code __system_property_get} con el siguiente include:
<pre>
#include &lt;sys/system_properties.h&gt;
</pre>
  </li>

  <li>El símbolo {@code SSL_ctrl} de {@code libcrypto.so} debe
  reemplazarse por una versión local de la aplicación. Por ejemplo, debes establecer un vínculo estático de
  {@code libcyrpto.a} en tu archivo {@code .so} o incluir un vínculo dinámico propio de
  {@code libcrypto.so} de BoringSSL u OpenSSL en tu aplicación.
  </li>
</ul>

<h2 id="afw">Android for Work</h2>
<p>
  Android N contiene cambios para aplicaciones orientadas a Android for Work, entre los que se incluyen
  modificaciones en la instalación de certificados, el restablecimiento de contraseñas, la gestión de usuarios
  secundarios y el acceso a identificadores de dispositivos. Si planeas crear aplicaciones para entornos de
  Android for Work, debes repasar estos cambios y modificar
  tu aplicación de manera correspondiente.
</p>

<ul>
  <li>Debes usar un instalador de certificados delegados para que el controlador de políticas de dispositivos (DPC) pueda
  configurarlo. Para aplicaciones de propietarios de perfiles y de dispositivos orientadas al SDK de Android N, debes
  usar el instalador de certificados delegados para que el
  DPC llame a
  <code>DevicePolicyManager.setCertInstallerPackage()</code>. Si el instalador
  no está instalado de antemano, el sistema emite una
  <code>IllegalArgumentException</code>.
  </li>

  <li>Las restricciones de contraseñas para administradores de dispositivos ahora se aplican a los propietarios de
  perfiles. Los administradores de dispositivos ya no pueden usar
  <code>DevicePolicyManager.resetPassword()</code> para borrar contraseñas ni modificar
  las que ya están establecidas. No obstante, pueden establecer una contraseña, aunque solo
  cuando el dispositivo no tiene contraseña, PIN ni patrón.
  </li>

  <li>Los propietarios de dispositivos y perfiles pueden administrar cuentas aun cuando haya
  restricciones. Tienen la posibilidad de llamar a las API de administración de cuentas
  incluso al haber restricciones de <code>DISALLOW_MODIFY_ACCOUNTS</code> para el usuario.
  </li>

  <li>Los propietarios de dispositivos pueden administrar usuarios secundarios de manera más sencilla. Cuando un dispositivo
  funciona en el modo de propietario de dispositivo, se establece la restricción de <code>DISALLOW_ADD_USER</code>
  en forma automática. Esto evita que los usuarios creen usuarios secundarios no
  administrados. A su vez, los métodos <code>CreateUser()</code> y
  <code>createAndInitial()</code> han quedado en desuso; los reemplaza el nuevo método
  <code>DevicePolicyManager.createAndManageUser()</code>.
  </li>

  <li>Los propietarios de dispositivos pueden acceder a identificadores de dispositivos. Tienen la posibilidad de acceder a la
  dirección MAC de Wi-Fi de un dispositivo a través de
  <code>DevicePolicyManagewr.getWifiMacAddress()</code>. Si nunca se habilitó la función Wi-Fi
  en el dispositivo, este método devuelve un valor {@code null}.
  </li>
</ul>

<p>
  Para obtener más información sobre los cambios de Android for Work en Android N, consulta
  <a href="{@docRoot}preview/features/afw.html">Actualizaciones de Android for Work</a>.
</p>

<h2 id="other">Otros aspectos importantes</h2>

<ul>
<li>Cuando una aplicación funcione en Android N, esté orientada a un nivel de API inferior
y el usuario modifique el tamaño de pantalla, el proceso de la aplicación finalizará. La aplicación
debe tener capacidad para manejar correctamente esta situación. De lo contrario, se bloqueará
cuando el usuario la restaure desde Recents.

<p>
Debes probar tu aplicación para controlar que no tenga lugar
este comportamiento.
Puedes hacerlo produciendo un error idéntico
al finalizarla manualmente a través del panel DDMS.
</p>

<p>
Las aplicaciones orientadas a Android N y versiones posteriores no finalizarán automáticamente por cambios en la densidad;
sin embargo, es posible que respondan en forma deficiente a los cambios en la configuración.
</p>
</li>

<li>
En Android N, las aplicaciones deben tener capacidad para manejar correctamente los cambios de configuración
y no deben bloquearse durante inicios posteriores. Puedes verificar el comportamiento de las aplicaciones
modificando el tamaño de la fuente (<strong>Setting</strong> &gt;
<strong>Display</strong> &gt; <strong>Font size</strong>) y restaurándolas
desde Recents.
</li>
</ul>