Merge "Docs: Localized DAC pages for N Preview." into mnc-mr-docs am: e20502c240

am: 1c2ce95

* commit '1c2ce9522e9203396bf45dcf7fc87a7d17095e59':
  Docs: Localized DAC pages for N Preview.

Change-Id: Iae1e3d6bee0be9af2e64fff29a2ac4d02f3e0235
This commit is contained in:
David Friedman
2016-04-26 08:51:21 +00:00
committed by android-build-merger
163 changed files with 52060 additions and 14 deletions

View File

@@ -0,0 +1,676 @@
page.title=Android N para desarrolladores
meta.tags=“preview”, “Android N”
page.tags="preview", "developer preview"
page.image=images/cards/card-n-apis_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Funciones claves para desarrolladores</h2>
<ol>
<ul style="list-style-type:none;">
<li><a href="#multi-window_support">Compatibilidad con ventanas múltiples</a></li>
<li><a href="#notification_enhancements">Notificaciones</a></li>
<li><a href="#jit_aot">Compilación de JIT y AOT</a></li>
<li><a href="#quick_path_to_app_install">Acceso rápido a la instalación de aplicaciones</a></li>
<li><a href="#doze_on_the_go">Doze en movimiento</a></li>
<li><a href="#background_optimizations">Optimizaciones en segundo plano</a></li>
<li><a href="#data_saver">Ahorro de datos</a></li>
<li><a href="#tile_api">API para Mosaico de Configuración rápida</a></li>
<li><a href="#number-blocking">Bloqueo de números</a></li>
<li><a href="#call_screening">Filtración de llamadas</a></li>
<li><a href="#multi-locale_languages">Configuraciones regionales e idiomas</a></li>
<li><a href="#icu4">API de ICU4J en Android</a></li>
<li><a href="#gles_32">API de OpenGL ES 3.2</a></li>
<li><a href="#android_tv_recording">Grabación de Android TV</a></li>
<li><a href="#android_for_work">Android for Work</a></li>
<li><a href="#accessibility_enhancements">Accesibilidad</a></li>
<li><a href="#direct_boot">Inicio directo</a></li>
<li><a href="#key_attestation">Atestación de claves</a></li>
<li><a href="#network_security_config">Configuración de seguridad de la red</a></li>
<li><a href="#default_trusted_ca">CA de confianza predeterminada</a></li>
<li><a href="apk_signature_v2">Esquema de firma de APK v2</a></li>
<li><a href="#scoped_directory_access">Acceso a directorios determinados</a></li>
</ol>
</div>
</div>
<p>Android N aún se encuentra en proceso activo de desarrollo, pero puedes probarlo
ahora como parte de la N Developer Preview. En las secciones siguientes se destacan algunas de
las nuevas funciones para desarrolladores. </p>
<p>
Asegúrate de ver los <a href="{@docRoot}preview/behavior-changes.html">Cambios de comportamiento</a> para obtener información sobre
áreas en las cuales los cambios en las plataformas puedan tener efecto en tus aplicaciones, consultar las
guías del desarrollador para conocer mejor las funciones claves y descargar la <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia de la API</a> para obtener información sobre
API nuevas.
</p>
<h2 id="multi-window_support">Compatibilidad con ventanas múltiples</h2>
<p>En Android N, presentamos una nueva y muy solicitada función multitarea
en la plataforma: la compatibilidad con ventanas múltiples. </p>
<p>Los usuarios ahora pueden abrir dos aplicaciones al mismo tiempo en la pantalla. </p>
<ul>
<li>En teléfonos y tabletas
con Android N, los usuarios pueden ejecutar dos aplicaciones en paralelo
una encima otra en el modo de pantalla dividida. También tienen la posibilidad de modificar el tamaño de las aplicaciones arrastrando
la línea divisoria que se encuentra entre ellas. </li>
<li>En los dispositivos con Android TV, las aplicaciones pueden habilitar en forma automática el <a href="{@docRoot}preview/features/picture-in-picture.html">modo "picture-in
-picture"</a>. Esto les permite continuar mostrando contenido mientras el usuario explora otras
aplicaciones o interactúa con ellas. Consulta las secciones siguientes para obtener más información. </li>
</ul>
<div class="col-4of10">
<img src="{@docRoot}preview/images/mw-portrait.png" alt="" style="height:460px;padding-left:1em;" id="img-split-screen" />
<p class="img-caption">
<strong>Figura 1:</strong> Aplicaciones en ejecución en el modo de pantalla dividida.
</p>
</div>
<p>En las tabletas, en particular, y en otros dispositivos de pantallas más grandes, la compatibilidad con ventanas múltiples
ofrece nuevas maneras de captar a los usuarios. Puedes, incluso, habilitar acciones de arrastrar y soltar en
tu aplicación para que los usuarios arrastren contenido hacia tu aplicación o desde ella; es una excelente
manera de mejorar su experiencia. </p>
<p>Es sencillo agregar compatibilidad con ventanas múltiples a tu aplicación y configurar la manera en que
administra la visualización de estas ventanas. Por ejemplo, puedes especificar las dimensiones mínimas
permitidas de tu actividad, y evitar así que los usuarios den a la actividad un tamaño inferior
al que establecen estas. También puedes deshabilitar la visualización de ventanas múltiples para tu aplicación, lo cual
garantiza que en el sistema solo se muestre tu aplicación en el modo de pantalla completa.</p>
<p>
Para obtener más información, consulta la documentación sobre <a href="{@docRoot}preview/features/multi-window.html">Compatibilidad con ventanas múltiples</a>
para desarrolladores.
</p>
<h2 id="notification_enhancements">Mejoras en las notificaciones</h2>
<p>En Android N, hemos rediseñado las notificaciones para facilitar y agilizar su
uso. Entre los cambios se incluyen los siguientes:</p>
<ul>
<li>
<strong>Actualizaciones en las plantillas</strong>: actualizaremos las plantillas de notificaciones para
poner nuevo énfasis en la imagen de héroe y el avatar. Los desarrolladores podrán
aprovechar las nuevas plantillas con una cantidad mínima de ajustes en su código.
</li>
<li>
<strong>Notificaciones agrupadas</strong>: el sistema puede agrupar mensajes
(por ejemplo, por tema) y mostrar el grupo. Un usuario puede
aplicar acciones, como “Dismiss” o “Archive”, en ellos. Si
has implementado notificaciones para Android Wear, ya estarás familiarizado con
este modelo.
</li>
<li>
<strong>Respuesta directa</strong>: en el caso de las aplicaciones de comunicación en tiempo real, el
sistema de Android admite respuestas en línea para que los usuarios puedan responder en forma rápida a
un mensaje SMS o de texto directamente dentro en la interfaz de notificaciones.
</li>
<li>
<strong>Vistas personalizadas</strong>: dos API nuevas te permiten aprovechar las decoraciones
del sistema, como los encabezados y las acciones de notificaciones, al usar vistas
personalizadas en las notificaciones.
</li>
</ul>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-1.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-3.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-2.png" alt="" style="padding:.5em;max-width:226px">
</div>
<p class="img-caption">
<strong>Figura 2:</strong> Notificaciones agrupadas y respuesta directa.
</p>
<p>Para obtener información acerca de cómo implementar las nuevas funciones, consulta la guía
<a href="{@docRoot}preview/features/notification-updates.html">Notificaciones</a>.</p>
<h2 id="jit_aot">Compilación de JIT y AOT guiada por perfiles</h2>
<p>En Android N, agregamos un compilador “Just in Time” (JIT) con generación de perfiles de código para
ART, lo cual le permite mejorar constantemente el rendimiento de las aplicaciones de Android mientras se
ejecutan. El compilador JIT complementa al compilador “Ahead of Time” (AOT) actual de ART
y permite mejorar el rendimiento del tiempo de ejecución, ahorrar espacio de almacenamiento y acelerar las actualizaciones
de aplicaciones y del sistema.</p>
<p>La compilación guiada por perfiles permite que ART maneje la compilación de AOT y JIT de cada aplicación
conforme a su uso real, además de las condiciones en el dispositivo. Por
ejemplo, conserva un perfil de los métodos directos de cada aplicación, y puede compilar previamente
y almacenar en el caché dichos métodos para obtener el mejor rendimiento. A su vez, deja otras partes de la aplicación
sin compilar hasta que se aplican verdaderamente.</p>
<p>Además de mejorar el rendimiento de partes claves de la aplicación, la compilación guiada por
perfiles permite reducir la superficie de memora RAM total de una aplicación, incluidos los archivos binarios
asociados. Esta función tiene particular importancia en los dispositivos de memoria reducida.</p>
<p>ART administra la compilación guiada por perfiles de una manera que minimiza el impacto sobre la batería
del dispositivo. Realiza compilaciones previas únicamente cuando el dispositivo se encuentra inactivo y
en proceso de carga, con lo cual permite ahorrar tiempo y batería al hacer el trabajo en forma anticipada.</p>
<h2 id="quick_path_to_app_install">Acceso rápido a la instalación de aplicaciones</h2>
<p>Uno de los beneficios más palpables del compilador JIT de ART es la velocidad de instalación de las
aplicaciones y de actualización del sistema. Incluso las aplicaciones de mayor tamaño, en cuyos casos se necesitaban varios minutos para la
optimización y la instalación en Android 6.0, ahora pueden instalarse en cuestión de
segundos. Las actualizaciones del sistema también son más rápidas debido a que ya no hay paso de optimización. </p>
<h2 id="doze_on_the_go">Doze en movimiento...</h2>
<p>En Android 6.0 se presentó Doze, un modo de sistema que ahorra batería al aplazar
actividades de CPU y red de las aplicaciones cuando el dispositivo se encuentra inactivo; por ejemplo, al hallarse
sobre una mesa o en un cajón. </p>
<p>Ahora, en Android N, el modo Doze ofrece el beneficio adicional de ahorrar batería en movimiento.
Siempre que la pantalla permanezca apagada durante un tiempo y el dispositivo esté desenchufado,
Doze aplicará un subconjunto de las restricciones de CPU y red conocidas a las aplicaciones.
Esto significa que los usuarios pueden ahorrar batería aun cuando lleven sus dispositivos
en los bolsillos.</p>
<img src="/preview/images/doze-diagram-1.png" alt="" id="figure1" />
<p class="img-caption">
<strong>Figura 3:</strong> Doze ahora aplica
restricciones para prolongar la duración de la batería aun cuando el dispositivo no está quieto.
</p>
<p>Poco tiempo después de que la pantalla se apaga, cuando el dispositivo no está enchufado, Doze
restringe el acceso a la red y aplaza tareas y sincronizaciones. Durante períodos de mantenimiento
breves, las aplicaciones tienen acceso a la red y se ejecutan todas sus
tareas y sincronizaciones aplazadas. Al encenderse la pantalla o enchufarse el dispositivo se desactiva el modo
Doze del dispositivo.</p>
<p>Cuando el dispositivo vuelve a estar quieto, desenchufado y con la pantalla apagada durante un
tiempo, Doze aplica todas las restricciones de CPU y redes en {@link
android.os.PowerManager.WakeLock}, alarmas de {@link android.app.AlarmManager} y análisis de
GPS o Wi-Fi.</p>
<p>Las prácticas recomendadas para adaptar tu aplicación a Doze no varían si el
dispositivo estará en movimiento o no. Por lo tanto, si ya actualizaste tu aplicación para que administre
Doze en forma equilibrada, estarás listo. Si no lo hiciste, comienza a <a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">adaptarla
a Doze</a> ahora.</p>
<h2 id="background_optimizations">Project Svelte: Optimizaciones en segundo plano</h2>
<p>Project Svelte representa un esfuerzo constante por minimizar el uso de memoria RAM a través del sistema y de las aplicaciones
en los diferentes dispositivos Android del ecosistema. En Android N, el objetivo principal de Project
Svelte es optimizar la manera en que las aplicaciones se ejecutan en segundo plano. </p>
<p>El procesamiento en segundo plano es una parte esencial de la mayoría de las aplicaciones. Cuando se maneja en forma adecuada, puede
hacer que la experiencia de tu usuario sea increíble (inmediata, rápida y pertinente al contexto).
Cuando no se maneja de tal manera, el procesamiento en segundo plano puede suponer un consumo innecesario de memoria RAM (y
batería), y afectar el rendimiento del sistema para otras aplicaciones. </p>
<p>A partir de Android 5.0, {@link android.app.job.JobScheduler} ha sido el
método preferido para ejecutar tareas en segundo plano con resultados positivos
para los usuarios. Las aplicaciones pueden programar tareas y, al mismo tiempo, permitir que el sistema se optimice según las condiciones de
memoria, energía y conectividad. JobScheduler ofrece control y
simpleza, y nuestro deseo es que todas las aplicaciones lo usen. </p>
<p>
Otra buena opción es <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
<code>GCMNetworkManager</code></a>, que forma parte de Google Play Services y
ofrece una capacidad similar de programación de tareas con compatibilidad en versiones heredadas de
Android.
</p>
<p>Continuaremos ampliando <code>JobScheduler</code> y
<code>GCMNetworkManager</code> para que se apliquen a más
casos de uso de tus aplicaciones; por ejemplo, en Android N ahora puedes programar procesos
en segundo plano según los cambios de los proveedores de contenido. Al mismo tiempo, comenzaremos a
dejar de usar algunos de los patrones anteriores que pueden reducir el rendimiento del sistema,
en especial en dispositivos de memoria reducida.</p>
<p>En Android N, eliminaremos tres difusiones implícitas que se usan normalmente (
{@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}, {@link
android.hardware.Camera#ACTION_NEW_PICTURE} y {@link
android.hardware.Camera#ACTION_NEW_VIDEO}), ya que pueden activar los
procesos en segundo plano de varias aplicaciones al mismo tiempo, y así exigir la memoria y la batería. Si
tu aplicación recibe estas difusiones, aprovecha la N Developer Preview y
realiza la migración a <code>JobScheduler</code> y hacia las API relacionadas, como alternativa. </p>
<p>
Para obtener información detallada, consulta la documentación de <a href="{@docRoot}preview/features/background-optimization.html">Optimizaciones
en segundo plano</a>.
</p>
<h2 id="data_saver">Ahorro de datos</h2>
<div class="col-5of12" style="margin-right:1.5em;">
<img src="{@docRoot}preview/images/datasaver.png" style="border:2px solid #ddd">
<p class="img-caption" style="padding-right:2em;">
<strong>Figura 4:</strong> Ahorro de datos en la configuración.
</p>
</div>
<p>Durante la vida útil de un dispositivo móvil, el costo de un plan de datos móviles normalmente
superará el costo del propio dispositivo. Para muchos usuarios, los datos móviles son un
recurso costoso que desean conservar. </p>
<p>En Android N se presenta el modo de ahorro de datos, un nuevo servicio del sistema que permite reducir
el uso de datos móviles de las aplicaciones, ya sea con servicio de itinerancia, cerca del final del ciclo de facturación
o con un paquete de datos prepagos. El ahorro de datos permite que los usuarios controlen la manera en que las aplicaciones
usan los datos móviles y que los desarrolladores brinden un servicio más eficaz cuando el ahorro
de datos se encuentra activo. </p>
<p>Cuando un usuario habilita el ahorro de datos en <strong>Settings</strong> y el dispositivo está
conectado a una red de uso medido, el sistema bloquea el uso de datos en segundo plano y ordena a las aplicaciones
usar menos datos en primer plano siempre que sea posible (por ejemplo, limitando
la tasa de bits para la transmisión, reduciendo la calidad de la imagen y aplazando el valor optimista de almacenamiento previo en caché,
entre otras posibilidades). Los usuarios pueden permitir que aplicaciones específicas habiliten el uso de datos medidos en segundo plano
aun cuando esté activo el ahorro de datos.</p>
<p>Android N extiende {@link android.net.ConnectivityManager} para que las aplicaciones
tengan una manera de <a href="{@docRoot}preview/features/data-saver.html#status">recuperar las
preferencias de ahorro de datos del usuario</a> y los <a href="{@docRoot}preview/features/data-saver.html#monitor-changes">monitor
cambios en estas</a>. Todas las aplicaciones deben verificar si el usuario habilitó el ahorro de
datos e intentar limitar el uso de datos en primer y segundo plano.</p>
<h2 id="tile_api">API para Mosaico de Configuración rápida</h2>
<div style="float:right;max-width:320px">
<img src="{@docRoot}preview/images/quicksettings.png" style="padding-left:1.5em;">
<p class="img-caption" style="padding-left:2em;">
<strong>Figura 5:</strong> Mosaicos de Quick Settings del panel de notificaciones.
</p>
</div><p>Quick Settings es una manera popular y simple de exhibir configuraciones y acciones claves
directamente desde el panel de notificaciones. En Android N, expandimos el alcance de
Quick Settings para que sea más útil y práctico. </p>
<p>Agregamos más espacio para mosaicos adicionales de Quick Settings, a los cuales los usuarios pueden
acceder desde un área de visualización paginada deslizando el dedo hacia la izquierda o la derecha. También permitimos
que los usuarios determinen los mosaicos de Quick Settings que aparecerán y los puntos en los cuales
se mostrarán; pueden agregar o mover mosaicos con solo arrastrarlos y soltarlos. </p>
<p>Para los desarrolladores, en Android N también se agrega una nueva API que les permite definir mosaicos de
Quick Settings propios para facilitar, dentro de sus aplicaciones, el acceso a controles y acciones claves por parte de los usuarios.</p>
<p>
Los mosaicos de Quick Settings se reservan para controles o acciones que se necesiten
con urgencia o se usen con frecuencia; no deben emplearse como accesos directos para
iniciar una aplicación.
</p>
<p>
Una vez que hayas definido tus mosaicos, puedes dejarlos a disposición de los usuarios, quienes tendrán la posibilidad de agregarlos
a Quick Settings con solo arrastrarlos y soltarlos.
</p>
<p>
Para obtener información sobre la creación de un mosaico de aplicación, consulta
<code>android.service.quicksettings.Tile</code> en la <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia de la API</a> descargable.
</p>
<h2 id="number-blocking">Bloqueo de números</h2>
<p>Android N ahora admite el bloqueo de números en la plataforma y proporciona una API
de framework para que los proveedores de servicios dispongan de una lista con números bloqueados. La
aplicación de SMS predeterminada, la aplicación telefónica predeterminada y las aplicaciones de proveedores tienen capacidad de lectura y
escritura en la lista de números bloqueados. Otras aplicaciones no pueden acceder a la lista.</p>
<p>Al hacer que el bloqueo de números sea una función estándar de la plataforma, Android permite que las
aplicaciones admitan de manera uniforme el bloqueo de números en una amplia variedad de
dispositivos. Entre los demás beneficios que pueden aprovecharse en las aplicaciones, se encuentran los siguientes:</p>
<ul>
<li> Los números bloqueados en las llamadas también se bloquean en los mensajes de texto.
<li> Los números bloqueados pueden perdurar tras procesos de restablecimiento y cambios de dispositivos con la función Backup &amp;
Restore.
<li> Varias aplicaciones pueden usar la misma lista de números bloqueados.
</ul>
<p>De manera adicional, la integración de aplicaciones de proveedores a través de Android permite que estos
lean la lista de números bloqueados del dispositivo y realicen un bloqueo de servicio
para el usuario, a fin de evitar que el usuario reciba llamadas o mensajes de texto no deseados
por cualquier medio, como terminales VOIP o teléfonos con transferencia de llamadas.</p>
<p>
Para obtener más información, consulta <code>android.provider.BlockedNumberContract</code>
en la <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia de la API
</a>descargable.
</p>
<h2 id="call_screening">Filtración de llamadas</h2>
<p>
Android N permite que la aplicación predeterminada de un teléfono filtre las llamadas entrantes. La aplicación
hace esto a través del nuevo <code>CallScreeningService</code>,
que le permite realizar varias acciones según la clase
{@link android.telecom.Call.Details Call.Details} de la llamada entrante. Algunos ejemplos:
</p>
<ul>
<li> rechazar la llamada entrante;
<li> no permitir el ingreso de la llamada en el registro de llamadas;
<li> no mostrar al usuario una notificación de la llamada.
</ul>
<p>
Para obtener más información, consulta <code>android.telecom.CallScreeningService</code>
en la <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia de la API
</a>descargable.
</p>
<h2 id="multi-locale_languages">Compatibilidad con varias configuraciones regionales y más idiomas</h2>
<p>Android N permite a los usuarios seleccionar <strong>varias configuraciones regionales</strong> en Settings,
para brindar una mejor compatibilidad con casos de uso de dos idiomas. Las aplicaciones pueden usar
una nueva API para obtener las configuraciones regionales seleccionadas del usuario y luego ofrecer experiencias
más sofisticadas para usuarios que usen varias configuraciones regionales; por ejemplo, pueden mostrar resultados de búsqueda en
varios idiomas y no ofrecer traducciones de páginas web con idiomas que el
usuario conozca.</p>
<p>Además de la compatibilidad con varias configuraciones regionales, en Android N también se amplía la variedad de idiomas
disponibles para los usuarios. Se ofrecen 25 variantes, cada una de ellas para idiomas de uso
común, como el inglés, el español, el francés y el árabe. También se agrega compatibilidad
parcial con más de 100 idiomas nuevos.</p>
<p>Las aplicaciones pueden obtener la lista de configuraciones regionales establecida por el usuario llamando a <code>LocaleList.GetDefault()</code>. A fin de admitir la cantidad ampliada de configuraciones regionales, en Android N se modificará la forma de
resolver recursos. Asegúrate de controlar que tus aplicaciones
funcionen de la manera esperada con la nueva lógica de resolución de recursos.</p>
<p>Para obtener información sobre el nuevo comportamiento de resolución de recursos y las prácticas recomendadas que
debes aplicar, consulta <a href="{@docRoot}preview/features/multilingual-support.html">Compatibilidad con varios idiomas</a>.</p>
<h2 id="icu4">API de ICU4J en Android</h2>
<p>
Android N ahora ofrece un subconjunto de API de <a href="http://site.icu-project.org/">ICU4J</a> dentro del framework de Android, en el paquete
<code>android.icu</code>. La migración es sencilla y en mayor medida implica
simplemente un cambio del espacio de nombres <code>com.java.icu</code> a
<code>android.icu</code>. Si ya usas el paquete ICU4J en tus
aplicaciones, el cambio a las API de <code>android.icu</code> en el framework de Android
puede reducir notablemente el tamaño del APK.
</p>
<p>
Para obtener más información sobre las API de ICU4J de Android, consulta <a href="{@docRoot}preview/features/icu4j-framework.html">Compatibilidad con ICU4J</a>.
</p>
<h2 id="gles_32">API&trade; de OpenGL ES 3.2</h2>
<p>En Android N se agregan interfaces de framework y compatibilidad con plataformas para OpenGL ES 3.2, entre las que se incluye lo siguiente:</p>
<ul>
<li> todas las extensiones del <a class="external-link" href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">paquete de extensiones de Android</a></a> (AEP), a excepción de <code>EXT_texture_sRGB_decode</code>;
<li> búferes de fotogramas de punto flotante para HDR y sombreado aplazado;
<li> llamadas a draw a través de BaseVertex para mejorar el procesamiento por lotes y la transmisión;
<li> sólido control de acceso a búfer para reducir la sobrecarga de WebGL.
</ul>
<p>En Android N, la API de framework para OpenGL ES 3.2 se proporciona con la clase
<code>GLES32</code>. Al usar OpenGL ES 3.2, asegúrate de declarar el
requisito en tu archivo de manifiesto, con la etiqueta <code>&lt;uses-feature&gt;</code> y el
atributo <code>android:glEsVersion</code>. </p>
<p>Para obtener información sobre el uso de OpenGL ES, incluida la manera de comprobar la
versión de OpenGL ES que admite el dispositivo durante el tiempo de ejecución, consulta la<a href="{@docRoot}guide/topics/graphics/opengl.html">guía de la API OpenGL ES</a>.</p>
<h2 id="android_tv_recording">Grabación de Android TV</h2>
<p>En Android N se agrega la capacidad de grabar y reproducir contenido de servicios
de entrada de Android TV a través de las nuevas API de grabación. Aprovechando las mejoras existentes de las API time shifting
, los servicios de entrada de TV pueden controlar los datos de canales que pueden grabarse y la manera
en que se guardan las sesiones grabadas, y administrar la interacción del usuario con el contenido grabado. </p>
<p>Para obtener más información, consulta <a href="{@docRoot}preview/features/tv-recording-api.html">API de grabación de Android TV</a>.</p>
<h2 id="android_for_work">Android for Work</h2>
<p>Android for Work suma muchas funciones y API nuevas para dispositivos con Android N.
A continuación, se muestran algunos aspectos destacados. Para hallar una lista completa de actualizaciones de Android for Work
relacionadas con Android N, consulta la sección de cambios en Android for Work.</p>
<h3 id="work_profile_security_challenge">Comprobación de seguridad para perfiles de trabajo </h3>
<p>
Quienes posean perfiles pueden especificar una comprobación de seguridad separada para aplicaciones que se ejecuten en el
perfil de trabajo. La comprobación para perfiles de trabajo se muestra cuando un usuario intenta abrir
aplicaciones de trabajo. Cuando la comprobación de seguridad es exitosa, se desbloquea el
perfil de trabajo y se descifra si es necesario. Para quienes posean perfiles,
<code>ACTION_SET_NEW_PASSWORD</code> solicita al usuario establecer una comprobación de
trabajo y <code>ACTION_SET_NEW_PARENT_PROFILE_PASSWORD</code> le solicita
establecer un bloqueo de dispositivo.
</p>
<p>
Quienes posean perfiles pueden establecer políticas de contraseñas diferentes
(por ejemplo, la extensión que debe tener el PIN o la posibilidad de usar una huella digital
para desbloquear el perfil) usando <code>setPasswordQuality()</code>,
<code>setPasswordMinimumLength()</code> y métodos relacionados. También
pueden establecer el bloqueo del dispositivo usando la instancia de <code>DevicePolicyManager</code>
devuelta por el nuevo método <code>getParentProfileInstance()</code>.
Además, tiene la posibilidad de personalizar la pantalla de credenciales de la
comprobación de trabajo usando los nuevos métodos <code>setOrganizationColor()</code> y
<code>setOrganizationName()</code>.
</p>
<h3 id="turn_off_work">Desactivación del modo de trabajo </h3>
<p>En dispositivos con perfil de trabajo, los usuarios pueden alternar el modo de trabajo. Cuando este último está
inactivo, el usuario administrado queda deshabilitado temporalmente, con lo cual se desactivan las aplicaciones de perfiles
de trabajo, la sincronización en segundo plano y las notificaciones. Esto incluye la aplicación del propietario del
perfil. Cuando el modo de trabajo está inactivo, en el sistema se muestra un icono de estado persistente
para recordar al usuario que no puede iniciar aplicaciones de trabajo. El lanzador
indica que no es posible acceder a aplicaciones ni widgets de trabajo. </p>
<h3 id="always_on_vpn">Always on VPN </h3>
<p>Los propietarios de dispositivos y perfiles pueden asegurarse de que las aplicaciones de trabajo siempre se conecten
a través de una VPN especificada. El sistema inicia dicha VPN en forma automática después del
inicio del dispositivo.</p>
<p>
Los nuevos métodos de <code>DevicePolicyManager</code> son
<code>setAlwaysOnVpnPackage()</code> y
<code>getAlwaysOnVpnPackage()</code>.
</p>
<p>Debido a que los servicios de VPN pueden enlazarse directamente a través del sistema sin interacción con
aplicaciones, los clientes de VPN deben administrar nuevos puntos de entrada para Always on VPN. Al igual que
antes, los servicios se indican al sistema con una clase <code>android.net.VpnService</code> de acción de coincidencia de filtro
de intenciones. </p>
<p>
Los usuarios también pueden establecer clientes Always on VPN que implementen métodos
<code>VPNService</code> en el usuario principal con
<strong>Settings&gt;More&gt;Vpn</strong>.
</p>
<h2 id="accessibility_enhancements">Mejoras de accesibilidad</h2>
<p>Android N ahora ofrece Vision Settings directamente en la pantalla de Bienvenida para la configuración de
dispositivos nuevos. Esto permite a los usuarios descubrir y configurar de manera mucho más sencilla
funciones de accesibilidad en sus dispositivos, como el gesto de ampliación, el tamaño
de fuente, el tamaño de pantalla y TalkBack. </p>
<p>Al tener estas funciones de accesibilidad una disposición más prominente, es más probable
que tus usuarios prueben tu aplicación con ellas habilitadas. Asegúrate de probar tus aplicaciones
en forma anticipada con esta configuración habilitada. Puedes activarla en Settings &gt;
Accessibility.</p>
<p>Otra posibilidad en Android N: los servicios de accesibilidad ahora pueden asistir a los usuarios con discapacidades
motoras para el uso de la pantalla. La nueva API permite crear servicios con
funciones como el seguimiento de rostros u ojos y la exploración por puntos, entre otros, para satisfacer
las necesidades de estos usuarios.</p>
<p>Para obtener más información, consulta <code>android.accessibilityservice.GestureDescription</code>
en la <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia de la API </a>descargable.</p>
<h2 id="direct_boot">Inicio directo</h2>
<p>El inicio directo optimiza los tiempos de inicio del dispositivo y permite una funcionalidad
limitada de las aplicaciones aun después de un reinicio inesperado.
Por ejemplo, si un dispositivo cifrado se reinicia mientras el usuario duerme,
este último puede continuar recibiendo en forma normal notificaciones de alarmas, llamadas entrantes y mensajes
registrados. Esto también significa que los servicios de accesibilidad también pueden estar
disponibles de inmediato después de un reinicio.</p>
<p>El inicio directo aprovecha el cifrado basado en archivos de Android N,
a fin de habilitar políticas de cifrado específicas para datos del sistema y de aplicaciones.
El sistema usa un depósito cifrado por el dispositivo para datos de sistema seleccionados y datos de aplicaciones
explícitamente registrados. En forma predeterminada, se usa un depósito cifrado con credenciales para los
datos de sistema, los datos de usuario, las aplicaciones y los datos de aplicaciones restantes. </p>
<p>Durante el inicio, el sistema se carga en un modo restringido con acceso únicamente
a datos cifrados por el dispositivo y sin acceso general a aplicaciones o datos.
Si hay componentes que deseas ejecutar en este modo, puedes registrarlos
configurando un marcador en el manifiesto. Después del reinicio, el sistema activa
componentes registrados transmitiendo la intención
<code>LOCKED_BOOT_COMPLETED</code>. El sistema garantiza que estén disponibles los datos de aplicaciones cifrados por el dispositivo
antes de la desactivación del bloqueo. No es posible acceder a los demás datos hasta que el usuario confirme sus credenciales de pantalla de
bloqueo para descifrarlos. </p>
Para obtener más información, consulta <a href="{@docRoot}preview/features/direct-boot.html">Inicio directo</a>.</p>
</p>
<h2 id="key_attestation">Atestación de claves</h2>
<p>Los depósitos de claves guardados en hardware proporcionan un método mucho más seguro para crear, almacenar
y usar claves criptográficas en dispositivos Android. Protegen las claves contra funciones del kernel de
Linux, vulnerabilidades potenciales de Android y extracciones
de dispositivos con derechos de administrador.</p>
<p>Para hacer más sencillo y seguro el uso de depósitos de claves guardados en hardware,
en Android N se presenta la atestación de claves. En las aplicaciones y en los servicios que no dependen de los dispositivos se puede usar la atestación
de claves para determinar fehacientemente el almacenamiento de un par de claves RSA o EC se
en hardware, las propiedades de dicho par y las
limitaciones aplicadas a su uso y validez. </p>
<p>Los servicios que no dependen de los dispositivos y las aplicaciones pueden solicitar información acerca de un par de claves
a través de un certificado de atestación X.509 que debe firmarse con una clave de atestación
válida. La claves de atestación es una clave de firma ECDSA que se
inyecta en el depósito de claves guardado en hardware en la fábrica.
Por lo tanto, un certificado de atestación firmado con una clave de atestación
válida confirma la existencia de un depósito de claves guardado en hardware y de información detallada
sobre los pares de claves en dicho depósito de claves.</p>
<p>Para asegurarse de que el dispositivo use una imagen segura y oficial de fábrica de
Android, la atestación de claves solicita que el <a class="external-link" href="https://source.android.com/security/verifiedboot/verified-boot.html#bootloader_requirements">bootloader</a>
del dispositivo proporcione la siguiente información al <a class="external-link" href="https://source.android.com/security/trusty/index.html">entorno de ejecución
seguro (TEE)</a>:</p>
<ul>
<li>la versión del SO y el nivel de revisión instalados en el dispositivo;</li>
<li>la clave pública de <a href="https://source.android.com/security/verifiedboot/index.html" class="external-link">Verified Boot</a> y el estado de bloqueo.</li>
</ul>
<p>Para obtener más información sobre la función de depósitos de claves guardados en hardware,
consulta la guía de<a href="https://source.android.com/security/keystore/" class="external-link">Depósito de clave guardado en hardware</a>.</p>
<p>Además de la atestación de claves, en Android N también se presentan
claves enlazadas a huellas digitales no revocadas en la inscripción con estas huellas.</p>
<h2 id="network_security_config">Configuración de seguridad de la red</h2>
<p>En Android N, las aplicaciones pueden personalizar el comportamiento de sus conexiones protegidas (HTTPS y TLS)
en forma segura, sin modificaciones en el código, a través de la
<em>Configuración de seguridad de la red</em> en lugar de las API
convencionales, propensas a generar errores (p. ej., X509TrustManager).</p>
<p>Funciones admitidas:</p>
<ul>
<li><b>Anclajes de veracidad personalizados:</b> permite personalizar a través a una aplicación las
entidades de certificación (CA) de confianza para las conexiones protegidas; por
ejemplo, certificados con firmas automáticas en particular o un conjunto de CA públicas.
</li>
<li><b>Anulaciones exclusivas de depuración:</b> permite que un desarrollador depure en forma segura
conexiones protegidas de sus aplicaciones sin riesgos adicionales para la base
instalada.
</li>
<li><b>Desactivación de tráfico de Cleartext:</b> permite que una aplicación se proteja a sí misma contra
el uso accidental de tráfico de Cleartext.</li>
<li><b>Fijación de certificados:</b> función avanzada que permite a una aplicación
limitar las claves de servidores en las que se pueda confiar para conexiones protegidas.</li>
</ul>
<p>Para obtener más información, consulta <a href="{@docRoot}preview/features/security-config.html">Configuración de seguridad de
la red</a>.</p>
<h2 id="default_trusted_ca">Entidad de certificación de confianza predeterminada</h2>
<p>De manera predeterminada, en las aplicaciones orientadas a Android N solo se consideran como confiables los certificados proporcionados por el sistema
y ya no se da esta misma consideración a las entidades de certificación (CA) añadidas por usuarios. En aquellas aplicaciones orientadas a Android
N para las cuales se desee considerar tales CA como válidas, se debe usar la
<a href="{@docRoot}preview/features/security-config.html">Configuración de seguridad de la red</a> a fin de
especificar los términos de confianza de dichas CA.</p>
<h2 id="apk_signature_v2">Esquema de firma de APK v2</h2>
<p>La clase PackageManager ahora admite la verificación de aplicaciones con el esquema
de firma de APK v2. Se trata de un esquema de firma de archivos completos
que agiliza considerablemente la verificación y refuerza las garantías de
integridad al detectar todos los cambios no autorizados en archivos APK.</p>
<p>Para conservar la compatibilidad con versiones anteriores, se debe firmar un APK con el esquema de firma
v1 (esquema de firma JAR) antes de la firma con el esquema de firma v2.
Si se usa este último, la verificación experimenta errores cuando se firma el APK con un
certificado adicional después de la firma con el esquema v2. </p>
<p>Se ofrecerá disponibilidad con el esquema de firma de APK v2 más adelante en la N Developer
Preview.</p>
<h2 id="scoped_directory_access">Acceso a directorios determinados</h2>
<p>En Android N, las aplicaciones pueden usar nuevas API para solicitar acceso a directorios de<a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">almacenamiento
externo</a> específicos, incluidos los directorios de medios extraíbles, como las tarjetas
SD. Las nuevas API simplifican enormemente la manera en que tu aplicación accede a directorios
de almacenamiento externo estándares, como <code>Pictures</code>. Las aplicaciones
de fotografía pueden usar estas API en lugar de
<code>READ_EXTERNAL_STORAGE</code>, que otorga acceso a todos los directorios
de almacenamiento, o del framework de acceso a almacenamiento, con el cual el usuario debe navegar hasta
el directorio.</p>
<p>A su vez, las nuevas API simplifican los pasos que un usuario debe seguir para otorgar a tu aplicación acceso a almacenamiento
externo. Cuando se usan las nuevas API, el sistema emplea una IU de
permisos simple en la que se detallan claramente los directorios a los cuales
la aplicación solicita acceso.</p>
<p>Para obtener más información, consulta la documentación sobre
<a href="{@docRoot}preview/features/scoped-folder-access.html">Acceso
a directorios determinados</a> para desarrolladores.</p>

View File

@@ -0,0 +1,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>

View File

@@ -0,0 +1,541 @@
page.title=Pruebe en un dispositivo
meta.tags=“Versión preliminar”, “Nexus”,“imagen de sistema”
page.tags="preview", "androidn"
page.image=images/cards/card-n-downloads_2x.png
@jd:body
<div style="position:relative; min-height:600px">
<div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
<p class="sdk-terms-intro">Antes de descargar e instalar los componentes del
Android Preview SDK, debe aceptar los términos y las
condiciones que se describen a continuación.</p>
<h2 class="norule">Términos y condiciones</h2>
<div class="sdk-terms" onfocus="this.blur()" style="width:678px">
Este es el Contrato de licencia de la versión preliminar del SDK de Android (el “Contrato de licencia”).
1. Introducción
1.1 Se le otorga la licencia de la versión preliminar del SDK de Android (denominada “Versión preliminar” en el Contrato de licencia e incluye específicamente los archivos de sistema de Android, las API agrupadas y los archivos de biblioteca de la Versión preliminar, si se encuentran disponibles), sujeto a los términos del Contrato de licencia. El contrato de licencia establece una relación legal vinculante entre usted y Google, con respecto a la utilización que usted haga de la Preview.
1.2 "Android" hace referencia al conjunto de software Android para dispositivos, tal como se encuentra disponible en el proyecto de código abierto de Android, ubicado en la siguiente dirección URL: http://source.android.com/, y sus actualizaciones frecuentes.
1.3 “Compatible con Android” se refiere a cualquier implementación de Android que (i) cumpla con el documento Definición de compatibilidad de Android, que está disponible en el sitio web de compatibilidad de Android (http://source.android.com/compatibility) y que puede actualizarse esporádicamente; y (ii) apruebe satisfactoriamente la prueba de Compatibilidad con Android, “CTS” (en inglés, Android Compatibility Test Suite).
1.4 "Google" significa Google Inc., una empresa de Delaware con su sede principal en 1600 Amphitheatre Parkway, Mountain View, CA 94043, Estados Unidos.
2. Aceptación del Contrato de licencia
2.1 Para poder utilizar la Versión preliminar, primero debe aceptar el Contrato de licencia. Si no acepta el Contrato de licencia, no podrá utilizar la Versión preliminar.
2.2 Al hacer clic para aceptar o utilizar la Versión preliminar, por medio del presente, usted acepta los términos del Contrato de licencia.
2.3 Usted no puede utilizar la Versión preliminar ni aceptar el Contrato de licencia si tiene prohibido recibir la Versión preliminar en virtud de las leyes de los Estados Unidos o de otros países, lo que incluye el país donde es residente o desde el que utilizará la Versión preliminar.
2.4 Si usted utilizará la Versión preliminar de forma interna, dentro de su compañía u organización, usted acepta quedar sujeto al Contrato de licencia en representación de su empleador u otra entidad, y expresa y garantiza que tiene plena autoridad legal para vincular a su empleador o a dicha entidad al Contrato de licencia. Si no posee la autoridad exigida, no podrá aceptar el Contrato de licencia ni usar la Versión preliminar en representación de su empleador u otra entidad.
3. Licencia de la Preview de Google
3.1 Conforme a los términos de este contrato de licencia, Google le otorga una licencia limitada, con validez mundial, libre de regalías, no asignable, no exclusiva y que no puede otorgar una sublicencia para utilizar la Preview con el único propósito de desarrollar aplicaciones para ejecutar en implementaciones compatibles de Android.
3.2 No puede utilizar esta Preview para desarrollar aplicaciones para otras plataformas (incluyendo implementaciones incompatibles de Android) o para desarrollar otro SDK. Por supuesto, usted tiene la libertad para desarrollar aplicaciones para otras plataformas, incluyendo implementaciones incompatibles de Android, siempre y cuando esta Preview no sea utilizada con ese propósito.
3.3 Usted acepta que Google o terceros poseen todos los derechos legales, títulos e intereses en relación con la Preview, incluidos derechos de propiedad intelectual que existan en ésta. "Derechos de propiedad intelectual" hace referencia a todos los derechos de la ley de patentes, la ley de derechos de autor, la ley de secreto comercial, la ley de marca comercial y cualquier otro derecho de propiedad. Google se reserva todos los derechos que no se le otorguen expresamente.
3.4 No podrá utilizar la Versión preliminar para ningún otro propósito que no esté expresamente permitido en el Contrato de licencia. Excepto en la medida que lo exijan las licencias correspondientes de terceros, no podrá: (a) copiar (excepto con fines de copia de seguridad), modificar, adaptar, redistribuir, descompilar, utilizar técnicas de ingeniería inversa, desarmar ni crear trabajos derivados de la Preview ni de ninguna de sus partes; ni (b) cargar ninguna parte de la Preview en un teléfono móvil ni en ningún otro dispositivo de hardware (a excepción de una computadora personal), ni podrá combinar ninguna parte de la Preview con otro software, ni distribuir algún software o dispositivo que incorpore alguna parte de la Preview.
3.5 El uso, la reproducción y la distribución de los componentes de la Preview con licencia de software de código abierto están regidos exclusivamente por los términos de la licencia de ese software de código abierto y no de este Contrato de licencia. Usted acepta mantener la licencia en buenas condiciones con respecto a dichas licencias de software de código abierto en virtud de todos los derechos otorgados y acepta abstenerse de realizar alguna acción que pueda poner fin, suspender o violar dichos derechos.
3.6 Usted acepta que la forma y la naturaleza de la Versión preliminar que proporciona Google pueden cambiar sin brindarle aviso previo y que las versiones futuras de la Versión preliminar pueden ser incompatibles con las aplicaciones desarrolladas en versiones anteriores de la Versión preliminar. Usted acepta que Google puede (de forma permanente o temporal) dejar de proporcionarles la Versión preliminar (o cualquiera de las características incluidas en ella) a usted o a los usuarios, generalmente, a criterio exclusivo de Google, sin brindarle aviso previo.
3.7 Ninguna declaración de este Contrato de licencia le otorga el derecho de utilizar alguno de los nombres comerciales, las marcas comerciales, las marcas de servicio, los logotipos, los nombres de dominio ni otras características distintivas de marca de Google.
3.8 Usted acepta que no eliminará, ocultará ni alterará ninguno de los avisos de derechos de propiedad (lo que incluye los avisos de marca comercial y derechos de autor) que pudieran estar anexados o incluidos en la Versión preliminar.
4. Uso que usted realiza de la Versión preliminar 4.1 Google acepta que ninguna declaración del Contrato de licencia le concede a Google derecho, título o interés alguno de su parte (o de parte de sus licenciantes), en virtud del Contrato de licencia, con respecto a las aplicaciones de software que usted desarrolle mediante el uso de la Versión preliminar, lo que incluye los derechos de propiedad intelectual que conlleven esas aplicaciones. 4.2 Usted acepta utilizar la Versión preliminar y escribir aplicaciones únicamente conforme a lo que permite (a) este Contrato de licencia y (b) las leyes, regulaciones, o prácticas y pautas generalmente aceptadas pertinentes en las jurisdicciones relevantes (lo que incluye las leyes sobre la exportación de datos o software hacia los Estados Unidos u otros países relevantes y desde ellos). 4.3 Usted acepta que si utiliza la Versión preliminar para desarrollar aplicaciones, protegerá la privacidad y los derechos legales de los usuarios.
Si los usuarios le proporcionan sus nombres de usuario, contraseñas u otra información de inicio de sesión o información personal, debe comunicarles a los usuarios que la información se encontrará disponible para su aplicación, y debe proporcionarles a dichos usuarios un aviso de privacidad con protección y validez legal. Si su aplicación almacena información personal o confidencial proporcionada por los usuarios, lo debe hacer de forma segura. Si los usuarios le proporcionan información sobre la cuenta de Google, su aplicación solo puede usar esa información para acceder a la cuenta de Google del usuario siempre que este le haya otorgado permiso para hacerlo y con los fines para los que se lo haya otorgado.
4.4 Usted acepta que no participará en ninguna actividad con la Versión preliminar (lo que incluye el desarrollo o la distribución de una aplicación) que interfiera, interrumpa, dañe o acceda sin autorización a servidores, redes u otras propiedades o servicios de Google o de algún tercero.
4.5 Usted acepta que es el único responsable (y que Google no asume responsabilidades hacia usted ni terceros) de los datos, el contenido o los recursos que usted cree, transmita o muestre a través de Android o las aplicaciones para Android, y de las consecuencias de sus acciones (lo que incluye la pérdida o el daño que Google pudiera sufrir) al hacerlo.
4.6 Usted acepta que es el único responsable (y que Google no asume responsabilidades hacia usted ni terceros) de cualquier incumplimiento de sus obligaciones en virtud de este Contrato de licencia, los contratos aplicables de terceros o los términos del servicio, o cualquier ley o regulación pertinentes, y de las consecuencias (lo que incluye las pérdidas o los daños que pudieran sufrir Google o algún tercero) de dichos incumplimientos.
4.7 La Versión preliminar se encuentra en desarrollo, y sus pruebas y comentarios son una parte importante del proceso de desarrollo. Al utilizar la Versión preliminar, usted reconoce que la implementación de algunas características aún se encuentra en desarrollo y que no debe confiar en que la Versión preliminar contará con todas las funcionalidades de una versión estable. Usted acepta no distribuir públicamente ni enviar ninguna aplicación que utilice esta Versión preliminar, ya que esta Versión preliminar ya no se admitirá tras el lanzamiento del SDK oficial de Android.
5. Sus credenciales de desarrollador
5.1 Usted acepta que es responsable de mantener la confidencialidad de toda credencial de desarrollador que Google pudiera otorgarle o que usted pudiera escoger, y que será el único responsable de todas las aplicaciones que se desarrollen con sus credenciales de desarrollador.
6. Privacidad e información
6.1 A fin de poder innovar y mejorar de forma continua la Versión preliminar, Google podría recopilar ciertas estadísticas de uso del software, lo que incluye, entre otras características, un identificador único, la dirección IP asociada, el número de versión del software e información sobre las herramientas o los servicios de la Versión preliminar que se estén utilizando y la manera en que se estén utilizando. Antes de que se recopile esta información, la Versión preliminar se lo notificará y le solicitará su permiso. Si no otorga su permiso, no se recopilará la información.
6.2 Los datos recopilados se analizan en el agregado para mejorar la Versión preliminar y se conservan de acuerdo con la política de privacidad de Google que se encuentra en el sitio http://www.google.com/policies/privacy/.
7. Aplicaciones de terceros
7.1 Si utiliza la Versión preliminar para ejecutar aplicaciones desarrolladas por un tercero o que accedan a datos, contenido o recursos proporcionados por un tercero, usted acepta que Google no es responsable de esas aplicaciones, datos, contenido ni recursos. Usted comprende que todos los datos, contenidos o recursos a los que podría acceder a través de esas aplicaciones de terceros son exclusiva responsabilidad de la persona que los origina y que Google no es responsable de las pérdidas ni los daños que usted pudiera experimentar como consecuencia del uso o acceso de cualquiera de esas aplicaciones, datos, contenido o recursos de terceros.
7.2 Usted debe saber que los datos, el contenido y los recursos que se le presentan a través de esa aplicación de un tercero pueden estar protegidos por derechos de propiedad intelectual que les pertenecen a sus proveedores (o a otras personas o compañías en representación de estos). No puede modificar, alquilar, arrendar, prestar, vender, distribuir ni crear obras derivadas basadas en esos datos, contenidos o recursos (en su totalidad o en parte), a menos que los propietarios pertinentes le hayan otorgado permiso específicamente para hacerlo.
7.3 Usted acepta que el uso que haga de las aplicaciones, los datos, el contenido o los recursos de ese tercero puede estar sujeto a términos independientes entre usted y el tercero correspondiente.
8. Uso de las API de Google
8.1 API de Google
8.1.1 Si utiliza alguna API para recuperar datos de Google, usted acepta que los datos pueden estar protegidos por derechos de propiedad intelectual que le pertenecen a Google o a las partes que proporcionan esos datos (o a otras personas o empresas en representación de estos). El uso que realice de cualquiera de esas API puede estar sujeto a términos de servicio adicionales. No puede modificar, alquilar, arrendar, prestar, vender, distribuir ni crear obras derivadas basadas en esos datos (en su totalidad o en parte), a menos que los términos de servicio correspondientes lo permitan.
8.1.2 Si utiliza alguna API para recuperar datos de un usuario de Google, usted acepta y acuerda que solo podrá recuperar datos con el consentimiento explícito del usuario y solo con los fines limitados para los que el usuario le haya otorgado permiso para hacerlo.
9. Finalización del Contrato de licencia
9.1 Este Contrato de licencia tendrá vigencia hasta que lo revoquen usted o Google, como se indica a continuación.
9.2 Si desea rescindir el Contrato de licencia, puede hacerlo al interrumpir el uso que realiza de la Versión preliminar y de las credenciales de desarrollador pertinentes.
9.3 Google puede, en cualquier momento, rescindir el Contrato de licencia, con causa o sin ella, después de notificárselo a usted.
9.4 El Contrato de licencia finalizará automáticamente, sin previo aviso ni acción alguna, tras la primera de las siguientes situaciones:
(A) cuando Google deje de proporcionar la Versión preliminar o ciertas partes de esta a los usuarios en el país donde usted reside o desde el que utiliza el servicio; y
(B) cuando Google emita una versión final del SDK de Android.
9.5 Si el Contrato de licencia se rescinde, se revocará la licencia que usted recibió en virtud de dicho contrato; usted deberá suspender inmediatamente todo uso de la Versión preliminar y las disposiciones de los párrafos 10, 11, 12 y 14 seguirán vigentes indefinidamente.
10. EXENCIONES DE RESPONSABILIDAD
10.1 USTED COMPRENDE Y ACEPTA EXPRESAMENTE QUE EL USO QUE REALICE DE LA VERSIÓN PRELIMINAR ES BAJO SU PROPIO RIESGO Y QUE LA VERSIÓN PRELIMINAR SE PROPORCIONA “EN LAS CONDICIONES EN LAS QUE SE ENCUENTRA” Y “SUJETA A DISPONIBILIDAD” SIN GARANTÍAS DE NINGÚN TIPO POR PARTE DE GOOGLE.
10.2 EL USO QUE USTED REALICE DE LA VERSIÓN PRELIMINAR Y DE TODO MATERIAL DESCARGADO U OBTENIDO DE ALGUNA OTRA MANERA MEDIANTE EL USO DE LA VERSIÓN PRELIMINAR ES A SU ENTERO RIESGO Y DISCRECIÓN, Y USTED ES EL ÚNICO RESPONSABLE DE CUALQUIER DAÑO QUE PUDIERA SUFRIR SU SISTEMA INFORMÁTICO U OTRO DISPOSITIVO, O DE LA PÉRDIDA DE DATOS COMO CONSECUENCIA DE DICHO USO. SIN PERJUICIO DE LO MENCIONADO ANTERIORMENTE, USTED COMPRENDE QUE LA VERSIÓN PRELIMINAR NO ES UNA VERSIÓN ESTABLE, Y PUEDE CONTENER ERRORES, DEFECTOS Y VULNERABILIDADES DE SEGURIDAD QUE PUEDEN PROVOCAR DAÑOS SIGNIFICATIVOS, LO QUE INCLUYE LA PÉRDIDA COMPLETA E IRRECUPERABLE DEL USO DE SU SISTEMA INFORMÁTICO U OTRO DISPOSITIVO.
10.3 GOOGLE TAMBIÉN RECHAZA TODAS LAS GARANTÍAS Y CONDICIONES DE CUALQUIER TIPO, EXPRESAS O IMPLÍCITAS, INCLUIDAS, ENTRE OTRAS, LAS GARANTÍAS Y CONDICIONES DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN DETERMINADO Y NO VIOLACIÓN.
11. LIMITACIÓN DE RESPONSABILIDADES
11.1 USTED COMPRENDE Y ACEPTA EXPRESAMENTE QUE GOOGLE, SUS SUBSIDIARIAS Y FILIALES, Y SUS LICENCIANTES NO SERÁN RESPONSABLES ANTE USTED, EN VIRTUD DE NINGUNA TEORÍA DE RESPONSABILIDAD, POR NINGÚN DAÑO DIRECTO, INDIRECTO, INCIDENTAL, ESPECIAL, RESULTANTE NI PUNITIVO EN EL QUE PODRÍA HABER INCURRIDO, LO QUE INCLUYE LA PÉRDIDA DE DATOS, YA SEA QUE SE LE HAYA NOTIFICADO O NO A GOOGLE O A SUS REPRESENTANTES, O SOBRE CUYA POSIBILIDAD ESTOS DEBERÍAN HABER SABIDO.
12. Indemnización
12.1 Hasta el grado máximo que permita la ley, usted acepta defender, indemnizar y eximir de responsabilidades a Google, sus filiales y sus respectivos directores, funcionarios, empleados y agentes, de todo tipo de reclamo, acción legal y proceso judicial, así como de las pérdidas, responsabilidades, daños, costos y gastos (incluidos los honorarios razonables de abogados) que surjan o se acumulen (a) del uso que usted realiza de la Versión preliminar, (b) de cualquier aplicación que desarrolle en la Versión preliminar que infrinja algún derecho de propiedad intelectual de cualquier persona, o que difame a cualquier persona o viole sus derechos de publicidad o privacidad, y (c) del incumplimiento por su parte del Contrato de licencia.
13. Cambios en el Contrato de licencia
13.1 Google puede realizar cambios en el Contrato de licencia a medida que distribuye nuevas versiones de la Versión preliminar. Cuando se realicen esos cambios, Google emitirá una nueva versión del Contrato de licencia, que estará disponible en el sitio web donde se ponga a la venta la Versión preliminar.
14. Términos legales generales
14.1 El Contrato de licencia constituye el contrato legal integral entre usted y Google, y rige el uso que usted realice de la Versión preliminar (a excepción de los servicios que Google pueda proporcionarle en virtud de un contrato por escrito independiente), y reemplaza totalmente cualquier contrato anterior entre usted y Google en relación con la Versión preliminar.
14.2 Usted acepta que, si Google no ejerce ni impone un derecho o recurso legal especificados en el Contrato de licencia (o sobre el que Google tenga beneficios conforme a cualquier ley aplicable), esto no se considerará una renuncia formal a los derechos por parte de Google y Google aún seguirá recibiendo los beneficios de esos derechos o recursos legales.
14.3 Si algún tribunal judicial con jurisdicción para decidir sobre este asunto determina que alguna de las disposiciones de este Contrato de licencia no es válida, se eliminará esa disposición del Contrato de licencia sin que eso afecte la validez del resto del contrato. Las disposiciones restantes del Contrato de licencia continuarán siendo válidas y aplicables.
14.4 Usted reconoce y acepta que cada miembro del grupo de compañías de las que Google es la compañía central serán terceros beneficiarios del Contrato de licencia, y que esas otras empresas tendrán el derecho de imponer directamente cualquier disposición y ampararse en las disposiciones de este Contrato de licencia que les confieran un beneficio (o que confieran derechos a su favor). Además de esto, ninguna otra persona o compañía serán terceros beneficiarios del Contrato de licencia.
14.5 RESTRICCIONES DE EXPORTACIÓN. LA VERSIÓN PRELIMINAR ESTÁ SUJETA A LAS LEYES Y REGULACIONES DE EXPORTACIÓN DE LOS ESTADOS UNIDOS. DEBE CUMPLIR CON TODAS LAS LEYES Y REGULACIONES DE EXPORTACIÓN NACIONALES E INTERNACIONALES QUE SE APLIQUEN A LA VERSIÓN PRELIMINAR. ESAS LEYES INCLUYEN RESTRICCIONES EN RELACIÓN CON LOS DESTINOS, USUARIOS FINALES Y USO FINAL.
14.6 Usted no puede asignar ni transferir el Contrato de licencia sin la aprobación previa por escrito de Google y todo intento de asignación sin dicha aprobación no tendrá validez. No podrá delegar sus responsabilidades u obligaciones otorgadas en virtud del Contrato de licencia sin la aprobación previa por escrito de Google.
14.7 El Contrato de licencia y su relación con Google conforme al Contrato de licencia se regirán por las leyes del estado de California, independientemente de los principios de conflictos entre leyes. Usted y Google aceptan presentarse ante la jurisdicción exclusiva de los tribunales del condado de Santa Clara, California, para resolver cualquier asunto legal que pudiera surgir del Contrato de licencia. Sin perjuicio de esto, usted acepta que Google aún podrá aplicar reparaciones conforme a mandato judicial (o a un tipo equivalente de desagravio legal) en cualquier jurisdicción.
</div><!-- sdk terms -->
<div id="sdk-terms-form">
<p>
<input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
<label id="agreeLabel" for="agree">He leído y acepto los términos y las condiciones anteriores.</label>
</p>
<p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
</div>
</div><!-- end TOS -->
<div id="landing">
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento</h2>
<ol>
<li><a href="#device-preview">Configurar un dispositivo de hardware</a>
<ol>
<li><a href="#ota">Obtener actualizaciones inalámbricas</a></li>
<li><a href="#flash">Actualizar manualmente un dispositivo</a></li>
<li><a href="#revertDevice">Desinstalar</a></li>
</ol>
</li>
<li><a href="#setupAVD">Configurar un emulador</a></li>
</ol>
</div>
</div>
<p>
Para ejecutar y probar tu aplicación en la plataforma nueva necesitas configurar el tiempo de ejecución de Android N
. Puedes realizar eso de las siguientes maneras:
</p>
<ul>
<li>Instalar Android N en un dispositivo de hardware compatible o</li>
<li>Configurar un emulador de Android a través de la ejecución de Android N</li>
</ul>
<p>
Si deseas un entorno para realizarle pruebas básicas de compatibilidad a tu aplicación en la plataforma nueva
, todo lo que necesitas es tu actual APK y un dispositivo de hardware o
emulador. No necesitas actualizar todo tu entorno de desarrollo
para realizar pruebas básicas.
</p>
<p>
Si deseas modificar tu aplicación para seleccionar como destino Android N o usar las API nuevas de Android N,
debes configurar un entorno de desarrollo que esté actualizado para que admita
Android N. En <a href="{@docRoot}preview/setup-sdk.html">Configuración para el desarrollo de
Android N</a> se ofrece información detallada.
</p>
<h2 id="device-preview">Configurar un dispositivo de hardware</h2>
<p>
En la N Developer Preview se ofrecen actualizaciones del sistema para una variedad de dispositivos de hardware
que puedes usar para realizarle pruebas a tu aplicación, desde teléfonos hasta tablets y TV.
</p>
<p>
Si tienes acceso a un dispositivo compatible, puedes actualizarlo a una versión "milestone" de la Developer Preview
de las siguientes maneras:
</p>
<ul>
<li><strong>Registrar el dispositivo en actualizaciones automáticas del sistema vía OTA</strong> a través del
<a href="https://g.co/androidbeta">Programa de Android beta</a>. Una vez registrado, tu dispositivo recibirá actualizaciones inalámbricas regulares (OTA)
de todas las compilaciones de hitos en la N Developer Preview. Se recomienda este
enfoque porque te permite realizar una transición sin inconvenientes desde tu entorno actual
a través de varios lanzamientos de la N Developer Preview.</li>
<li><strong>Descargar una imagen de sistema de la Developer Preview y actualizar el dispositivo</strong>.
Las actualizaciones OTA no se proporcionan de manera automática para los dispositivos que actualizas de manera manual, pero
puedes registrar esos dispositivos en el Programa de Android beta para obtener actualizaciones OTA. </li>
</ul>
<h3 id="ota">Registrar el dispositivo en actualizaciones automáticas OTA</h3>
<p>
Si tienes acceso a un dispositivo compatible (consulta la lista en la tabla de descargas
), puedes recibir actualizaciones inalámbricas para mostrar versiones de Android
registrando el dispositivo en el <a href="https://g.co/androidbeta">Programa de Android beta</a>. Estas actualizaciones
se descargan de manera automática y actualizarán tu dispositivo como otras
actualizaciones oficiales del sistema.
</p>
<p>
Puedes dar de baja el registro de un dispositivo en cualquier momento. El dispositivo recibirá una actualización OTA
para la versión de producción más reciente de Android que se encuentre disponible para ese dispositivo
(por ejemplo, Android 6.0 Marshmallow). La actualización requiere un restablecimiento completo del dispositivo
, entonces se quitarán los datos del usuario en el dispositivo. Asegúrate de <strong>realizar una
copia de seguridad de los datos importantes</strong> antes de dar de baja un dispositivo.
</p>
<p>
Para obtener más información y para registrar tu dispositivo, consulta
el sitio web del <a href="https://g.co/androidbeta">Programa de Android beta</a> .
</p>
<p class="note"><strong>Nota:</strong>
Dar de baja el registro requiere un restablecimiento completo del dispositivo. Realice una copia de seguridad de los
datos importantes primero.
</p>
<h3 id="flash">Actualizar un dispositivo manualmente</h3>
<p>
En cualquier momento, puedes descargar las últimas imágenes de sistema de la Developer Preview y
puedes actualizarlas manualmente en tu dispositivo. Consulta la siguiente tabla para descargar la imagen de
sistema para tu dispositivo de prueba. La actualización manual de un dispositivo es útil si necesitas
un control preciso del entorno de prueba o necesitas reinstalar con frecuencia,
como en pruebas automatizadas.
</p>
<!-- You can flash by ota or system image --><p>
El proceso de instalación de una imagen de sistema en un dispositivo <strong>elimina todos los datos del
dispositivo</strong>, por lo tanto, deberás hacer una copia de seguridad de los datos en primer lugar.
</p>
<p>
Después de que realices una copia de seguridad y que descargues la siguiente imagen de sistema que
se adecua a tu dispositivo, sigue las instrucciones que se describen en <a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
para actualizar la imagen en tu dispositivo.
</p>
<p>
Las imágenes de sistema actualizadas de manera manual <strong>no
reciben actualizaciones OTA de manera automática</strong> para posteriores "milestone"
de la Developer Preview. Asegúrate de mantener tu entorno actualizado y actualiza una
nueva imagen de sistema en cada "milestone" de la Developer Preview.
</p>
<p>
Si decides que quieres obtener actualizaciones OTA después de actualizar de manera manual un dispositivo,
lo único que debes hacer es registrar el dispositivo en el <a href="https://g.co/androidbeta">Programa
de Android beta</a>. Puedes registrar el dispositivo en cualquier momento para recibir la siguiente actualización de la Preview
vía inalámbrica.
</p>
<table>
<tr>
<th scope="col">Dispositivo</th>
<th scope="col">Descarga/sumas de comprobación</th>
</tr>
<tr id="bullhead">
<td>Nexus 5X <br>“bullhead”</td>
<td><a href="#top" onclick="onDownload(this)">bullhead-npc56p-preview-6c877a3d.tgz</a><br>
MD5: b5cf874021023b398f5b983b24913f5d<br>
SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a
</td>
</tr>
<tr id="shamu">
<td>Nexus 6 <br>“shamu”</td>
<td><a href="#top" onclick="onDownload(this)">shamu-npc56p-preview-54b13c67.tgz</a><br>
MD5: af183638cf34e0eb944a1957d7696f60<br>
SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973
</td>
</tr>
<tr id="angler">
<td>Nexus 6P <br>“angler”</td>
<td><a href="#top" onclick="onDownload(this)">angler-npc56p-preview-85ffc1b1.tgz</a><br>
MD5: bc4934ea7bd325753eee1606d3725a24<br>
SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588
</td>
</tr>
<tr id="volantis">
<td>Nexus 9 <br>“volantis”</td>
<td><a href="#top" onclick="onDownload(this)">volantis-npc56p-preview-0e8ec8ef.tgz</a><br>
MD5: c901334c6158351e945f188167ae56f4<br>
SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4
</td>
</tr>
<tr id="volantisg">
<td>Nexus 9G <br>“volantisg”</td>
<td><a href="#top" onclick="onDownload(this)">volantisg-npc56p-preview-1bafdbfb.tgz</a><br>
MD5: 7bb95bebc478d7257cccb4652899d1b4<br>
SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6
</td>
</tr>
<tr id="fugu">
<td>Nexus Player <br>“fugu”</td>
<td><a href="#top" onclick="onDownload(this)">fugu-npc56r-preview-7027d5b6.tgz</a><br>
MD5: f5d3d8f75836ccfe4c70e8162e498be4<br>
SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b
</td>
</tr>
<tr id="ryu">
<td>Pixel C <br>“ryu”</td>
<td><a href="#top" onclick="onDownload(this)">ryu-npc56p-preview-335a86a4.tgz</a><br>
MD5: 4e21fb183bbbf467bee91598d587fd2e<br>
SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92
</td>
</tr>
<tr id="seed">
<td>4G móviles en general (Android One) <br>“seed”</td>
<td><a href="#top" onclick="onDownload(this)">seed_l8150-npc56p-preview-82472ebc.tgz</a><br>
MD5: 983e083bc7cd0c4a2d39d6ebaa20202a<br>
SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127
</td>
</tr>
</table>
<h3 id="revertDevice">Desinstalar la Preview de un dispositivo</h3>
<p>
Si quieres desinstalar la Preview de un dispositivo, puedes hacerlo de las
siguientes maneras: </p>
<ul>
<li><strong>Obtener una imagen de sistema con las especificaciones de fábrica</strong> y luego actualízala de manera manual
para el dispositivo.
<ul>
<li>Para <strong>los dispositivos Nexus y Pixel C</strong>, consulta la página
<a href="http://developers.google.com/android/nexus/images">Imágenes de fábrica para dispositivos Nexus
</a>para descargas. </li>
<li>Para <strong>otros dispositivos</strong>, comunícate directamente con el fabricante del dispositivo
. De manera alternativa, si el dispositivo es compatible con
el Programa de Android beta, puedes registrar el dispositivo en el
programa y luego darlo de baja (consulta a continuación).</li>
</ul>
</li>
<li><strong>Dar de baja el dispositivo del Programa de Android beta</strong>. Si el
dispositivo se registra en el <a href="https://g.co/androidbeta">Programa de Android beta
</a>, independientemente del dispositivo, puedes simplemente darlo de baja desde el programa.
<p>
El dispositivo recibirá una actualización OTA para la versión de producción más reciente
de Android que se encuentre disponible para ese dispositivo (por ejemplo, Android 6.0 Marshmallow).
La actualización requiere un restablecimiento completo del dispositivo, entonces se quitarán
los datos del usuario en el dispositivo. Asegúrate de <strong>realizar una copia de seguridad de los datos importantes</strong> antes
de dar de baja un dispositivo.
</p>
</li>
</ul>
<p class="note"><strong>Nota:</strong>
Desinstalar una imagen de sistema de la Developer Preview antes
del final del programa requiere un restablecimiento completo del dispositivo y elimina todos los datos del usuario
en el dispositivo.
</p>
<h2 id="setupAVD">Configurar un emulador</h2>
<p>Para usar el emulador de Android para la ejecución de la Android N Preview, necesitas
descargar Android N Preview SDK y crear un dispositivo virtual para el
emulador.</p>
<p>Primero, descarga Android N Preview SDK de la siguiente manera (si
ya lo obtuviste durante <a href="{@docRoot}preview/setup-sdk.html">la configuración
para desarrollar Android N</a>, puedes omitir esta parte):
<ol>
<li>En Android Studio, abre el diálogo de configuración
(<strong>File &gt; Settings</strong> en Windows y Linux, o
<strong>Android Studio &gt; Preferences</strong> en Mac). En el panel
izquierdo, selecciona <strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>.
<li>Haz clic en la pestaña <strong>SDK platforms</strong> y luego selecciona la casilla de verificación
<strong>Android N Preview</strong>.</li>
<li>Haz clic en la pestaña <strong>SDK Tools</strong> y luego selecciona las casillas de verificación
<strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong> y
<strong>Android SDK Tools</strong>.
</li>
<li>Haz clic en <strong>OK</strong> y acepta los contratos
de licencia para instalar cualquier paquete.
</li>
</ol>
<p>Ahora debes tener <strong>Android SDK Built-Tools 24.0 0 rc1</strong>,
<strong>Platform-Tools 24.0.0 rc1</strong>, y <strong>SDK Tools
25.0.9</strong>. Si no actualizas las SDK Tools a 25.0.9, luego no podrás
ejecutar las imágenes de sistema x86_64 para Android N.</p>
<p>Ahora crea un dispositivo virtual con la imagen de sistema de Android N:</p>
<ol>
<li>Abre el Administrador de AVD seleccionando <strong>Tools &gt; Android &gt;
AVD Manager</strong>.</li>
<li>Haz clic en <strong>Create Virtual Device</strong>.</li>
<li>Selecciona un dispositivo como Nexus 5X, Nexus 6P, Nexus 9, o Android TV,
luego haz clic en <strong>Next</strong>.</li>
<li>Selecciona la imagen de sistema <strong>N</strong> (con la ABI
<strong>x86</strong> ), luego haz clic en <strong>Next</strong>.
(Solo las imágenes de sistema x86 son actualmente compatibles con el emulador de Android
para la Android N Preview).
<li>Completa el resto de la configuración AVD y haz clic en
<strong>Finish</strong>.</li>
</ol>
<p>Ahora puedes lanzar el emulador de Android con el AVD de la Android N Preview.</p>
<p>
A fin de garantizar la mejor experiencia en el emulador de Android, instala la
Android Studio 2.1 Preview, que admite el <a href="http://tools.android.com/tech-docs/emulator">emulador Android 2.0 Beta</a>
con mayor rendimiento en comparación con el emulador en
Android Studio 1.5.</p>
<p class="note"><strong>Nota:</strong>
Si actualmente estás usando Android Studio 2.0 Beta, existe un problema conocido
que no te permite crear AVD con las imágenes de sistema de la N Preview;
por el momento necesitas usar la muestra de Android Studio 2.1 para crear AVD.
</p>
<p>Para obtener más información sobre la creación de dispositivos virtuales, consulte la <a href="{@docRoot}tools/devices/index.html">Administración de dispositivos virtuales.</a>
</p>
</div><!-- landing -->
</div><!-- relative wrapper -->
<script>
var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
function onDownload(link) {
$("#downloadForRealz").html("Download " + $(link).text());
$("#downloadForRealz").attr('href', urlRoot + $(link).text());
$("#tos").fadeIn('fast');
$("#landing").fadeOut('fast');
return true;
}
function onAgreeChecked() {
/* verify that the TOS is agreed */
if ($("input#agree").is(":checked")) {
/* reveal the download button */
$("a#downloadForRealz").removeClass('disabled');
} else {
$("a#downloadForRealz").addClass('disabled');
}
}
function onDownloadForRealz(link) {
if ($("input#agree").is(':checked')) {
/*
$("#tos").fadeOut('fast');
$("#landing").fadeIn('fast');
*/
ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
/*
location.hash = "";
*/
return true;
} else {
return false;
}
}
$(window).hashchange( function(){
if (location.hash == "") {
location.reload();
}
});
</script>

View File

@@ -0,0 +1,388 @@
page.title=Optimizaciones en segundo plano
page.metaDescription=Nuevas restricciones para difusiones implícitas.
page.keywords="android N", "implicit broadcasts", "job scheduler"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>
Contenido del documento
</h2>
<ol>
<li>
<a href="#connectivity-action">Restricciones en CONNECTIVITY_ACTION</a>
</li>
<li>
<a href="#sched-jobs">Programación de trabajos en red en conexiones
sin medición</a>
</li>
<li>
<a href="#monitor-conn">Control de la conectividad de la red mientras la aplicación
se está ejecutando</a>
</li>
<li>
<a href="#media-broadcasts">Restricciones en NEW_PICTURE y
NEW_VIDEO</a>
</li>
<li>
<a href="#new-jobinfo">Nuevos métodos de JobInfo</a>
</li>
<li>
<a href="#new-jobparam">Nuevos métodos de JobParameter</a>
</li>
<li>
<a href="#further-optimization">Cómo optimizar aún más tu aplicación</a>
</li>
</ol>
</div>
</div>
<p>
Los procesos en segundo plano pueden consumir mucha memoria y batería. Por ejemplo, una
difusión implícita puede iniciar muchos procesos en segundo plano registrados para
escucharla, aunque esos procesos quizá no desempeñen un trabajo considerable. Esto puede
afectar de forma significativa tanto el rendimiento del dispositivo como la experiencia de usuario.
</p>
<p>
Para atenuar este problema, la N Developer Preview aplica las siguientes
restricciones:
</p>
<ul>
<li>Las aplicaciones orientadas a la Preview no reciben difusiones {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} si
en su manifiesto registran que las reciben. Las aplicaciones que se ejecutan en segundo plano
aún pueden escuchar {@code CONNECTIVITY_CHANGE} en su subproceso principal al
registrar un {@link android.content.BroadcastReceiver} con {@link
android.content.Context#registerReceiver Context.registerReceiver()}.
</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 orientadas a la Preview.
</li>
</ul>
<p>
El framework de Android ofrece varias soluciones para mitigar la necesidad de
estas difusiones implícitas. Por ejemplo, {@link android.app.job.JobScheduler}
y <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> proporcionan mecanismos sólidos para programar operaciones
de red cuando se cumplen las condiciones especificadas, como una conexión a una
red de uso no medido. Ahora también puedes usar {@link android.app.job.JobScheduler}
para reaccionar a cambios en relación con los proveedores de contenido. Los objetos {@link android.app.job.JobInfo}
encapsulan los parámetros que usa {@link android.app.job.JobScheduler}
para programar el trabajo. Cuando se cumplen las condiciones del trabajo, el sistema
ejecuta ese trabajo en el {@link android.app.job.JobService} de tu aplicación.
</p>
<p>
En este documento, aprenderemos cómo usar métodos alternativos, como
{@link android.app.job.JobScheduler}, para adaptar tu aplicación a esas nuevas
restricciones.
</p>
<h2 id="connectivity-action">
Restricciones en CONNECTIVITY_ACTION
</h2>
<p>
Las aplicaciones orientadas a la N Developer Preview no reciben difusiones {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} si en su
manifiesto registran que las reciben, y los procesos dependen de que
no se inicie esa difusión. Esto podría ser un problema para aplicaciones que buscan
escuchar los cambios en la red o realizar múltiples actividades en red cuando el
dispositivo se conecta a una red sin medición de uso. Ya existen varias soluciones
en relación con esta restricción en el framework de Android, pero elegir
la correcta depende de lo que quieras lograr con tu aplicación.
</p>
<p class="note">
<strong>Nota:</strong> Un {@link android.content.BroadcastReceiver} registrado con
{@link android.content.Context#registerReceiver Context.registerReceiver()}
continúa recibiendo esas difusiones mientras la aplicación está en segundo plano.
</p>
<h3 id="sched-jobs">
Programación de trabajos en red en conexiones sin medición de uso
</h3>
<p>
Cuando uses la clase {@link android.app.job.JobInfo.Builder JobInfo.Builder}
para crear tu objeto {@link android.app.job.JobInfo}, aplica el método {@link
android.app.job.JobInfo.Builder#setRequiredNetworkType
setRequiredNetworkType()} y pasa {@link android.app.job.JobInfo
JobInfo.NETWORK_TYPE_UNMETERED} como parámetro de trabajo. El siguiente ejemplo de código
programa la ejecución de un servicio cuando el dispositivo se conecta a una red sin
medición de uso y se está cargando:
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
js.schedule(job);
}
</pre>
<p>
Cuando se cumplan las condiciones para tu trabajo, tu aplicación recibirá un callback para ejecutar
el método {@link android.app.job.JobService#onStartJob onStartJob()} en la
{@code JobService.class} especificada. Para ver más ejemplos de la implementación de {@link
android.app.job.JobScheduler}, consulta la <a href="{@docRoot}samples/JobScheduler/index.html">aplicación de ejemplo JobScheduler</a>.
</p>
<p>
Las aplicaciones que usan servicios de GMSCore y están orientadas a Android 5.0 (API nivel 21)
o anterior, pueden usar <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> y especificar {@code Task.NETWORK_STATE_UNMETERED}.
</p>
<h3 id="monitor-conn">
Control de la conectividad de la red mientras la aplicación se está ejecutando
</h3>
<p>
Las aplicaciones que se ejecutan en segundo plano aún pueden escuchar {@code
CONNECTIVITY_CHANGE} con un {@link
android.content.BroadcastReceiver} registrado. No obstante, la API {@link
android.net.ConnectivityManager} ofrece un método más robusto para solicitar
un callback solo cuando se cumplen las condiciones de red especificadas.
</p>
<p>
Los objetos {@link android.net.NetworkRequest} definen los parámetros del
callback de la red en términos de {@link android.net.NetworkCapabilities}. Creas
objetos {@link android.net.NetworkRequest} con la clase {@link
android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link
android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
y luego pasa el objeto {@link android.net.NetworkRequest} al sistema. Cuando
se cumplen las condiciones de la red, la aplicación recibe un callback para ejecutar el método
{@link android.net.ConnectivityManager.NetworkCallback#onAvailable
onAvailable()} definido en su clase {@link
android.net.ConnectivityManager.NetworkCallback}.
</p>
<p>
La aplicación continuará recibiendo callbacks hasta que la aplicación salga o llame a
{@link android.net.ConnectivityManager#unregisterNetworkCallback
unregisterNetworkCallback()}.
</p>
<h2 id="media-broadcasts">
Restricciones en NEW_PICTURE y NEW_VIDEO
</h2>
<p>
En la N Developer Preview, las aplicaciones no pueden enviar ni recibir difusiones {@link
android.hardware.Camera#ACTION_NEW_PICTURE} ni {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Esta restricción ayuda a
aliviar el impacto en el rendimiento y la experiencia de usuario cuando varias aplicaciones deben
activarse para procesar una nueva imagen o video. La N Developer Preview
extiende {@link android.app.job.JobInfo} y {@link
android.app.job.JobParameters} para proporcionar una solución alternativa.
</p>
<h3 id="new-jobinfo">
Nuevos métodos de JobInfo
</h3>
<p>
Para activar trabajos en los cambios del URI de contenido, la N Developer Preview amplía
la API {@link android.app.job.JobInfo} con los siguientes métodos:
</p>
<dl>
<dt>
{@code JobInfo.TriggerContentUri()}
</dt>
<dd>
Encapsula parámetros necesarios para activar un trabajo en cambios del URI de contenido.
</dd>
<dt>
{@code JobInfo.Builder.addTriggerContentUri()}
</dt>
<dd>
Pasa un objeto {@code TriggerContentUri} a {@link
android.app.job.JobInfo}. Un {@link android.database.ContentObserver}
controla el URI de contenido encapsulado. Si hay múltiples objetos {@code
TriggerContentUri} asociados a un trabajo, el sistema proporciona un
callback aunque se informe un cambio en un solo URI de contenido.
</dd>
<dd>
Si cambia algún desencadenante del URI determinado, agrega el marcador {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} para
activar el trabajo. Este marcador
corresponde al parámetro {@code notifyForDescendants} pasado a {@link
android.content.ContentResolver#registerContentObserver
registerContentObserver()}.
</dd>
</dl>
<p class="note">
<strong>Nota:</strong> no se puede usar {@code TriggerContentUri()} junto
con {@link android.app.job.JobInfo.Builder#setPeriodic
setPeriodic()} ni {@link android.app.job.JobInfo.Builder#setPersisted
setPersisted()}. Para controlar de forma constante la presencia de cambios, programa un nuevo
{@link android.app.job.JobInfo} antes de que el {@link
android.app.job.JobService} de la aplicación termine de administrar la callback más reciente.
</p>
<p>
El siguiente código de ejemplo programa la activación de un trabajo cuando el sistema informe
un cambio en el URI de contenido, {@code MEDIA_URI}:
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MediaContentJob.class));
builder.addTriggerContentUri(
new JobInfo.TriggerContentUri(MEDIA_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
js.schedule(builder.build());
}
</pre>
<p>
Cuando el sistema informa un cambio en el(los) URI de contenido especificado(s), tu aplicación
recibe un callback y se pasa un objeto {@link android.app.job.JobParameters}
al método {@link android.app.job.JobService#onStartJob onStartJob()}
en {@code MediaContentJob.class}.
</p>
<h3 id="new-jobparam">
Nuevos métodos de JobParameter
</h3>
<p>
La N Developer Preview también amplía {@link android.app.job.JobParameters} para
permitir que tu aplicación reciba información útil sobre qué autoridades de contenido
y URI activaron el trabajo:
</p>
<dl>
<dt>
{@code Uri[] getTriggeredContentUris()}
</dt>
<dd>
Devuelve el arreglo de los URI que activaron el trabajo. Ese arreglo será {@code
null} si ningún URI activó el trabajo (por ejemplo, el trabajo
se activó debido al cumplimiento de un plazo o por otro motivo), o la cantidad de URI
modificados es superior a 50.
</dd>
<dt>
{@code String[] getTriggeredContentAuthorities()}
</dt>
<dd>
Devuelve el arreglo de cadenas de autoridades de contenido que activaron el trabajo.
Si el arreglo devuelto no es {@code null}, usa {@code getTriggeredContentUris()}
para recuperar los detalles de los URI que se modificaron.
</dd>
</dl>
<p>
El siguiente código de ejemplo anula el método {@link
android.app.job.JobService#onStartJob JobService.onStartJob()} y
registra las autoridades de contenido y los URI que activaron el trabajo:
</p>
<pre>
&#64;Override
public boolean onStartJob(JobParameters params) {
StringBuilder sb = new StringBuilder();
sb.append("Media content has changed:\n");
if (params.getTriggeredContentAuthorities() != null) {
sb.append("Authorities: ");
boolean first = true;
for (String auth :
params.getTriggeredContentAuthorities()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(auth);
}
if (params.getTriggeredContentUris() != null) {
for (Uri uri : params.getTriggeredContentUris()) {
sb.append("\n");
sb.append(uri);
}
}
} else {
sb.append("(No content)");
}
Log.i(TAG, sb.toString());
return true;
}
</pre>
<h2 id="further-optimization">
Cómo optimizar aún más tu aplicación
</h2>
<p>
Optimizar tus aplicaciones para que se ejecuten en dispositivos con poca memoria o en condiciones de niveles bajos
de memoria puede mejorar el rendimiento y la experiencia del usuario. Eliminar
dependencias en servicios en segundo plano y receptores de difusiones implícitas
registrados estadísticamente puede ayudar a que tu aplicación se ejecute mejor en esos dispositivos. Si bien
la N Developer Preview toma medidas para reducir algunos de esos problemas, te
recomendamos que optimices tu aplicación para que pueda ejecutarse sin utilizar esos
procesos en segundo plano.
</p>
<p>
La N Developer Preview presenta algunos comandos adicionales de <a href="{@docRoot}tools/help/adb.html">Puente de Depuración Android (en inglés, Android Debug Bridge, ADB)</a> que
puedes usar para probar el comportamiento de la aplicación con esos procesos en segundo plano deshabilitados:
</p>
<ul>
<li>Para simular condiciones en las que no hay difusiones implícitas ni servicios en segundo plano
disponibles, ingresa el siguiente comando:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
</pre>
</li>
<li>Para volver a habilitar las difusiones implícitas y los servicios en segundo plano, ingresa el
siguiente comando:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
</pre>
</li>
</ul>

View File

@@ -0,0 +1,180 @@
page.title=Arranque directo
page.keywords=preview,sdk,direct boot
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento</h2>
<ol>
<li><a href="#run">Solicitar acceso para ejecutar durante el arranque directo</a></li>
<li><a href="#access">Acceder al almacenamiento cifrado por dispositivo</a></li>
<li><a href="#notification">Recibir notificaciones sobre el desbloqueo del usuario</a></li>
<li><a href="#migrating">Migrar datos existentes</a></li>
<li><a href="#testing">Probar la aplicación con reconocimiento de cifrado</a></li>
</ol>
</div>
</div>
<p>Android N se ejecuta en un modo <i>de arranque directo</i> seguro
cuando el dispositivo se enciende pero el usuario no lo ha
desbloqueado. Para permitir esto, el sistema brinda dos ubicaciones de almacenamiento para los datos:</p>
<ul>
<li><i>Almacenamiento cifrado por credencial:</i>es la ubicación de almacenamiento predeterminada
y solo está disponible después de que el usuario desbloquea el dispositivo.</li>
<li><i>Almacenamiento cifrado por dispositivo:</i>es una ubicación de almacenamiento que está disponible tanto
durante el modo de arranque directo como después de que el usuario desbloquea el dispositivo.</li>
</ul>
<p>De forma predeterminada, las aplicaciones no se ejecutan durante el modo de arranque directo.
Si necesita que su aplicación se ejecute durante el modo de arranque directo, puede registrar
los componentes de la aplicación que deberían ejecutarse durante este modo. Algunos casos comunes de
aplicaciones que necesitan ejecutarse durante el modo de arranque directo incluyen los siguientes:</p>
<ul>
<li>aplicaciones que tienen notificaciones programadas, como aplicaciones
de alarma;</li>
<li>aplicaciones que generan notificaciones de usuario importantes, como aplicaciones de mensajes SMS;</li>
<li>aplicaciones que brindan servicios de accesibilidad, como Talkback.</li>
</ul>
<p>Si necesita que su aplicación acceda a datos mientras se ejecuta el modo de arranque directo, use
el almacenamiento cifrado por dispositivo. Este tipo de almacenamiento contiene datos
cifrados con una clave que solo está disponible luego de que el dispositivo haya realizado un inicio
verificado correctamente.</p>
<p>Para los datos que se deben cifrar con una clave asociada con credenciales del
usuario, como un PIN o una contraseña, use el almacenamiento cifrado por credencial.
Este tipo de almacenamiento solo está disponible luego de que el usuario haya desbloqueado
correctamente el dispositivo y hasta que el usuario reinicie nuevamente el dispositivo. Si el
usuario habilita el bloqueo de pantalla luego de desbloquear el dispositivo, esto no bloquea
el almacenamiento cifrado por credencial.</p>
<h2 id="run">Solicitar acceso para ejecutar durante el arranque directo</h2>
<p>Debes registrar los componentes de las aplicaciones con el sistema antes de que estas puedan
ejecutarse durante el modo de arranque directo o acceder al almacenamiento cifrado por
dispositivo. Para registrar una aplicación en el sistema, debes marcar los componentes como
<i>reconocimiento de cifrado</i>. Para marcar su dispositivo como "con reconocimiento de cifrado" , configure el atributo
<code>android:encryptionAware</code> como verdadero en el manifiesto.<p>
<p>Los componentes con reconocimiento de cifrado pueden registrarse para recibir un mensaje de difusión
<code>LOCKED_BOOT_COMPLETED</code> del
sistema cuando el dispositivo se haya reiniciado. En este momento, el almacenamiento
cifrado por dispositivo está disponible, y el componente puede ejecutar tareas que se deben
ejecutar durante el modo de arranque directo, como disparar una alarma programada.</p>
<p>El siguiente fragmento de código es un ejemplo de cómo registrar un
{@link android.content.BroadcastReceiver} como reconocimiento de cifrado y de cómo agregar un
filtro de intenciones para <code>LOCKED_BOOT_COMPLETED</code> en el manifiesto de la aplicación:</p>
<pre>
&lt;receiever
android:encryptionAware="true" &gt;
...
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>Una vez que el usuario haya desbloqueado el dispositivo, todos los componentes podrán acceder tanto al
almacenamiento cifrado por dispositivo como al almacenamiento cifrado por credencial.</p>
<h2 id="access">Acceder al almacenamiento cifrado por dispositivo</h2>
<p>Para acceder al almacenamiento cifrado por dispositivo, crea una segunda
instancia de {@link android.content.Context} llamando a
<code>Context.createDeviceEncryptedStorageContext()</code>. Todas las llamadas
de API de almacenamiento que se hacen usando este contexto acceden al almacenamiento cifrado por dispositivo. El siguiente
ejemplo accede al almacenamiento cifrado por dispositivo y abre un archivo de datos de la aplicación
existente:</p>
<pre>
Context directBootContext = Context.createDeviceEncryptedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...
</pre>
<p>Solo debes usar el almacenamiento cifrado por dispositivo para
información que debe ser accesible durante el modo de arranque directo.
No uses este tipo de almacenamiento como un almacenamiento cifrado de propósito general.
Para información privada del usuario o datos cifrados que no son necesarios durante
el modo de arranque directo, usa el almacenamiento cifrado por credencial.</p>
<h2 id="notification">Recibir notificaciones sobre el desbloqueo del usuario</h2>
<p>Una vez que el usuario desbloquea el dispositivo después de reiniciarlo, la aplicación puede cambiar y acceder
al almacenamiento cifrado por credencial y usar servicios del sistema comunes que
dependen de credenciales de usuario.</p>
<p>Para recibir una notificación cuando el usuario desbloquea el dispositivo luego de reiniciarlo,
registra un {@link android.content.BroadcastReceiver} de un componente en ejecución
para que escuche el mensaje <code>ACTION_USER_UNLOCKED</code>. O puedes
recibir el mensaje existente {@link android.content.Intent#ACTION_BOOT_COMPLETED
ACTION_BOOT_COMPLETED}, que ahora indica que el dispositivo se ha iniciado y
que el usuario ha desbloqueado el dispositivo.</p>
<p>Puedes consultar directamente si el usuario ha desbloqueado el dispositivo llamando a
<code>UserManager.isUserUnlocked()</code>.</p>
<h2 id="migrating">Migrar datos existentes</h2>
<p>Si un usuario actualiza el dispositivo para usar el modo de arranque directo, es posible que haya
datos existentes que se deben migrar al almacenamiento cifrado por dispositivo. Usa
<code>Context.migrateSharedPreferencesFrom()</code> y
<code>Context.migrateDatabaseFrom()</code> para migrar los datos de preferencia y de base de datos
del almacenamiento cifrado por credencial al almacenamiento cifrado por dispositivo.</p>
<p>Debes tener cuidado cuando decidas qué datos migrar entre
estos dos tipos de almacenamiento. No deberías migrar
información de usuario privada, como contraseñas o tokens de autorización, al
almacenamiento cifrado por dispositivo. En algunos casos, es posible que debas gestionar
conjuntos separados de datos en ambos tipos de almacenamiento cifrado.</p>
<h2 id="testing">Probar la aplicación con reconocimiento de cifrado</h2>
<p>Prueba la aplicación con reconocimiento de cifrado usando el nuevo modo de arranque directo. Hay dos
maneras de habilitar el arranque directo.</p>
<p class="caution"><strong>Advertencia:</strong> habilitar el arranque directo
borrará todos los datos de usuario del dispositivo.</p>
<p>Para los dispositivos compatibles que tienen Android N instalado, habilita
el arranque directo mediante una de las siguientes opciones:</p>
<ul>
<li>En el dispositivo, habilita las <b>Developer options</b> si no lo haz hecho aún
yendo a <b>Settings &gt; About phone</b> y presionando <b>Build number</b>
siete veces. Una vez que aparezca la pantalla Developer options, dirígete a
<b>Settings &gt; Developer options</b> y selecciona
<b>Convert to file encryption</b>.</li>
<li>Usa los siguientes comandos shell ADB para permitir el modo de arranque directo:
<pre class="no-pretty-print">
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
</pre>
</li>
</ul>
<p>También está disponible un modo de arranque directo emulado en caso de que debas cambiar
de modo en los dispositivos de prueba. El modo emulado solo debería usarse durante
el desarrollo, y puede provocar la pérdida de datos. Para habilitar el modo de arranque directo emulado,
debes establecer un patrón de bloqueo en el dispositivo, elegir "No thanks" si te pregunta si deseas un
inicio seguro cuando estás estableciendo el patrón de bloqueo y, luego, usar el
siguiente comando shell ADB:</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe true
</pre>
<p>Para deshabilitar el modo de arranque directo emulado, usa el siguiente comando:</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe false
</pre>
<p>Usar estos comandos provoca el reinicio del dispositivo.</p>

View File

@@ -0,0 +1,158 @@
page.title=API de ICU4J del framework de Android
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento:</h2>
<ol>
<li><a href="#relation">Relación con ICU4J</a></li>
<li><a href="#migration">Migración hacia API de android.icu desde ICU4J</a></li>
<li><a href="#licence">Licencias</a></li>
</ol>
<h2>Consulta también</h2>
<ol>
<li>
<a class="external-link" href="http://userguide.icu-project.org">Documentación para ICU4J</a>
</li>
<li>
<a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Últimos estándares compatibles
con ICU4J</a>
</li>
</ol>
</div>
</div>
<p>
ICU4J es un conjunto de bibliotecas de Java de código abierto y amplio uso que brinda soporte de Unicode
y de globalización para aplicaciones de software. Android N
expone un subconjunto de las API de ICU4J en el framework de Android para que los desarrolladores de aplicaciones
lo usen debajo del paquete {@code android.icu}. Estas API usan
datos de ubicación que están presentes en el dispositivo. Como resultado, puedes reducir la superficie de APK
evitando la compilación de las bibliotecas de ICU4J en APK. En lugar de esto, puedes
llamarlas en el framework. (En este caso, posiblemente debas brindar
<a href="{@docRoot}google/play/publishing/multiple-apks.html">versiones múltiples
del APK</a>, de modo que los usuarios que usan versiones de Android inferiores a Android N
puedan descargar una versión de la aplicación que incluya las bibliotecas de ICU4J).
</p>
<p>
Al principio de este documento, encontrarás información básica sobre el mínimo de niveles de Android API
necesarios para soportar estas bibliotecas. Más adelante, encontrarás explicaciones sobre qué
necesitas saber acerca de la implementación de ICU4J específica para Android. Por último,
encontrarás explicaciones sobre cómo usar las API de ICU4J en el framework de Android.
</p>
<h2 id="relation">Relación con ICU4J</h2>
<p>
Android N expone un subconjunto de las API de ICU4J mediante el
paquete <code>android.icu</code>, en lugar de <code>com.ibm.icu</code>. El
framework de Android puede elegir no
exponer las API de ICU4J por varias razones; por ejemplo, Android N no expone
algunas API obsoletas o algunas que el equipo de ICU aún no ha declarado como
estables. A medida que el equipo de ICU deje de usar API en el futuro, Android también las marcará
como obsoletas, pero las seguirá incluyendo.
</p>
<p class="table-caption"><strong>Tabla 1.</strong> Versiones de ICU y CLDR usadas
en Android N.</p>
<table>
<tr>
<th>Nivel de Android API</th>
<th>Versión de ICU</th>
<th>Versión de CLDR</th>
</tr>
<tr>
<td>Android N</td>
<td>56</td>
<td>28</td>
</tr>
</table>
<p>Debes tener en cuenta lo siguiente:</p>
<ul>
<li>Las API de ICU4J del framework de Android no incluyen todas las API de ICU4J.</li>
<li>Los desarrolladores de NDK deben saber que ICU4C de Android no es compatible.</li>
<li>Las API del framework de Android no reemplazan la compatibilidad de Android para
<a href="{@docRoot}guide/topics/resources/localization.html">localizar con
recursos</a>.</li>
</ul>
<h2 id="migration">Migración hacia el paquete android.icu desde com.ibm.icu</h2>
<p>
Si ya estás usando las API de ICU4J en tu aplicación y las
API de <code>android.icu</code> cumplen con tus requisitos, migrar hacia las
API del framework implicará que cambies tus importaciones de Java
de <code>com.ibm.icu</code> a <code>android.icu</code>. Luego, puedes
quitar tu propia copia de los archivos de ICU4J del APK.
</p>
<p class="note">
<b>Nota</b>: Las API del framework de ICU4J usan el espacio de nombres {@code android.icu}
en lugar de {@code com.ibm.icu}. El motivo de esto es evitar conflictos de espacio de nombres
en APK que contienen sus propias bibliotecas de {@code com.ibm.icu}.
</p>
<h3 id="migrate-from-android">
Migración hacia API de android.icu desde otras Android SDK API
</h3>
<p>
Algunas clases de los paquetes de <code>java</code> y de <code>android</code> son
equivalentes a las clases de ICU4J. Sin embargo, ICU4J a menudo brinda una compatibilidad
más amplia para estándares e idiomas.
</p>
<p>Aquí tienes algunos ejemplos para comenzar:</p>
<table>
<tr>
<th>Clase</th>
<th>Alternativa</th>
</tr>
<tr>
<td><code>java.lang.Character</code> </td>
<td><code>android.icu.lang.UCharacter</code> </td>
</tr>
<tr>
<td><code>java.text.BreakIterator</code> </td>
<td><code>android.icu.text.BreakIterator</code> </td>
</tr>
<tr>
<td><code>java.text.DecimalFormat</code> </td>
<td><code>android.icu.text.DecimalFormat</code> </td>
</tr>
<tr>
<td><code>java.util.Calendar</code></td>
<td>
<code>android.icu.util.Calendar</code></td>
</tr>
<tr>
<td><code>android.text.BidiFormatter</code>
</td>
<td><code>android.icu.text.Bidi</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateFormat</code>
</td>
<td><code>android.icu.text.DateFormat</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateUtils</code> </td>
<td><code>android.icu.text.DateFormat</code>
<code>android.icu.text.RelativeDateTimeFormatter</code>
</td>
</tr>
</table>
<h2 id="licence">Licencias</h2>
<p>
ICU4J se presenta bajo la licencia de ICU. Para obtener información más detallada, consulta la <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Guía de usuario
de ICU.</a>
</p>

View File

@@ -0,0 +1,582 @@
page.title=Compatibilidad con ventanas múltiples
page.metaDescription=Nueva compatibilidad en Android N para mostrar más de una aplicación a la vez.
page.keywords="multi-window", "android N", "split screen", "free-form"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento</h2>
<ol>
<li><a href="#overview">Información general</a></li>
<li><a href="#lifecycle">Ciclo de vida en modo de ventanas múltiples</a></li>
<li><a href="#configuring">Configuración de tu aplicación para el modo de
ventanas múltiples</a></li>
<li><a href="#running">Ejecución de tu aplicación en modo de ventanas múltiples</a></li>
<li><a href="#testing">Prueba de la compatibilidad de tu aplicación con el uso de ventanas múltiples</a></li>
</ol>
<h2>Consulta también</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">Aplicación de ejemplo para la
prueba de ventanas múltiples</a></li>
</ol>
</div>
</div>
<p>
Android N agrega compatibilidad con la visualización de más de una aplicación
a la vez. En dispositivos portátiles, se pueden ejecutar dos aplicaciones una al lado de la otra o
una por encima de la otra en modo de <em>pantalla dividida</em>. En dispositivos de TV, las aplicaciones pueden
usar el modo <em>imagen en imagen</em> para continuar la reproducción de video mientras los usuarios
interactúan con otra aplicación.
</p>
<p>
Si compilas tu aplicación con el N Preview SDK, puedes configurar la manera en que tu aplicación
administra la visualización de ventanas múltiples. Por ejemplo, puedes especificar las dimensiones
mínimas permitidas de tu actividad. También puedes inhabilitar la visualización de ventanas múltiples para
tu aplicación asegurándote de que el sistema solo muestre tu aplicación en modo de
pantalla completa.
</p>
<h2 id="overview">Información general</h2>
<p>
Android N permite que varias aplicaciones compartan la pantalla al mismo tiempo. Por
ejemplo, un usuario podría dividir la pantalla y ver una página web a la izquierda
mientras escribe un correo electrónico a la derecha. La experiencia de usuario depende
del dispositivo:
</p>
<ul>
<li>Los dispositivos portátiles con Android N ofrecen modo de
pantalla dividida. En este modo, el sistema ocupa la pantalla con dos aplicaciones y las muestra
una al lado de la otra o una encima de la otra. El usuario puede arrastrar la línea que divide
las dos aplicaciones para visualizar una más grande que la otra.
</li>
<li>En dispositivos Nexus Player con Android N, las aplicaciones pueden ubicarse automáticamente
en <a href="picture-in-picture.html">modo de imagen en imagen</a>, lo que les permite
continuar mostrando contenido mientras el usuario explora o interactúa con
otras aplicaciones.
</li>
<li>Los fabricantes de dispositivos más grandes pueden optar por habilitar el modo
de forma libre, en el que el usuario puede modificar libremente el tamaño de cada actividad. Si el
fabricante habilita está función, el dispositivo ofrecerá modo de forma libre además
del modo de pantalla dividida.
</li>
</ul>
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
{@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong>Figura 1:</strong> Dos aplicaciones ejecutándose una al lado de la otra en modo de pantalla dividida.
</p>
<p>
El usuario puede cambiar a modo de ventanas múltiples de la siguiente manera:
</p>
<ul>
<li>Si el usuario abre la <a href="{@docRoot}guide/components/recents.html">pantalla
Overview</a> y presiona durante un momento el
título de una actividad, puede arrastrar esa actividad a una parte resaltada de la
pantalla para llevarla a modo de ventanas múltiples.
</li>
<li>Si el usuario presiona durante un momento el botón Overview, el dispositivo coloca
la actividad actual en modo de ventanas múltiples y abre la pantalla Overview para
permitirle al usuario seleccionar otra actividad para compartir la pantalla.
</li>
</ul>
<p>
Los usuarios pueden <a href="{@docRoot}guide/topics/ui/drag-drop.html">arrastrar y
soltar</a> datos de una actividad a otra mientras las actividades comparten
la pantalla. (Antes, los usuarios solo podían arrastrar y soltar datos dentro de una sola
actividad).
</p>
<h2 id="lifecycle">Ciclo de vida en modo de ventanas múltiples</h2>
<p>
El modo de ventanas múltiples no cambia el <a href="{@docRoot}training/basics/activity-lifecycle/index.html">ciclo de vida
de la actividad</a>.
</p>
<p>
En modo de ventanas múltiples, solo la actividad con la que el usuario interactuó más recientemente
está activa en un momento determinado. Esa actividad se considera la <em>principal</em>.
Todas las demás actividades están pausadas, aunque estén visibles.
No obstante, el sistema les da a esas actividades pausadas pero visibles una prioridad más alta
que las actividades que no están visibles. Si el usuario interactúa con una de las
actividades pausadas, se reanuda esa actividad y se pausa la actividad que antes
era la principal.
</p>
<p class="note">
<strong>Nota:</strong> En modo de ventanas múltiples, una aplicación puede estar pausada
y aún visible para el usuario. Es posible que una aplicación necesite continuar sus
actividades mientras está pausada. Por ejemplo, una aplicación de reproducción de video que está
pausada pero visible debería continuar mostrando el video. Por ese
motivo, recomendamos que las actividades que reproducen video <em>no</em> pausen el
video en sus controladores{@link android.app.Activity#onPause onPause()}.
En su lugar, deben pausar el video en {@link android.app.Activity#onStop
onStop()} y reanudar la reproducción en {@link android.app.Activity#onStart
onStart()}.
</p>
<p>
Cuando el usuario coloca una aplicación en modo de ventanas múltiples, el sistema le notifica a la
actividad acerca de un cambio de configuración, tal como se especifica en <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Control de cambios en
tiempo de ejecución</a>. Básicamente, este cambio tiene las mismas consecuencias en el ciclo de vida
de la actividad que cuando el sistema notifica a la aplicación que el dispositivo cambió de
modo vertical a modo horizontal, excepto porque se modifican las dimensiones del dispositivo
en lugar de intercambiarse solamente. Como se aborda en <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Control de cambios en
tiempo de ejecución</a>, tu actividad puede administrar el cambio de configuración por sí misma, o
puede permitir que el sistema destruya la actividad y la vuelva a crear con las nuevas
dimensiones.
</p>
<p>
Si el usuario cambia el tamaño de una ventana y la agranda en cualquier dirección, el
sistema modifica el tamaño de la actividad para que coincida con la acción del usuario y emite <a href="{@docRoot}guide/topics/resources/runtime-changes.html">cambios en tiempo de ejecución</a>
según sean necesarios. Si la aplicación se retrasa en el trazado de áreas recientemente expuestas, el
sistema rellena esas áreas con el color especificado por el atributo {@link
android.R.attr#windowBackground windowBackground} o por el atributo de estilo predeterminado
<code>windowBackgroundFallback</code>.
</p>
<h2 id="configuring">Configuración de tu aplicación para el modo de ventanas múltiples</h2>
<p>
Si tu aplicación está orientada a Android N, puedes configurar cómo y
si quieres que las actividades de tu aplicación admitan la visualización de ventanas múltiples. Puedes establecer
atributos en tu manifiesto para controlar el tamaño y el diseño.
La configuración de atributos de una actividad raíz aplica a todas las actividades
de su pila de tareas.
</p>
<p class="note">
<strong>Nota:</strong> Si compilas una aplicación con múltiples orientaciones con una versión del
SDK anterior a Android N, y el usuario usa la aplicación en
modo de ventanas múltiples, el sistema cambia el tamaño de la aplicación de forma forzada. El sistema presenta un
cuadro de diálogo en el que se advierte al usuario que la aplicación puede comportarse de forma inesperada. El sistema
<em>no</em> modifica el tamaño de aplicaciones con orientación fija; si
el usuario intenta abrir una aplicación con orientación fija en modo de ventanas múltiples,
la aplicación ocupará toda la pantalla.
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
Establece este atributo en el nodo <code>&lt;activity&gt;</code> o
<code>&lt;application&gt;</code> de tu manifiesto para habilitar o deshabilitar la visualización
en modo de ventanas múltiples:
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
Si este atributo se establece en true, la actividad puede iniciarse en
los modos de pantalla dividida y forma libre. Si el atributo se establece en false, la
actividad no admite el modo de ventanas múltiples. Si el valor es false, y el
usuario intenta iniciar la actividad en modo de ventanas múltiples, la actividad ocupará
toda la pantalla.
</p>
<p>
Si tu aplicación está orientada a Android N, pero no especificas un valor
para este atributo, el valor predeterminado del atributo será true.
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
Establece este atributo en el nodo <code>&lt;activity&gt;</code> de tu manifiesto
para indicar si la actividad admite la visualización de imagen en imagen. Este
atributo se ignora si <code>android:resizeableActivity</code> es false.
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">Atributos de diseño</h3>
<p>
Con Android N, el elemento de manifiesto <code>&lt;layout&gt;</code>
admite varios atributos que afectan cómo se comporta una actividad en
modo de ventanas múltiples:
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
Ancho predeterminado de la actividad cuando se inicia en modo de forma libre.
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
Altura predeterminada de la actividad cuando se inicia en modo de forma libre.
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
Ubicación inicial de la actividad cuando se inicia en modo de forma libre. Consulta la referencia
{@link android.view.Gravity} para obtener valores adecuados.
</dd>
<dt>
<code>android:minimalSize</code>
</dt>
<dd>
Altura y ancho mínimos para la actividad tanto en el modo de pantalla dividida como en el
modo de forma libre. Si el usuario mueve la línea divisoria en el modo de pantalla dividida
para reducir el tamaño respecto del tamaño mínimo especificado, el sistema recorta
la actividad para ajustarla a los requisitos del usuario.
</dd>
</dl>
<p>
Por ejemplo, el siguiente código muestra cómo especificar el tamaño
y la ubicación predeterminados de una actividad, y su tamaño mínimo, cuando la actividad se visualiza en
modo de forma libre:
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalSize="450dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">Ejecución de tu aplicación en modo de ventanas múltiples</h2>
<p>
Android N ofrece nuevas funcionalidades para admitir aplicaciones que puedan ejecutarse
en modo de ventanas múltiples.
</p>
<h3 id="disabled-features">Funciones deshabilitadas en modo de ventanas múltiples</h3>
<p>
Ciertas funciones están deshabilitadas o se ignoran cuando un dispositivo se encuentra en modo de
ventanas múltiples, ya que no resultan útiles para una actividad que podría estar compartiendo la
pantalla del dispositivo con otras actividades o aplicaciones. Esas funciones incluyen las siguientes:
<ul>
<li>Algunas opciones de personalización de la <a href="{@docRoot}training/system-ui/index.html">IU del sistema</a>
están deshabilitadas; por ejemplo, las aplicaciones no pueden ocultar la barra de
estado si no se están ejecutando en modo de pantalla completa.
</li>
<li>El sistema ignora los cambios en el atributo <code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code>.
</li>
</ul>
<h3 id="change-notification">Notificación y consulta de cambios en modo de ventanas múltiples</h3>
<p>
Se agregaron los siguientes métodos nuevos a la clase {@link android.app.Activity}
para admitir la visualización de ventanas múltiples. Para obtener información detallada sobre cada método, consulta la
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia del N Preview SDK</a>.
</p>
<dl>
<dt>
<code>Activity.inMultiWindow()</code>
</dt>
<dd>
Realiza una llamada para averiguar si la actividad está en modo de ventanas múltiples.
</dd>
<dt>
<code>Activity.inPictureInPicture()</code>
</dt>
<dd>
Realiza una llamada para averiguar si la actividad está en modo de imagen en imagen.
<p class="note">
<strong>Nota:</strong> El modo de Picture-in-Picture es un caso especial del
modo de ventanas múltiples. Si <code>myActivity.inPictureInPicture()</code>
devuelve true, <code>myActivity.inMultiWindow()</code> también devuelve
true.
</p>
</dd>
<dt>
<code>Activity.onMultiWindowChanged()</code>
</dt>
<dd>
El sistema llama a este método siempre que la actividad entra en modo de ventanas
múltiples o sale de él. El sistema le pasa al método un valor de true si la
actividad entra en modo de ventanas múltiples, y false si la actividad
sale del modo de ventanas múltiples.
</dd>
<dt>
<code>Activity.onPictureInPictureChanged()</code>
</dt>
<dd>
El sistema llama a este método siempre que la actividad entre en modo de imagen en imagen
o sale de él. El sistema le pasa al método un valor de true si
la actividad entra en modo de imagen en imagen, y false si la actividad
sale del modo de imagen en imagen.
</dd>
</dl>
<p>
También hay versiones {@link android.app.Fragment} de cada uno de esos
métodos; por ejemplo, <code>Fragment.inMultiWindow()</code>.
</p>
<h3 id="entering-pip">Cómo entrar en modo de imagen en imagen</h3>
<p>
Para que una actividad entre en modo de imagen en imagen, debes llamar al nuevo método
<code>Activity.enterPictureInPicture()</code>. Este método no tiene efecto si
el dispositivo no admite el modo de imagen en imagen. Para obtener más información,
consulta la documentación de <a href="picture-in-picture.html">Picture-in-Picture</a>.
</p>
<h3 id="launch">Inicia nuevas actividades en modo de ventanas múltiples</h3>
<p>
Cuando inicias una nueva actividad, puedes indicarle al sistema que la nueva
actividad se debe mostrar adyacente a la actual, si fuera posible. Para hacer
esto, usa el marcador
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>. Pasar
este marcador requiere el siguiente comportamiento:
</p>
<ul>
<li>Si el dispositivo está en modo de pantalla dividida, el sistema intenta crear la
nueva actividad junto a la actividad que lo inició, de modo que las dos actividades
compartan la pantalla. No se garantiza que el sistema pueda hacerlo, pero
ubicará las actividades de forma adyacente si fuera posible.
</li>
<li>Si el dispositivo no está en modo de pantalla dividida, este marcador no tendrá efecto.
</li>
</ul>
<p>
Si un dispositivo está en modo de forma libre e inicias una nueva actividad, puedes
especificar las dimensiones y la ubicación de la pantalla de la nueva actividad al llamar a
<code>ActivityOptions.setLaunchBounds()</code>. Este método no tiene efecto si
el dispositivo no está en modo de ventanas múltiples.
</p>
<p class="note">
<strong>Nota:</strong> Si inicias una actividad en una pila de tareas, esa
actividad reemplaza la actividad en pantalla y hereda todas sus
propiedades de ventanas múltiples. Si quieres iniciar la nueva actividad en una ventana
independiente en modo de ventanas múltiples, debes iniciarla en una nueva pila de tareas.
</p>
<h3 id="dnd">Admisión de la funcionalidad de arrastrar y soltar</h3>
<p>
Los usuarios pueden <a href="{@docRoot}guide/topics/ui/drag-drop.html">arrastrar y
soltar</a> datos de una actividad a otra mientras las dos actividades
comparten la pantalla. (Antes, los usuarios solo podían arrastrar y soltar datos dentro de una
sola actividad). Por este motivo, te recomendamos que agregues la funcionalidad de arrastrar y
soltar a tu aplicación si es que aún no la admite.
</p>
<p>
El N Preview SDK amplía el paquete <a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a>
para admitir la funcionalidad de arrastrar y soltar entre aplicaciones diferentes. Para obtener información detallada sobre las siguientes
clase y métodos, consulta la <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia
del N Preview SDK</a>.
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
Objeto token responsable de especificar los permisos otorgados a la aplicación
que recibe datos mediante la funcionalidad de arrastrar y soltar.
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
Nuevo alias para {@link android.view.View#startDrag View.startDrag()}. Para
habilitar la funcionalidad arrastrar y soltar entre diferentes actividades, pasa el nuevo marcador
<code>View.DRAG_FLAG_GLOBAL</code>. Si necesitas otorgar permisos de URI a
la actividad receptora, pasa los nuevos marcadores
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> o
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code>, según corresponda.
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
Cancela una operación de arrastrar actualmente en curso. Solo puede ser llamado por la
aplicación que originó la operación de arrastrar.
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
Reemplaza la sombra del arrastre por una operación de arrastrar actualmente en curso. Solo
puede ser llamado por la aplicación que originó la operación de arrastrar.
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
Solicita los permisos para los URI de contenido que se pasan con el {@link
android.content.ClipData} incluido en un {@link android.view.DragEvent}.
</dd>
</dl>
<h2 id="testing">Prueba de la compatibilidad de tu aplicación con el uso de ventanas múltiples</h2>
<p>
Ya sea que actualices o no tu aplicación para Android N, debes
verificar la forma en que se comporta en modo de ventanas múltiples en caso de que un usuario intente iniciarla
en modo de ventanas múltiples en un dispositivo con Android N.
</p>
<h3 id="configuring">Configuración de un dispositivo de prueba</h3>
<p>
Si instalas Android N en un dispositivo, se admite automáticamente el modo
de pantalla dividida.
</p>
<h3 id="test-non-n">Si tu aplicación no se compiló con el N Preview SDK</h3>
<p>
Si no creaste tu aplicación con el N Preview SDK y el usuario intenta usar
la aplicación en modo de ventanas múltiples, el sistema cambia el tamaño de la aplicación de forma forzada, a menos que la aplicación
declare una orientación fija.
</p>
<p>
Si tu aplicación no declara una orientación fija, debes iniciar tu aplicación
en un dispositivo con Android N e intentar colocar la aplicación en
modo de pantalla dividida. Cuando se modifique el tamaño de la aplicación de forma forzada,
comprueba que la experiencia de usuario sea aceptable.
</p>
<p>
Si la aplicación declara una orientación fija, debes intentar colocar la aplicación en
modo de ventanas múltiples. Cuando lo hagas, verifica que la aplicación
continúe en modo de pantalla completa.
</p>
<h3 id="test-mw">Si admites el modo de ventanas múltiples</h3>
<p>
Si compilaste tu aplicación con el N Preview SDK y no deshabilitaste
la compatibilidad con ventanas múltiples, verifica el siguiente comportamiento tanto en modo de pantalla dividida
como en modo de forma libre.
</p>
<ul>
<li>Inicia la aplicación en modo de pantalla completa y luego cambia al modo de ventanas múltiples al presionar
durante un momento el botón Overview. Verifica que la aplicación pase de un modo a otro correctamente.
</li>
<li>Inicia la aplicación directamente en modo de ventanas múltiples y comprueba que se
inicie correctamente. Puedes iniciar una aplicación en modo de ventanas múltiples al presionar el
botón Overview, luego presionar durante un momento la barra de título de la aplicación y arrastrarla
a una de las áreas resaltadas de la pantalla.
</li>
<li>Cambia el tamaño de tu aplicación en modo de pantalla dividida al arrastrar la línea divisoria.
Comprueba que la aplicación cambie de tamaño sin fallar y que estén visibles los elementos
necesarios de la IU.
</li>
<li>Si especificaste dimensiones mínimas para tu aplicación, intenta cambiar el tamaño
de la aplicación a dimensiones más bajas que las especificadas. Comprueba que no puedas modificar el tamaño de la aplicación
para que sea más pequeña que la dimensión mínima especificada.
</li>
<li>En todas las pruebas, verifica que el rendimiento de la aplicación sea aceptable. Por
ejemplo, verifica que la actualización de la IU después de cambiar el tamaño de la aplicación
no demore mucho.
</li>
</ul>
<h4 id="test-checklist">Lista de comprobación de pruebas</h4>
<p>
Para verificar el rendimiento de tu aplicación en modo de ventanas múltiples, intenta las siguientes
operaciones. Debes probar estas operaciones tanto en modo de pantalla dividida como en
modo de ventanas múltiples, excepto cuando se indique algo diferente.
</p>
<ul>
<li>Ingresa en modo de ventanas múltiples y luego sal.
</li>
<li>Pasa de tu aplicación a otra y verifica que la aplicación se comporte
correctamente mientras esté visible pero no activa. Por ejemplo, si tu aplicación está
reproduciendo video, comprueba que el video se siga reproduciendo mientras el usuario interactúe
con otra aplicación.
</li>
<li>En modo de pantalla dividida, prueba mover la barra divisora para agrandar y
achicar la aplicación. Realiza estas operaciones en las configuraciones una al lado de la otra y
una encima de la otra. Comprueba que la aplicación no falle,
que las funcionalidades necesarias estén visibles y que la operación de cambio de tamaño no demore
mucho.
</li>
<li>Realiza varias operaciones de cambio de tamaño en una sucesión rápida. Comprueba que tu
aplicación no falle ni pierda memoria. Para obtener información acerca de cómo comprobar el uso de memoria
de tu aplicación, consulta <a href="{@docRoot}tools/debugging/debugging-memory.html">
Averiguación del uso de RAM</a>.
</li>
<li>Usa tu aplicación normalmente en diferentes configuraciones de ventanas y
verifica que la aplicación se comporte correctamente. Comprueba que el texto sea legible y que
los elementos de la IU sean lo suficientemente grandes para interactuar con ellos.
</li>
</ul>
<h3 id="test-disabled-mw">Si deshabilitaste la compatibilidad con el modo de ventanas múltiples</h3>
<p>
Si deshabilitaste la compatibilidad con el modo de ventanas múltiples al configurar
<code>android:resizableActivity="false"</code>, debes iniciar tu aplicación en
un dispositivo con Android N e intentar colocar la aplicación en los
modos de forma libre y pantalla dividida. Cuando lo hagas, verifica que la aplicación
continúe en modo de pantalla completa.
</p>

View File

@@ -0,0 +1,214 @@
page.title=Idioma y configuración regional
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento:</h2>
<ol>
<li><a href="#preN">Desafíos para la resolución de recursos de idioma</a></li>
<li><a href="#postN">Mejoras de la estrategia de resolución de recursos</a></li>
<li><a href="#design">Diseño de la aplicación para permitir configuraciones regionales
adicionales</a></li>
</ol>
</div>
</div>
<p>Android N brinda un soporte mejorado para los usuarios de diferentes idiomas
y les permite seleccionar múltiples configuraciones regionales en la configuración. Android N
brinda esta capacidad expandiendo ampliamente la cantidad de configuraciones regionales compatibles
y cambiando la forma en que el sistema resuelve los recursos. El nuevo método de resolución
de recursos es más robusto y está diseñado para ser compatible con APK existentes, pero
debes tener especial cuidado para detectar cualquier comportamiento inesperado. Por ejemplo, debes
realizar pruebas para asegurarte de que tu aplicación muestre el idioma esperado de forma predeterminada. Además,
si tu aplicación permite múltiples idiomas, debes asegurarte de que esta compatibilidad funcione
como debería. Por último, debes tratar de asegurarte de que tu aplicación administre con facilidad
los idiomas para los cuales no diseñaste explícitamente la aplicación.</p>
<p>Al inicio de este documento, encontrarás una explicación sobre la estrategia de resolución de recursos anterior a
Android N. Luego, encontrarás una descripción de la estrategia de resolución de recursos
mejorada de Android N. Por último, encontrarás una explicación sobre cómo aprovechar
la cantidad expandida de configuraciones regionales para permitir acceso a más usuarios de diferentes idiomas.</p>
<h2 id="preN">Desafíos para la resolución de recursos de idioma</h2>
<p>Antes de Android N, Android no siempre podía
hacer coincidir correctamente las configuraciones regionales de la aplicación y del sistema. Por ejemplo, supongamos que el idioma predeterminado
de tu aplicación es inglés de EE. UU., pero que también tiene cadenas en español localizadas en archivos de recursos {@code es_ES}.
</p>
<p>Cuando el código Java se refería a las cadenas, resolvía el idioma de las cadenas como
se muestra a continuación:</p>
<ul>
<li>Si un dispositivo estaba configurado en {@code es_MX} (español de México), Android cargaba
las cadenas de los archivos de recursos {@code es_ES}.</li>
<li>Si el dispositivo estaba configurado en {@code en_AU}, Android recurría a {@code
en_US}. El sistema también usaba {@code en_US} de forma predeterminada si el usuario elegía un
idioma que no era compatible con la aplicación, como el francés.</li>
</ul>
<p>Estos problemas de resolución surgieron debido a que el sistema quitaba el código de país
de la configuración regional si no podía encontrar una coincidencia exacta. Por ejemplo:</p>
<p class="table-caption" id="t-resource-res">
<strong>Tabla 1.</strong> Resolución de recursos sin una coincidencia de configuración regional exacta.
</p>
<table>
<tbody>
<tr>
<th>Configuración del usuario</th>
<th>Recursos de la aplicación</th>
<th>Resolución de recursos</th>
</tr>
<tr>
<td>fr_CH</td>
<td>
Predeterminado (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Intentar fr_CH =&gt; Error<br>
Intentar fr =&gt; Error<br>
Usar predeterminado (en)
</td>
</tr>
</tbody>
</table>
<p>En este ejemplo, el sistema muestra las cadenas en inglés sin
saber si el usuario comprende este idioma. Este comportamiento es muy común
hoy en día. Android N debería reducir sustancialmente la frecuencia
de resultados como este.</p>
<h2 id="postN">Mejoras de la estrategia de resolución de recursos</h2>
<p>Android N brinda una resolución de recursos más robusta y
encuentra mejores recursos de forma automática. Sin embargo, para acelerar la resolución y mejorar la
facilidad de mantenimiento, debes almacenar los recursos en el dialecto primario.
Por ejemplo, si antes almacenabas los recursos en español en el directorio {@code es-US}
, pásalos al directorio {@code es-419}, que contiene la variante de Latinoamérica.
De forma similar, si tienes cadenas de recursos en una carpeta llamada {@code en-GB}, cámbiale
el nombre a {@code en-001} (inglés internacional), ya que el dialecto primario más común
para las cadenas en <code>en-GB</code> es {@code en-001}.
Los siguientes ejemplos explican por qué estas prácticas mejoran el desempeño
y la confiabilidad de la resolución de recursos.</p>
<h3>Ejemplos de resolución de recursos</h3>
<p>Con Android N, el caso descrito en la <strong>Tabla 1</strong> se resuelve
de otra forma:</p>
<p class="table-caption" id="t-improved-res">
<strong>Tabla 2.</strong> Una estrategia de resolución mejorada para los casos en que no
hay una coincidencia de configuración regional exacta.</p>
<table>
<tr>
<th>Configuración del usuario</th>
<th>Recursos de la aplicación</th>
<th>Resolución de recursos</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
Predeterminado (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Intentar fr_CH =&gt; Error<br>
Intentar fr =&gt; Error<br>
Intentar secundario de fr =&gt; fr_FR<br>
Usar fr_FR
</td>
</tr>
</table>
<p>Así, los recursos se muestran en francés en lugar de en inglés. Este ejemplo también muestra
por qué deberías almacenar las cadenas en francés en {@code fr} en lugar de en {@code fr_FR}
para Android N. Aquí, el procedimiento se basa en hacer coincidir el dialecto primario más cercano,
lo cual hace que la resolución sea más rápida y más predecible.</p>
<p>Además de esta lógica de resolución mejorada, Android ofrece ahora más
idiomas de usuario de entre los cuales elegir. Volvamos a ver el ejemplo anterior con el idioma italiano
especificado como un idioma de usuario adicional, pero sin compatibilidad de la aplicación con el idioma francés. </p>
<p class="table-caption" id="t-2d-choice">
<strong>Tabla 3.</strong> Resolución de recursos cuando la aplicación solo hace coincidir la
configuración regional de segunda preferencia del usuario.</p>
<table>
<tr>
<th>Configuración del usuario</th>
<th>Recursos de la aplicación</th>
<th>Resolución de recursos</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
<li> it_CH</li>
</ol>
</td>
<td>
Predeterminado (en)<br>
de_DE<br>
es_ES<br>
it_IT<br>
</td>
<td>
Intentar fr_CH =&gt; Error<br>
Intentar fr =&gt; Error<br>
Intentar secundario de fr =&gt; Error<br>
Intentar it_CH =&gt; Error<br>
Intentar it =&gt; Error<br>
Intentar secundario de it =&gt; it_IT<br>
Usar it_IT
</td>
</tr>
</table>
<p>El usuario recibe la información en un idioma que comprende, si bien la aplicación no
es compatible con el idioma francés.</p>
<h2 id="design">Diseño de la aplicación para permitir configuraciones regionales adicionales</h2>
<h3>API LocaleList</h3>
<p>Android N incorpora una nueva API, {@code LocaleList.GetDefault()},
que les permite a las aplicaciones consultar directamente la lista de idiomas que ha especificado el usuario. Esta API
te permite crear un comportamiento de la aplicación
más sofisticado y una presentación de contenido más optimizada. Por ejemplo, las búsquedas
pueden mostrar resultados en múltiples idiomas según la configuración del usuario. Las aplicaciones de navegadores
pueden evitar ofrecer la traducción de páginas que están en un idioma que el usuario comprende,
y las aplicaciones de teclado pueden habilitar automáticamente todos los diseños correctos. </p>
<h3>Formateadores</h3>
<p>Hasta Android 6.0 (API nivel 23), Android solo permitía una o dos
configuraciones regionales para muchos idiomas comunes
(en, es, ar, fr, ru). Debido a que había solo unas pocas variantes para cada idioma,
las aplicaciones podían almacenar algunos números y fechas como cadenas preprogramadas
en los archivos de recursos. Sin embargo, con el conjunto ampliado de configuraciones regionales
compatibles de Android, puede haber diferencias importantes
en los formatos de fecha, hora, moneda e
información similar, incluso dentro de una sola configuración regional. Preprogramar los formatos puede generar
una experiencia confusa para los usuarios. Por lo tanto, cuando desarrolles aplicaciones para Android,
asegúrate de usar formateadores en lugar de preprogramar las cadenas de números y fechas.</p>
<p>Un muy buen ejemplo es el árabe. Android N expandió su compatibilidad de
una configuración regional, {@code ar_EG}, a 27 configuraciones regionales. Estas configuraciones regionales pueden compartir la mayoría de los recursos,
pero algunas prefieren dígitos ASCII, mientras que otras prefieren dígitos nativos. Por ejemplo,
cuando desees crear una oración con una variable de dígito, como
"Elige un PIN de 4 dígitos", usa formateadores como se muestra a continuación:</p>
<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>

View File

@@ -0,0 +1,328 @@
page.title=Notificaciones
page.tags=notifications
helpoutsWidget=true
page.image=/preview/images/notifications-card.png
trainingnavtop=true
@jd:body
<div id="qv-wrapper">
<div id="qv">
<!-- table of contents -->
<h2>Este documento incluye lo siguiente:</h2>
<ol>
<li><a href="#direct">Respuesta directa</a></li>
<li><a href="#bundle">Notificaciones integradas</a></li>
<li><a href="#custom">Vistas personalizadas</a></li>
</ol>
</div>
</div>
<p>Android N incluye varias API nuevas que permiten a las aplicaciones publicar
notificaciones altamente visibles e interactivas.</p>
<p>Android N amplía la API de notificación existente {@link android.support.v4.app.RemoteInput}
para admitir respuestas en línea en teléfonos celulares. Esta función permite a los usuarios
responder rápidamente desde el panel de notificaciones sin tener que visitar tu aplicación.</p>
<p>
Android N también te permite agrupar notificaciones similares para que
aparezcan como una sola notificación. Para que esto sea posible, Android N usa el método existente {@link
android.support.v4.app.NotificationCompat.Builder#setGroup
NotificationCompat.Builder.setGroup()}. Los usuarios pueden expandir cada una de las
notificaciones y realizar acciones como responder e ignorar en cada una
de ellas, de forma individual desde el panel de notificaciones.
</p>
<p>Por último, Android N también suma nuevas API que te permiten aprovechar las decoraciones
del sistema en las vistas de notificación personalizadas de tu aplicación. Estas API ayudan a
garantizar que las vistas de notificaciones compartan una presentación acorde a las
plantillas estándar.</p>
<p>En este documento se destacan algunos de los cambios clave que puedes tener en cuenta
al usar las nuevas funciones de notificación en tus aplicaciones.</p>
<h2 id="direct">Respuesta directa</h2>
<p>Con la función de respuesta directa en Android N, los usuarios pueden responder
rápidamente mensajes de texto o actualizar listas de tareas directamente dentro de la interfaz de
notificación. En un dispositivo portátil, la acción de respuesta en línea aparece como un botón adicional
anexado a la notificación. Cuando un usuario responde mediante un teclado, el sistema adjunta
la respuesta de texto a la intención
que especificaste para la acción de notificación y envía la intención a tu
aplicación para dispositivos portátiles.
<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
{@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
<p class="img-caption">
<strong>Figura 1.</strong> Android N agrega el botón de acción <strong>Reply</strong>
.
</p>
<h3>Adición de acciones de respuesta en línea</h3>
<p>Para crear una acción de notificación que admita respuesta directa:
</p>
<ol>
<li>Crea una instancia de {@link android.support.v4.app.RemoteInput.Builder}
que puedas agregar a tu acción de
notificación. El constructor de esta clase acepta una cadena que el sistema usa como clave
para la inserción de texto. Luego, tu aplicación para dispositivos portátiles usará esa clave para recuperar el texto
de la entrada.
<pre>
// Key for the string that's delivered in the action's intent
private static final String KEY_TEXT_REPLY = "key_text_reply";
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
</pre>
</li>
<li>Adjunta el objeto {@link android.support.v4.app.RemoteInput}
a una acción usando <code>addRemoteInput()</code>.
<pre>
// Create the reply action and add the remote input
Notification.Action action =
new Notification.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
.build();
</pre>
</li>
<li>Aplica la acción a una notificación y emite la notificación.
<pre>
// Build the notification and add the action
Notification notification =
new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.content))
.addAction(action))
.build();
// Issue the notification
NotificationManager notificationManager =
NotificationManager.from(mContext);
notificationManager.notify(notificationId, notification);
</pre>
</li>
</ol>
<p> Cuando se active la acción de notificación,
el sistema le solicitará al usuario que ingrese una respuesta. </p>
<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
{@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
<p class="img-caption">
<strong>Figura 2.</strong> El usuario ingresa texto desde el panel de notificaciones.
</p>
<h3>Recuperación de entradas del usuario de la respuesta directa</h3>
<p>Para recibir entradas del usuario de la interfaz de notificación a la actividad que
declaraste en la intención de la acción de respuesta:</p>
<ol>
<li> Llama a {@link android.support.v4.app.RemoteInput#getResultsFromIntent
getResultsFromIntent()} pasando la intención de la acción de notificación como
el parámetro de entrada. Este método devuelve un {@link android.os.Bundle} que
contiene la respuesta de texto.
</li>
<pre>
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
</pre>
<li>Consulta el paquete con la clave de resultado (proporcionada al constructor {@link
android.support.v4.app.RemoteInput.Builder}).
</li>
</ol>
<p>El siguiente fragmento de código ilustra cómo un método recupera el texto de entrada
de un paquete:</p>
<pre>
// Obtain the intent that started this activity by calling
// Activity.getIntent() and pass it into this method to
// get the associated string.
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
return null;
}
</pre>
<p>Las aplicaciones pueden aplicar lógica para decir qué medidas tomar con respecto al texto
recuperado.
Para las aplicaciones interactivas (como los chats), proporciona más contexto sobre la notificación
(por ejemplo, varias líneas de historial de chat, incluidos los mensajes del usuario)
de modo que el usuario pueda responder correctamente.
Cuando el usuario responda a través de {@link android.support.v4.app.RemoteInput},
incluye el texto del historial de respuestas con el método {@code setRemoteInputHistory()}
.</p>
<h2 id="bundle">Notificaciones integradas</h2>
<p>Android N ofrece a los desarrolladores una nueva manera de representar
una cola de notificaciones: <i>notificaciones integradas</i>. Esto es similar a la función
<a href="{@docRoot}training/wearables/notifications/stacks.html">Pilas de
notificaciones</a> en Android Wear. Por ejemplo, si tu aplicación crea notificaciones
para los mensajes recibidos, cuando se recibe más de un mensaje, agrupa las
notificaciones en un solo paquete. Puedes
usar el método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup
Builder.setGroup()} para agrupar notificaciones similares.</p>
<p>
El grupo de notificaciones impone una jerarquía en las notificaciones que lo integran.
En la parte superior de esa jerarquía se encuentra una notificación principal que muestra información
resumida para el grupo. El usuario puede expandir
progresivamente el grupo de notificaciones, y el sistema muestra más información a medida que el
usuario continúa indagando. Cuando el usuario expande el paquete, el sistema revela más
información para todas sus notificaciones secundarias; cuando el usuario
expande una de esas notificaciones, el sistema revela todo su contenido.
</p>
<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
{@docRoot}preview/images/bundles_2x.png 2x" width="300">
<p class="img-caption">
<strong>Figura 3.</strong> El usuario puede expandir progresivamente el grupo de
notificaciones.
</p>
<p>Para obtener información acerca de cómo agregar notificaciones a un grupo, consulta
<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Agregar
cada notificación a un grupo</a>.</p>
<h3 id="best-practices">Prácticas recomendadas para las notificaciones integradas</h3>
<p>Esta sección proporciona pautas acerca de cuándo usar grupos de notificaciones en lugar
de las notificaciones {@link android.app.Notification.InboxStyle InboxStyle}
que estaban disponibles en versiones anteriores de la
plataforma Android.</p>
<h3>Cuándo usar notificaciones integradas</h3>
<p>Solo debes usar grupos de notificaciones si se cumplen todas las siguientes condiciones
para tu caso de uso:</p>
<ul>
<li>Las notificaciones secundarias son notificaciones completas y se pueden mostrar
individualmente sin la necesidad de un resumen del grupo.</li>
<li>El aislamiento de notificaciones secundarias de forma individual tiene un beneficio. Por
ejemplo:
</li>
<ul>
<li>Son interactivas, con acciones específicas para cada notificación secundaria.</li>
<li>Hay más información sobre la notificación secundaria que el usuario quiere leer.</li>
</ul>
</ul>
<p>Algunos ejemplos de buenos casos de uso para grupos de notificaciones incluyen: una aplicación de mensajería
que exhiba una lista de mensajes entrantes, o una aplicación de correo electrónico que exhiba una lista de
correos electrónicos recibidos.</p>
<p>
Algunos ejemplos de casos en los que se prefiere una sola notificación
incluyen mensajes individuales de una sola persona, o una lista de
elementos de texto de una sola línea. Para lograr esto, puedes usar
({@link android.app.Notification.InboxStyle InboxStyle} o
{@link android.app.Notification.BigTextStyle BigTextStyle})
.
</p>
<h3 id ="post">Visualización de notificaciones integradas</h3>
<p>
La aplicación siempre debe publicar un resumen del grupo, aún si el grupo contiene una sola
notificación secundaria. Si contiene una sola notificación, el sistema suprimirá el resumen y mostrará directamente la
notificación secundaria. Esto garantiza
que el sistema pueda proporcionar una experiencia uniforme cuando el usuario quita con un gesto de "deslizar" notificaciones
secundarias de un grupo.
</p>
<p class="note">
<strong>Nota:</strong> Esta versión de Android N aún no
suprime el resumen para los grupos de notificaciones que contienen una sola notificación secundaria. Esta
funcionalidad se agregará en una versión posterior de Android N.
</p>
<h3>Inspección de notificaciones</h3>
<p>Si bien el sistema generalmente muestra las notificaciones secundarias como un grupo, puedes configurarlas
para que aparezcan temporalmente como
<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">
notificaciones emergentes</a>. Esta función es especialmente útil porque permite
el acceso inmediato a la notificación secundaria más reciente y a las acciones asociadas a ella.
</p>
<h3>Compatibilidad con versiones anteriores</h3>
<p>
Tanto los grupos de notificaciones como las entradas remotas han formado parte de la API {@link
android.app.Notification} desde Android 5.0 (API nivel 21) para soportar dispositivos
con Android Wear. Si ya compilaste notificaciones con esas API,
lo único que debes hacer es verificar que el comportamiento de la aplicación concuerde
las pautas antes descritas y considerar la implementación de {@code
setRemoteInputHistory()}.
</p>
<p>
Para poder ser compatible con versiones anteriores, están disponibles las mismas API con
la clase {@link android.support.v4.app.NotificationCompat}
de la biblioteca de soporte, que te permite crear notificaciones que funcionan en versiones de Android
anteriores. En dispositivos portátiles y tablets, los usuarios solo ven la notificación de resumen
de modo que una aplicación aún debe tener un estilo de bandeja de entrada o una notificación equivalente
que represente todo el contenido del grupo. Dado que los dispositivos con Android
Wear permiten a los usuarios ver todas las notificaciones secundarias incluso en
niveles anteriores de la plataforma, debes crear notificaciones secundarias independientemente del nivel de
API.
</p>
<h2 id="custom"> Vistas personalizadas</h2>
<p>A partir de la versión Android N, puedes personalizar vistas de notificaciones y
aún obtener decoraciones del sistema, como encabezados de notificaciones, acciones y diseños
expandibles.</p>
<p>Para habilitar esta característica, Android N suma las siguientes API para que puedas diseñar tu
vista personalizada:</p>
<dl>
<dt>
{@code DecoratedCustomViewStyle()}</dt>
<dd> Permite diseñar notificaciones que no sean notificaciones
de medios.</dd>
<dt>
{@code DecoratedMediaCustomViewStyle()}</dt>
<dd> Permite diseñar notificaciones de medios.</dd>
</dl>
<p>Para usar esta nueva API, llama al método {@code setStyle()} y pásale
el estilo de la vista personalizada que hayas elegido.</p>
<p>Este fragmento muestra cómo crear un objeto de notificación personalizada con el método
{@code DecoratedCustomViewStyle()}.</p>
<pre>
Notification noti = new Notification.Builder()
.setSmallIcon(R.drawable.ic_stat_player)
.setLargeIcon(albumArtBitmap))
.setCustomContentView(contentView);
.setStyle(new Notification.DecoratedCustomViewStyle())
.build();
</pre>

View File

@@ -0,0 +1,186 @@
page.title=Picture-in-picture
page.keywords=preview,sdk,PIP,Picture-in-picture
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento</h2>
<ol>
<li><a href="#declaring">Declarar que la actividad permite
el modo Picture-in-Picture</a></li>
<li><a href="#pip_button">Cambiar la actividad al modo picture-in-picture</a>
</li>
<li><a href="#handling_ui">Gestionar las IU durante el modo picture-in-picture</a>
</li>
<li><a href="#continuing_playback">Continuar la reproducción de video durante
el modo picture-in-picture</a></li>
<li><a href="#best">Prácticas recomendadas</a></li>
</ol>
<h2>Consulta también</h2>
<ol>
<li><a href="{@docRoot}preview/features/multi-window.html">Compatibilidad con
ventanas múltiples</a></li>
</ol>
</div>
</div>
<p>Con Android N, los usuarios de Android TV ahora pueden ver un video
en una ventana fija que se ubica en una esquina de la pantalla mientras navegan dentro de
aplicaciones. El modo picture-in-picture (PIP) permite que las aplicaciones reproduzcan un video
en una ventana fija mientras se lleva a cabo otra actividad
en el fondo. La ventana de PIP les permite a los usuarios realizar múltiples tareas mientras usan tu aplicación, lo cual les permite
ser más productivos.</p>
<p>Tu aplicación puede decidir cuándo activar el modo PIP. Aquí te mostramos algunos ejemplos de
situaciones en las que se podría usar el modo PIP:</p>
<ul>
<li>Tu aplicación puede pasar un video al modo PIP cuando el usuario retrocede
en la navegación desde el video para explorar otro contenido.</li>
<li>También puede hacerlo mientras el usuario está viendo el final
de un episodio de contenido. La pantalla principal muestra información promocional
o de resumen sobre el próximo capítulo de la serie.</li>
<li>Tu aplicación puede brindarles a los usuarios una forma de poner en cola otro contenido mientras
miran un video. El video continúa reproduciéndose en modo PIP mientras la pantalla
principal muestra una actividad de selección de contenido.</li>
</ul>
<p>La ventana de PIP es de 240x135 dp y se muestra en la capa delantera en una de las
cuatro esquinas de la pantalla que el sistema elige. El usuario puede acceder a un menú de
PIP que le permite cambiar la ventana de PIP a pantalla completa o cerrarla
presionando el botón <b>Home</b> en el control remoto. Si se comienza a reproducir
otro video en la pantalla principal, la ventana de PIP se cierra
automáticamente. Los usuarios también pueden cerrar la ventana de PIP desde Recents.</p>
<img src="{@docRoot}preview/images/pip-active.png" />
<p class="img-caption"><strong>Imagen 1.</strong> Un video picture-in-picture
visible en una esquina de la pantalla mientras el usuario explora contenido
en la pantalla principal.</p>
<p>El modo PIP aprovecha las API de ventanas múltiples disponibles en Android N para
brindar la ventana superpuesta fija de video. Para agregarle el modo PIP a tu aplicación, debes
registrar las actividades que permitan este modo, cambiar la actividad al modo PIP según
sea necesario y asegurarte de que los elementos de IU se oculten y que la reproducción de video continúe mientras
la actividad se encuentra en modo PIP.</p>
<h2 id="declaring">Declarar que la actividad permite el modo picture-in-picture</h2>
<p>De forma predeterminada, el sistema no permite el modo PIP para aplicaciones automáticamente.
Si deseas permitir este modo en tu aplicaciones, registra la actividad
de video en tu manifiesto configurando
<code>android:supportsPictureInPicture</code> y
<code>android:resizeableActivity</code> en <code>true</code>. Además, debes especificar
que tu actividad gestiona los cambios de configuración de la presentación para que la actividad
no se reinicie cuando ocurran cambios de presentación durante las transiciones en el modo PIP.</p>
<pre>
&lt;activity android:name="VideoActivity"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
</pre>
<p>Cuando registres la actividad, ten en cuenta que, en el modo PIP, la
actividad se muestra en una ventana superpuesta pequeña en una pantalla de TV. Las actividades de reproducción
de videos con IU mínimas brindan la mejor experiencia de usuario. Las actividades que
incluyen elementos de IU pequeños podrían no brindar una buena experiencia de usuario
cuando se cambian al modo PIP, porque los usuarios no podrán ver los detalles de los elementos de IU
en la ventana PIP.</p>
<h2 id="pip_button">Cambiar la actividad al modo picture-in-picture</h2>
Cuando necesites cambiar la actividad al modo PIP, llama a
<code>Activity.enterPictureInPicture()</code>. El siguiente ejemplo cambia
al modo PIP cuando el usuario selecciona un botón PIP especial en una barra
de control de medios:</p>
<pre>
&#64;Override
public void onActionClicked(Action action) {
if (action.getId() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPicture();
return;
}
...
</pre>
<p>Agregar un botón PIP a la barra de control de medios le permite al usuario cambiar
fácilmente al modo PIP y seguir controlando la reproducción de video.</p>
<img src="{@docRoot}preview/images/pip-button.png" />
<p class="img-caption"><strong>Imagen 1.</strong> Un botón
PIP en una barra de control de medios.</p>
<p>Android N incluye una nueva clase
<code>PlaybackControlsRow.PictureInPictureAction</code> que define
las acciones de PIP de la barra de control y usa el ícono PIP.</p>
<h2 id="handling_ui">Gestionar las IU durante el modo picture-in-picture</h2>
<p>Cuando la actividad ingresa al modo PIP, esta solo debería mostrar la reproducción
de video. Debes quitar los elementos de IU antes de que la actividad ingrese al modo PIP
y volver a mostrarlos cuando la actividad vuelva al modo de pantalla completa.
Sobrescribe <code>Activity.onPictureInPictureChanged()</code> o
<code>Fragment.onPictureInPictureChanged()</code> y habilita
o deshabilita los elementos de IU según sea necesario, por ejemplo:</p>
<pre>
&#64;Override
public void onPictureInPictureChanged(boolean inPictureInPicture) {
if (inPictureInPicture) {
// Hide the controls in picture-in-picture mode.
...
} else {
// Restore the playback UI based on the playback status.
...
}
}
</pre>
<h2 id="continuing_playback">Continuar la reproducción de video durante
el modo picture-in-picture</h2>
<p>Cuando la actividad cambia al modo PIP, el sistema considera que se encuentra en
pausa y llama al método <code>onPause()</code> de la actividad. La reproducción
de video no debería pausarse y debería continuar si la actividad se
pausa debido al modo PIP. Busca el modo PIP en el método
<code>onPause()</code> de la actividad y controla la reproducción según corresponda, por
ejemplo:</p>
<pre>
&#64;Override
public void onPause() {
// If called due to PIP, do not pause playback
if (inPictureInPicture()) {
// Continue playback
...
}
// If paused but not in PIP, pause playback if necessary
...
}
</pre>
<p>Cuando la actividad sale del modo PIP y vuelve al modo de pantalla completa, el
sistema reinicia la actividad y llama al método <code>onResume()</code>.</p>
<h2 id="best">Prácticas recomendadas</h2>
<p>El modo PIP está diseñado para actividades que reproducen un video en pantalla completa. Cuando cambies la
actividad al modo PIP, evita que se muestre cualquier elemento que no sea el contenido del video.
Rastrea el cambio a modo PIP de la actividad y oculta los elementos de IU, como se explica
en la sección <a href="#handling_ui">Gestionar las IU durante el modo picture-in-picture</a>.</p>
<p>Debido a que la ventana de PIP se muestra como una ventana flotante en una
esquina de la pantalla, debes evitar mostrar información importante en la pantalla principal
en cualquier área que pueda quedar oculta detrás de la ventana de PIP.</p>
<p>Cuando una actividad se encuentra en modo PIP, de forma predeterminada, no tiene focalización en las entradas. Para
recibir eventos de entradas durante este modo, usa
<code>MediaSession.setMediaButtonReceiver()</code>.</p>

View File

@@ -0,0 +1,124 @@
page.title=Acceso a directorios determinados
page.keywords=preview,sdk,scoped directory access
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento</h2>
<ol>
<li><a href="#accessing">Acceder a un directorio de almacenamiento externo</a></li>
<li><a href="#removable">Acceder a un directorio de un medio extraíble</a></li>
<li><a href="#best">Prácticas recomendadas</a></li>
</ol>
</div>
</div>
<p>Las aplicaciones como las aplicaciones de fotografía generalmente solo necesitan acceso a directorios de
almacenamiento externo, como el directorio <code>Pictures</code>. Los métodos
existentes para acceder a almacenamiento externo no están diseñados para brindar un
acceso fácil a determinados directorios para estos tipos de aplicaciones. Por ejemplo:</p>
<ul>
<li>Solicitar {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
o {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} en tu manifiesto
permite el acceso a todos los directorios públicos de un almacenamiento externo, lo cual podría ser
un acceso mayor que el que necesita tu aplicación.</li>
<li>Usar el
<a href="{@docRoot}guide/topics/providers/document-provider.html">framework
de acceso al almacenamiento</a> generalmente implica que el usuario seleccione directorios
mediante un sistema de IU, lo cual no es necesario si tu aplicación siempre accede al mismo
directorio externo.</li>
</ul>
<p>Android N brinda una API nueva y simplificada para acceder a
directorios de almacenamiento externo comunes. </p>
<h2 id="accessing">Acceder a un directorio de almacenamiento externo</h2>
<p>Usa la clase <code>StorageManager</code> para obtener la instancia de
<code>StorageVolume</code> correcta. Luego, crea una intención llamando al
método <code>StorageVolume.createAccessIntent()</code> de esa instancia.
Usa esta intención para acceder a directorios de almacenamiento externo. Para obtener una lista de
todos los volúmenes disponibles, incluidos los volúmenes de medios extraíbles, usa
<code>StorageManager.getVolumesList()</code>.</p>
<p>El siguiente fragmento de código es un ejemplo de cómo abrir el
directorio <code>Pictures</code> en el almacenamiento compartido principal:</p>
<pre>
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<p>El sistema intenta otorgar acceso al directorio externo y, si
es necesario, confirma el acceso con el usuario usando una IU simplificada:</p>
<img src="{@docRoot}preview/images/scoped-folder-access-framed.png" srcset="{@docRoot}preview/images/scoped-folder-access-framed.png 1x,
{@docRoot}preview/images/scoped-folder-access-framed_2x.png 2x" />
<p class="img-caption"><strong>Imagen 1.</strong> Una aplicación solicitando
acceso al directorio Pictures.</p>
<p>Si el usuario otorga el acceso, el sistema llama a tu
invalidación de <code>onActivityResult()</code> con un código resultante de
<code>Activity.RESULT_OK</code> y datos de intención que contienen el URI. Usa
el URI brindado para acceder a la información del directorio. Es similar a usar URI
generados por el
<a href="{@docRoot}guide/topics/providers/document-provider.html">framework
de acceso al almacenamiento</a>.</p>
<p>Si el usuario no otorga el acceso, el sistema llama a tu
invalidación de <code>onActivityResult()</code> con un código resultante de
<code>Activity.RESULT_CANCELED</code> y datos de intención nulos.</p>
<p class="note"><b>Nota</b>: obtener acceso a un directorio externo específico
también otorga el acceso a los subdirectorios de ese directorio.</p>
<h2 id="removable">Acceder a un directorio de un medio extraíble</h2>
<p>Para usar el acceso a directorios determinados para acceder a directorios de medios extraíbles,
primero debes agregar un {@link android.content.BroadcastReceiver} que escuche la
notificación{@link android.os.Environment#MEDIA_MOUNTED}, por ejemplo:</p>
<pre>
&lt;receiver
android:name=".MediaMountedReceiver"
android:enabled="true"
android:exported="true" &gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MEDIA_MOUNTED" /&gt;
&lt;data android:scheme="file" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>Cuando el usuario conecta un medio extraíble, como una tarjeta SD, el sistema envía una
notificación{@link android.os.Environment#MEDIA_MOUNTED}. Esta notificación
brinda un objeto <code>StorageVolume</code> en los datos de intención que puedes
usar para acceder a directorios del medio extraíble. El siguiente ejemplo
accede al directorio <code>Pictures</code> de medios extraíbles:</p>
<pre>
// BroadcastReceiver has already cached the MEDIA_MOUNTED
// notification Intent in mediaMountedIntent
StorageVolume volume = (StorageVolume)
mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<h2 id="best">Prácticas recomendadas</h2>
<p>Cuando sea posible, sigue usando el URI de acceso a directorios externos de modo que no tengas
que solicitarle acceso al usuario continuamente. Una vez que el usuario haya otorgado el acceso, llama a
<code>getContentResolver().takePersistableUriPermssion()</code> con el
URI de acceso a directorios. El sistema continuará el URI, y las siguientes solicitudes
de acceso generarán <code>RESULT_OK</code> y no le mostrarán una IU de confirmación al
usuario.</p>
<p>Si el usuario deniega el acceso a un directorio externo, no vuelvas a solicitar el
acceso inmediatamente. Hacer esto provocaría una mala experiencia
de usuario.</p>

View File

@@ -0,0 +1,744 @@
page.title=Configuración de seguridad de la red
page.keywords=preview,security,network
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento</h2>
<ol>
<li><a href="#manifest">Agregar un archivo de configuración de seguridad</a></li>
<li><a href="#CustomTrust">Personalizar las CA de confianza</a>
<ol>
<li><a href="#ConfigCustom">Configurar una CA de confianza personalizada</a></li>
<li><a href="#LimitingCas">Limitar el conjunto de CA de confianza</a></li>
<li><a href="#TrustingAdditionalCas">Otorgar confianza a CA adicionales</a></li>
</ol>
</li>
<li><a href="#TrustingDebugCa">CA de solo depuración</a></li>
<li><a href="#UsesCleartextTraffic">Desactivar el tráfico de Cleartext</a></li>
<li><a href="#CertificatePinning">Fijar certificados</a></li>
<li><a href="#ConfigInheritance">Comportamiento de herencia de configuración</a></li>
<li><a href="#FileFormat">Formato del archivo de configuración</a></li>
</ol>
</div>
</div>
<p>
Android N incluye una función de configuración de seguridad de la red
que les permite a las aplicaciones personalizar los ajustes de seguridad de la red mediante un archivo
de configuración declarativo seguro sin que haya que modificar el código de la aplicación. Estos ajustes se pueden
configurar para dominios específicos y para una aplicación específica. Las capacidades
clave de esta función son las siguientes:
</p>
<ul>
<li>
<b>Anclajes de confianza personalizados:</b> personalizar qué autoridades de certificado (CA)
son de confianza para las conexiones de seguridad de una aplicación. Por ejemplo,
confiar en certificados autofirmados particulares
o restringir el conjunto de CA públicas en las que confía la aplicación.
</li>
<li>
<b>Anulaciones de solo depuración:</b> depurar de forma segura conexiones
de una aplicación sin riesgos adicionales para la base instalada.
</li>
<li>
<b>Desactivación del tráfico de Cleartext:</b> proteger a las aplicaciones del
uso accidental de tráfico de Cleartext.
</li>
<li>
<b>Fijación de certificados:</b> restringir la conexión segura de una aplicación
a certificados en particular.
</li>
</ul>
<h2 id="manifest">Agregar un archivo de configuración de seguridad</h2>
<p>
La función de configuración de seguridad de la red usa un archivo XML donde
se especifican los ajustes para la aplicación. Debes incluir una entrada en el manifiesto de tu
aplicación que apunte a este archivo. El siguiente fragmento de código de un manifiesto
demuestra cómo crear esta entrada:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
...
&lt;app ...&gt;
&lt;meta-data android:name="android.security.net.config"
android:resource="@xml/network_security_config" /&gt;
...
&lt;/app&gt;
</pre>
<h2 id="CustomTrust">Personalizar las CA de confianza</h2>
<p>
Una aplicación podría querer otorgar confianza a un conjunto personalizado de CA en lugar de hacerlo según los ajustes
predeterminados de la plataforma. Las razones más comunes son las siguientes:
</p>
<ul>
<li>Conectarse a un host con una autoridad de certificado personalizada (autofirmado,
emitido por una CA corporativa interna, etc.).
</li>
<li>Limitar el conjunto de CA a CA de confianza establecidas por el usuario y no a cada
CA preinstalada.
</li>
<li>Otorgar confianza a CA adicionales que no están incluidas en el sistema
</li>
</ul>
<p>
De forma predeterminada, las conexiones seguras (p. ej.: TLS, HTTP) de todas las aplicaciones dependen de
las CA preinstaladas del sistema; las aplicaciones que tienen como objetivo a la API nivel 23
(Android M) e inferiores también dependen de la tienda de CA agregada por el usuario de forma predeterminada. Una
aplicación puede personalizar sus propias conexiones usando {@code base-config} (para
la personalización de toda la aplicación) o {@code domain-config} (para la personalización
por dominio).
</p>
<h3 id="ConfigCustom">Configurar una CA personalizada</h3>
<p>
Supongamos que deseas conectarte a tu host, el cual usa un certificado SSL
autofirmado, o a un host cuyo certificado SSL está emitido por una CA no pública
en la cual confías, como la CA interna de tu empresa.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
Agrega el certificado de CA autofirmado o no público, en formato PEM o DER, a
{@code res/raw/my_ca}.
</p>
<h3 id="LimitingCas">Limitar el conjunto de CA de confianza</h3>
<p>
Una aplicación que no desee confiar en todas las CA en que confía el sistema puede,
en su lugar, especificar su propio conjunto reducido de CA en las que confía. Esto protege a la aplicación
de certificados fraudulentos emitidos por cualquiera de las demás CA.
</p>
<p>
La configuración para limitar el conjunto de CA de confianza es similar a <a href="#TrustingACustomCa">confiar en una CA personalizada</a> para un dominio específico, con la diferencia
de que se brindan múltiples CA en el recurso.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;domain includeSubdomains="true"&gt;cdn.example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/trusted_roots"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
Agrega las CA de confianza, en formato PEM o DER, a {@code res/raw/trusted_roots}.
Ten en cuenta que, si usas el formato PEM, el archivo debe incluir <em>solo</em> datos PEM
y ningún texto adicional. También puedes brindar elementos
<a href="#certificates"><code>&lt;certificates&gt;</code></a>
múltiples en lugar de solo uno.
</p>
<h3 id="TrustingAdditionalCas">
Otorgar confianza a CA adicionales
</h3>
<p>
Una aplicación podría querer otorgar confianza a CA adicionales en las cuales el sistema no confía,
ya sea porque el sistema aún no incluye la CA o porque la CA no
cumple con los requisitos de inclusión del sistema Android. La
aplicación puede hacerlo especificando múltiples fuentes de certificado para una
configuración.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/extracas"/&gt;
&lt;certificates src="system"/&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="TrustingDebugCa">Configurar las CA para depuración</h2>
<p>
Cuando depuras una aplicación que se conecta mediante HTTPS, podrías querer
conectarte a un servidor de desarrollo local que no tiene el certificado
SSL de tu servidor de producción. Para poder hacerlo sin
tener que modificar el código de tu aplicación, puedes especificar CA de solo depuración que
solo <i>son</i> de confianza cuando <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">
android:debuggable</a>
es {@code true} usando {@code debug-overrides}. Generalmente, las herramientas de IDE
y de compilación configuran esta marca automáticamente para las versiones que no son de lanzamiento.
</p>
<p>
Esto es más seguro que el código condicional habitual ya que, como precaución
de seguridad, las tiendas de aplicaciones no aceptan aplicaciones que están marcadas
como depurables.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/debug_cas"/&gt;
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="UsesCleartextTraffic">Desactivar el tráfico de Cleartext</h2>
<p>
Las aplicaciones que deseen conectarse a destinos usando solo conexiones
seguras pueden desactivar Cleartext (usando el protocolo
HTTP no cifrado en lugar del protocolo HTTPS) para esos destinos. Esta opción ayuda a prevenir
las regresiones accidentales en aplicaciones debido a cambios en direcciones URL generados por fuentes
externas como servidores backend.
Consulta {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted
NetworkSecurityPolicy.isCleartextTrafficPermitted()} para obtener más información.
</p>
<p>
Por ejemplo, una aplicación puede querer garantizar que todas las conexiones a {@code
secure.example.com} se hagan siempre mediante HTTPS para proteger el tráfico sensible
de redes hostiles.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config usesCleartextTraffic="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="CertificatePinning">Fijar certificados</h2>
<p>
Generalmente, una aplicación otorga confianza a todas las CA preinstaladas. Si alguna de estas CA emitiera
un certificado fraudulento, la aplicación estaría en riesgo de sufrir un ataque
MiTM. Algunas aplicaciones eligen limitar el conjunto de certificados que aceptan
ya sea limitando el conjunto de CA al que otorgan confianza o fijando certificados.
</p>
<p>
La fijación de certificados se hace brindando un conjunto de certificados por hash de la
clave pública (SubjectPublicKeyInfo del certificado X.509). De este modo,
una cadena de certificados solo es válida si contiene al menos una de
las claves públicas fijadas.
</p>
<p>
Ten en cuenta que, cuando uses la fijación de certificados, siempre debes incluir una clave
de respaldo para que, si te ves obligado a cambiar a claves nuevas o a cambiar de CA (cuando
fijas un certificado de CA o un intermediario de esa CA), la conectividad
de la aplicación no se vea afectada. Si no, deberás actualizar
la aplicación para recuperar la conectividad.
</p>
<p>
Además, se puede configurar un tiempo de expiración para las fijaciones,
luego del cual las fijaciones dejan de realizarse. Esto ayuda a evitar los problemas de conectividad
en aplicaciones que no se han actualizado. Sin embargo, configurar un tiempo de expiración
para las fijaciones puede habilitar la omisión de fijaciones.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;pin-set expiration="2018-01-01"&gt;
&lt;pin digest="SHA-256"&gt;7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=&lt;/pin&gt;
&lt;!-- backup pin --&gt
&lt;pin digest="SHA-256"&gt;fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=&lt;/pin&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="ConfigInheritance">Comportamiento de herencia de configuración</h2>
<p>
Los valores que no se establecen en una configuración específica se heredan. Este comportamiento permite configuraciones
más complejas y un archivo de configuración de fácil lectura.
</p>
<p>
Si no se establece un valor en una entrada específica, se usa el valor de
la siguiente entrada más general. Los valores no establecidos en una {@code domain-config} se
toman de la {@code domain-config} primaria, si están anidados, o de la {@code
base-config}, si no están anidados. Los valores no establecidos en la {@code base-config} usan
los valores predeterminados de la plataforma.
</p>
<p>
Por ejemplo, cuando todas las conexiones a subdominios de {@code
example.com} deben usar un conjunto personalizado de CA. Además, el tráfico de Cleartext a
estos dominios se permite <em>excepto</em> con las conexiones a {@code
secure.example.com}. Anidando la configuración para {@code
secure.example.com} dentro de la configuración para {@code example.com},
{@code trust-anchors} no necesita duplicación.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;domain-config cleartextTrafficPermitted="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="FileFormat">Formato del archivo de configuración</h2>
<p>
La función de configuración de seguridad de la red usa un formato de archivo XML.
La estructura general del archivo se muestra en el siguiente ejemplo de código:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;domain-config&gt;
&lt;domain&gt;android.com&lt;/domain&gt;
...
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;pin-set&gt;
&lt;pin digest="..."&gt;...&lt;/pin&gt;
...
&lt;/pin-set&gt;
&lt;/domain-config&gt;
...
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
<p>
Las siguientes secciones describen la sintaxis y otros detalles del formato
de archivo.
</p>
<h3 id="network-security-config">
&lt;network-security-config&gt;
</h3>
<dl class="xml">
<dt>
PUEDE CONTENER:
</dt>
<dd>
0 o 1 de <code><a href="#base-config">&lt;base-config&gt;</a></code><br>
Cualquier cantidad de <code><a href=
"#domain-config">&lt;domain-config&gt;</a></code><br>
0 o 1 de <code><a href="#debug-overrides">&lt;debug-overrides&gt;</a></code>
</dd>
</dl>
<h3 id="base-config">
&lt;base-config&gt;
</h3>
<dl class="xml">
<dt>
SINTAXIS:
</dt>
</dl>
<pre class="stx">
&lt;base-config <a href=
"#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/base-config&gt;
</pre>
<dl class="xml">
<dt>
PUEDE CONTENER:
</dt>
<dd>
<code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
DESCRIPCIÓN:
</dt>
<dd>
La configuración predeterminada usada por todas las conexiones cuyo destino no
está cubierto por una <a href="#domain-config"><code>domain-config</code></a>.
<p>
Los valores que no están configurados usan los valores predeterminados de la plataforma. La configuración predeterminada
para aplicaciones con API nivel 24 o superior es:
</p>
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
La configuración predeterminada para aplicaciones con API nivel 23 o inferior es:
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;certificates src="user" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
</dd>
</dl>
<h3 id="domain-config">&lt;domain-config&gt;</h3>
<dl class="xml">
<dt>SINTAXIS:</dt>
<dd>
<pre class="stx">&lt;domain-config <a href="#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/domain-config&gt;</pre>
</dd>
<dt>PUEDE CONTENER:</dt>
<dd>
1 o más <code><a href="#domain">&lt;domain&gt;</a></code>
<br/>0 o 1 <code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
<br/>0 o 1 <code><a href="#pin-set">&lt;pin-set&gt;</code></a>
<br/>Cualquier cantidad de <code>&lt;domain-config&gt;</code> anidadas</dd>
<dt>DESCRIPCIÓN</dt>
<dd>Configuración usada para conexiones con destinos específicos, como los definidos por elementos de {@code domain}.
<p>Ten en cuenta que, si múltiples elementos de {@code domain-config} cubren un destino, la configuración con la regla de coincidencia de dominio más específica (más larga)
es la que se usa.</p></dd>
</dl>
<h3 id="domain">&lt;domain&gt;</h3>
<dl class="xml">
<dt>
SINTAXIS:
</dt>
<dd>
<pre class="stx">
&lt;domain includeSubdomains=["true" | "false"]&gt;example.com&lt;/domain&gt;
</pre>
</dd>
<dt>
ATRIBUTOS:
</dt>
<dd>
<dl class="attr">
<dt>
{@code includeSubdomains}
</dt>
<dd>
Si es {@code "true"}, esta regla de dominio coincide con el dominio
y con todos los subdominios, incluidos los subdominios de subdominios. Si no, la regla
solo se aplica a coincidencias exactas.
</dd>
</dl>
</dd>
<dt>
DESCRIPCIÓN:
</dt>
</dl>
<h3 id="debug-overrides">&lt;debug-overrides&gt;</h3>
<dl class="xml">
<dt>
SINTAXIS:
</dt>
<dd>
<pre class="stx">
&lt;debug-overrides&gt;
...
&lt;/debug-overrides&gt;
</pre>
</dd>
<dt>
PUEDE CONTENER:
</dt>
<dd>
0 o 1 <code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
DESCRIPCIÓN:
</dt>
<dd>
Sobrescrituras que se deben aplicar cuando <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
es {@code "true"}, que es, generalmente, el caso de las versiones que no sean de lanzamiento
generadas por herramientas de IDE y de compilación. Los anclajes de confianza especificados en {@code
debug-overrides} se agregan a todas las demás configuraciones, y la fijación
de certificados no se lleva a cabo cuando la cadena de certificados del servidor usa uno de estos
anclajes de confianza de solo depuración. Si <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
es {@code "false"}, entonces, esta sección se omite por completo.
</dd>
</dl>
<h3 id="trust-anchors">&lt;trust-anchors&gt;</h3>
<dl class="xml">
<dt>
SINTAXIS:
</dt>
<dd>
<pre class="stx">
&lt;trust-anchors&gt;
...
&lt;/trust-anchors&gt;
</pre>
</dd>
<dt>
PUEDE CONTENER:
</dt>
<dd>
Cualquier cantidad de <code><a href="#certificates">&lt;certificates&gt;</a></code>
</dd>
<dt>
DESCRIPCIÓN:
</dt>
<dd>
Conjunto de anclajes de confianza para conexiones seguras.
</dd>
</dl>
<h3 id="certificates">&lt;certificates&gt;</h3>
<dl class="xml">
<dt>SINTAXIS:</dt>
<dd><pre class="stx">&lt;certificates src=["system" | "user" | "<i>raw resource</i>"]
overridePins=["true" | "false"] /&gt;
</pre></dd>
<dt>DESCRIPCIÓN:</dt>
<dd>Conjunto de certificados X.509 para elementos de {@code trust-anchors}.</dd>
<dt>ATRIBUTOS:</dt>
<dd><dl class="attr">
<dt>{@code src}</dt>
<dd>
La fuente de los certificados de CA puede ser una de las siguientes opciones:
<ul>
<li>Una ID de recurso sin procesar que apunta a un archivo que contiene certificados X.509.
Los certificados deben estar codificados en formato DER o PEM. En el caso de los certificados
PEM, el archivo <em>no debe</em> contener datos adicionales que no sean de PEM, como
comentarios.
</li>
<li>{@code "system"} para los certificados de CA preinstalados del sistema.
</li>
<li>{@code "user"} para los certificados de CA agregados por el usuario.
</li>
</ul>
</dd>
<dt>{@code overridePins}</dt>
<dd>
<p>
Especifica si las CA de esta fuente omiten la fijación de certificados. Si es {@code
"true"}, las cadenas de certificados se encadenan mediante una de estas CA
desde esta fuente, y la fijación no se lleva a cabo. Esto puede ser útil para CA de depuración
o para poder permitirle al usuario hacer un ataque MiTM al tráfico seguro de la aplicación.
</p>
<p>
Es {@code "false"} de forma predeterminada, a menos que se especifique en un elemento de {@code debug-overrides}
, en cuyo caso, es {@code "true"} de forma predeterminada.
</p>
</dd>
</dl>
</dd>
<h3 id="pin-set">&lt;pin-set&gt;</h3>
<dl class="xml">
<dt>
SINTAXIS:
</dt>
<dd>
<pre class="stx">
&lt;pin-set expiration="date"&gt;
...
&lt;/pin-set&gt;
</pre>
</dd>
<dt>
PUEDE CONTENER:
</dt>
<dd>
Cualquier cantidad de <code><a href="#pin">&lt;pin&gt;</a></code>
</dd>
<dt>
DESCRIPCIÓN:
</dt>
<dd>
Un conjunto de fijaciones de claves públicas. Para que una conexión segura sea de confianza, una de las
claves públicas de la cadena de confianza debe estar en el conjunto de fijaciones. Consulta
<code><a href="#pin">&lt;pin&gt;</a></code> para el formato de las fijaciones.
</dd>
<dt>
ATRIBUTOS:
</dt>
<dd>
<dl class="attr">
<dt>
{@code expiration}
</dt>
<dd>
La fecha, en formato {@code yyyy-MM-dd}, a partir de la cual
expiran las fijaciones, lo cual deshabilita la fijación. Si el atributo no está establecido, las fijaciones
no expiran.
<p>
La expiración ayuda a evitar problemas de conectividad en aplicaciones
que no reciben actualizaciones para el conjunto de fijaciones, por ejemplo,
porque el usuario deshabilitó las actualizaciones de la aplicación.
</p>
</dd>
</dl>
</dd>
</dl>
<h3 id="pin">&lt;pin&gt;</h3>
<dl class="xml">
<dt>
SINTAXIS:
</dt>
<dd>
<pre class="stx">
&lt;pin digest=["SHA-256"]&gt;base64 encoded digest of X.509
SubjectPublicKeyInfo (SPKI)&lt;/pin&gt;
</pre>
</dd>
<dt>
ATRIBUTOS:
</dt>
<dd>
<dl class="attr">
<dt>
{@code digest}
</dt>
<dd>
Resumen del algoritmo usado para generar la fijación. Actualmente, solo se admite
{@code "SHA-256"}.
</dd>
</dl>
</dd>
</dl>

View File

@@ -0,0 +1,120 @@
page.title=Grabación de TV
page.keywords=preview,sdk,tv,recording
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Contenido del documento</h2>
<ol>
<li><a href="#supporting">Indicar la compatibilidad para la grabación</a></li>
<li><a href="#recording">Grabar una sesión</a></li>
<li><a href="#errors">Gestionar los errores de grabación</a></li>
<li><a href="#sessions">Gestionar las sesiones grabadas</a></li>
<li><a href="#best">Prácticas recomendadas</a></li>
</ol>
</div>
</div>
<p>Los servicios de entrada de TV le permiten al usuario pausar y reiniciar la reproducción de canales
mediante API de time-shifting. Android N expande la función de time-shifting
permitiéndoles a los usuarios guardar múltiples sesiones grabadas.</p>
<p>Los usuarios pueden programar las grabaciones por adelantado o comenzar a grabar a la vez
que miran un programa. Una vez que el sistema haya guardado una grabación, el usuario puede explorar, gestionar
y reproducir las grabaciones usando la aplicación del sistema de TV.</p>
<p>Si deseas brindar funcionalidades de grabación a tu servicio de entrada de TV,
debes indicarle al sistema que tu aplicación permite la grabación, implementar
la habilidad para grabar programas, gestionar y comunicar los errores que ocurren
durante la grabación y gestionar las sesiones grabadas.</p>
<h2 id="supporting">Indicar la compatibilidad para la grabación</h2>
<p>Para comunicarle al sistema que tu servicio de entrada de TV permite la grabación, debes seguir
estos pasos:</p>
<ol>
<li>En el método <code>TvInputService.onCreate()</code>, crea un nuevo
objeto <code>TvInputInfo</code> usando la clase <code>TvInputInfo.Builder</code>.
</li>
<li>Cuando creer el nuevo objeto <code>TvInputInfo</code>, llama a
<code>setCanRecord(true)</code> antes de llamar a <code>build()</code> para
indicar que tu servicio permite la grabación.</li>
<li>Registra tu objeto <code>TvInputInfo</code> con el sistema llamando a
<code>TvInputService.updateTvInputInfo()</code>.</li>
</ol>
<h2 id="recording">Grabar una sesión</h2>
<p>Luego de que el servicio de entrada de TV registra la compatibilidad
con la funcionalidad de grabación, el sistema llama a tu
<code>TvInputService.onCreateRecordingSession()</code> cuando necesita acceder
a la implementación de grabación de tu aplicación. Implementa tu propia subclase
<code>TvInputService.RecordingSession</code> y devuélvela
cuando el callback de <code>onCreateRecordingSession()</code>
se dispare. Esta subclase es responsable de cambiar a los datos del canal correcto,
de grabar los datos solicitados y de comunicar el estado y los errores de grabación al
sistema.</p>
<p>Cuando el sistema llama a <code>RecordingSession.onTune()</code>, pasando en un
URI de canal, sintoniza el canal que el URI especifica. Notifícale al sistema que tu
aplicación se ha sintonizado al canal deseado llamando a <code>notifyTuned()</code>
o, si tu aplicación no pudo sintonizarse al canal correcto, llama a
<code>notifyError()</code>.</p>
<p>El sistema invoca, a continuación, el callback <code>RecordingSession.onStartRecording()</code>.
Tu aplicación debe comenzar a grabar inmediatamente. Cuando el sistema invoca
este callback, puede brindar un URI que contiene información sobre el programa
que se está por grabar. Cuando finaliza la grabación, debes copiar estos
datos a la tabla de datos <code>RecordedPrograms</code>.</p>
<p>Finalmente, el sistema llama a <code>RecordingSession.onStopRecording()</code>.
En este momento, tu aplicación debe dejar de grabar inmediatamente. También debes crear
una entrada en la tabla <code>RecordedPrograms</code>. Esta entrada debe
incluir el URI de datos de la sesión grabada en la columna
<code>RecordedPrograms.COLUMN_RECORDING_DATA_URI</code> y cualquier información
del programa que el sistema haya brindado en la llamada inicial a
<code>onStartRecording()</code>.</p>
<p>Para obtener más información sobre cómo acceder a la tabla <code>RecordedPrograms</code>
, consulta <a href="#sessions">Gestionar las sesiones grabadas</a>.</p>
<h2 id="errors">Gestionar los errores de grabación</h2>
<p>Si ocurre un error durante la grabación que hace que los datos grabados no se puedan usar,
notifica al sistema llamando a<code>RecordingSession.notifyError()</code>.
De forma similar, puedes llamar a <code>notifyError()</code> después de que se cree una sesión de grabación
para que el sistema sepa que la aplicación ya no puede grabar sesiones.</p>
<p>Si ocurre un error durante la grabación, pero deseas brindarle al usuario una grabación
parcial usable para su reproducción, llama a
<code>RecordingSession.notifyRecordingStopped()</code> para permitir que el sistema
use la sesión parcial.</p>
<h2 id="sessions">Gestionar las sesiones grabadas</h2>
<p>El sistema mantiene información de todas las sesiones grabadas de todas
las aplicaciones de canal con funcionalidad de grabación en la tabla de proveedor de contenido <code>TvContract.RecordedPrograms</code>
. Esta información se accede mediante el URI de contenido
<code>RecordedPrograms.Uri</code>. Usa API de proveedor de contenido para
leer, agregar y eliminar entradas de esta tabla.</p>
<p>Para obtener más información sobre cómo trabajar con datos del proveedor de contenido, consulta
<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
Conceptos básicos sobre el proveedor de contenido</a>.</p>
<h2 id="best">Prácticas recomendadas</h2>
<p>Los dispositivos de TV tienen un almacenamiento limitado, de modo que debes ser cuidadoso a la hora
de asignar el almacenamiento para guardar las sesiones grabadas. Usa
<code>RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)</code> cuando
no haya espacio suficiente para guardar una sesión grabada.</p>
<p>Cuando el usuario inicie la grabación, el registro de datos debe comenzar
lo antes posible. Para facilitar este proceso, completa cualquier tarea anterior demandante,
como acceder al espacio de almacenamiento y asignarlo, cuando el sistema invoque el
callback <code>onCreateRecordingSession()</code>. Hacerlo te permite comenzar
a grabar inmediatamente cuando el callback <code>onStartRecording()</code>
se dispare.</p>

View File

@@ -0,0 +1,120 @@
page.title=Android N Developer Preview
page.tags="preview","developer"
meta.tags=“preview”, “android”
fullpage=true
forcelocalnav=true
header.hide=1
footer.hide=1
@jd:body
<script>
$(document).ready(function() {
if (useUpdatedTemplates) {
$("#useUpdatedTemplates").css("display","block");
} else {
$("#useOldTemplates").css("display","block");
}
})
</script>
<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
<div class="wrap" style="max-width:1100px;margin-top:0">
<div class="cols dac-hero-content" style="padding-bottom:1em;">
<div class="col-7of16 col-push-9of16" style="padding-left:2em">
<h1 class="dac-hero-title">Android N Developer Preview</h1>
<p class="dac-hero-description">
¡Prepárate para Android N!
<strong>Prueba tus aplicaciones</strong> en Nexus y en otros dispositivos. Admite comportamientos del sistema nuevo
para <strong>ahorrar energía y memoria</strong>.
Amplía la funcionalidad de tus aplicaciones gracias a una <strong>IU con ventanas múltiples</strong>,
<strong>notificaciones de respuestas directas</strong> y más.
</p>
<a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
<span class="dac-sprite dac-auto-chevron"></span>
Comencemos
</a><!--<br>
<a class="dac-hero-cta" href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron"></span>
Update to Android N (final SDK)
</a><br>-->
</div>
<div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
<img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
{@docRoot}images/home/n-preview-hero_2x.png 2x">
</div>
</div>
<div class="dac-section dac-small">
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/resources"
data-cardSizes="6x2"
data-maxResults="6"></div>
</div>
</div>
</section>
<div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
<div class="wrap dac-offset-parent">
<a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
<i class="dac-sprite dac-arrow-down-gray"></i>
</a>
<ul class="dac-actions">
<li class="dac-action">
<a class="dac-action-link" href="https://developer.android.com/preview/bug">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Informa un problema
</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/support.html">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Consulta las notas de la versión
</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/dev-community">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Únete a la comunidad de desarrolladores
</a>
</li>
</ul>
</div><!-- end .wrap -->
</div><!-- end .dac-actions -->
<div id="useOldTemplates" style="display:none;color:black" class="actions-bar dac-expand dac-invert">
<div class="wrap dac-offset-parent">
<div class="actions">
<div><a href="https://developer.android.com/preview/bug">
<span class="dac-sprite dac-auto-chevron-large"></span>
Informar un problema
</a></div>
<div><a href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron-large"></span>
Consulta las notas de la versión
</a></div>
<div><a href="{@docRoot}preview/dev-community">
<span class="dac-sprite dac-auto-chevron-large"></span>
Únete a la comunidad de desarrolladores
</a></div>
</div><!-- end .actions -->
</div><!-- end .wrap -->
</div>
<section class="dac-section dac-light"><div class="wrap">
<h1 class="dac-section-title">Recursos</h1>
<div class="dac-section-subtitle">
Información esencial para ayudarte a preparar tus aplicaciones para Android N.
</div>
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
data-items-per-page="6"
data-maxResults="15"
data-initial-results="6"></div>
</div>
</section>

View File

@@ -0,0 +1,183 @@
page.title=Funciones del lenguaje Java 8
page.keywords="android N", "Java 8", "Jack"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li>
<a href="#supported-features">Funciones y API admitidas del lenguaje Java 8</a>
</li>
<li>
<a href="#configuration">Habilitar funciones de Java 8 y del conjunto de herramientas Jack</a>
</li>
</ol>
</div>
</div>
<p>En Android N se ofrece compatibilidad con funciones del idioma Java 8
que puedes usar al desarrollar aplicaciones orientadas a Android N.
En esta página se describen las funciones de idioma compatibles con la Android N
Preview, también la manera adecuada de configurar tu proyecto para usarlas y muchos problemas
conocidos que puedes experimentar.
</p>
<p>Para comenzar a usar estas funciones, debes descargar y configurar Android
Studio 2.1 (muestra) y el Android N Preview SDK, en el que se incluyen el conjunto de herramientas
Jack y el complemento de Android para Gradle. Si aún no instalaste
el Android N Preview SDK, consulta <a href="{@docRoot}preview/setup-sdk.html">Configuración para desarrollar con Android N</a>.</p>
<p class="note">
<strong>Nota:</strong> No es obligatorio usar las nuevas funciones del lenguaje Java 8
para desarrollar aplicaciones orientadas a la plataforma de Android N. Si no
deseas escribir código con funciones del lenguaje Java 8, puedes mantener los valores de compatibilidad
de origen y destino de tu proyecto en Java 7, pero
debes usar JDK 8 para crear la compilación en función de la plataforma de Android N.
</p>
<h2 id="supported-features">
Funciones y API admitidas del lenguaje Java 8
</h2>
<p>
Actualmente, Android no admite todas las funciones del lenguaje Java 8. Sin embargo, las
siguientes características ahora se encuentran disponibles para el desarrollo de aplicaciones orientadas a la
Android N Preview:
</p>
<ul>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html">métodos de interfaz
predeterminados y estáticos;</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html">
expresiones Lambda;</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html">anotaciones
reiterables.</a>
</li>
</ul>
<p>
A su vez, las siguientes API de funciones del lenguaje Java 8 ahora se encuentran disponibles:
</p>
<ul>
<li>Las API de Reflection y las relacionadas con el lenguaje:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.lang.FunctionalInterface}
</li>
<li>{@code java.lang.annotation.Repeatable}
</li>
<li>{@code java.lang.reflect.Method.isDefault()}
</li>
<li>También API Reflection asociadas con anotaciones reiterables, como
{@code AnnotatedElement.getAnnotationsByType(Class)}:
</li>
</ul>
</li>
<li>API de utilidades:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.util.function}
</li>
</ul>
</li>
</ul>
<p class="note">
<strong>Nota:</strong> la implementación de expresiones Lambda
de Android N se basa en clases anónimas. Este enfoque permite que
tengan compatibilidad con versiones anteriores y puedan ejecutarse en versiones anteriores de Android. Para probar
expresiones Lambda en versiones anteriores, recuerda acceder a tu archivo {@code
build.gradle} y fijar {@code compileSdkVersion} y {@code
targetSdkVersion} en 23 o un valor inferior.
</p>
<h2 id="configuration">
Habilitar funciones de Java 8 y del conjunto de herramientas Jack
</h2>
<p>
Para usar las nuevas funciones del lenguaje Java 8, también debes usar el
nueva <a class="external-link" href="https://source.android.com/source/jack.html">conjunto de herramientas Jack</a>. Este nueva
conjunto de herramientas de Android permite compilar fuentes del lenguaje Java en código de bytes dex legible a través de
Android, también tiene su propio formato de biblioteca {@code .jack} y proporciona la mayoría de las funciones de conjunto de
herramientas como parte de una única herramienta: reempaquetado, reducción, alteración y
MultiDex.
</p>
<p>A continuación, se muestra una comparación de los conjuntos de herramientas empleadas para generar archivos DEX de Android:</p>
<ul>
<li>Conjunto de herramientas javac heredada:<br>
<b>javac</b> ({@code .java} --&gt; {@code .class}) --&gt; <b>dx</b> ({@code
.class} --&gt; {@code .dex})
</li>
<li>Nueva conjunto de herramientas Jack:<br>
<b>Jack</b> ({@code .java} --&gt; {@code .jack} --&gt; {@code .dex})
</li>
</ul>
<h3>
Configuración de Gradle
</h3>
<p>
Si deseas habilitar las funciones del lenguaje Java 8 y de Jack para tu proyecto, escribe lo
siguiente en tu archivo específico de módulo {@code build.gradle}:
</p>
<pre>
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
</pre>
<h3>
Problemas conocidos
</h3>
<p>
Instant Run, presentado en Android Studio 2.0 (beta), actualmente no funciona
con Jack y permanecerá deshabilitado cuando se use el nuevo conjunto de herramientas.
</p>
<p>Debido a que Jack no genera archivos de clase intermedia al compilar una
aplicación, las herramientas que dependen de estos archivos actualmente no funcionan con Jack. Algunos
ejemplos de estas herramientas:</p>
<ul>
<li>detectores Lint que funcionan en archivos de clases;
</li>
<li>Herramientas y bibliotecas que requieren los archivos de clase de la aplicación (como JaCoCo
y Mockito).</li>
</ul>
<p>Si experimentas otros problemas al usar Jack, <a href="http://tools.android.com/filing-bugs">informa los errores</a>.</p>

View File

@@ -0,0 +1,440 @@
page.title=Información general del programa
page.metaDescription=Prepara tus aplicaciones para la próxima versión de Android.
page.image=images/cards/card-n-overview_2x.png
meta.tags=“preview”, “desarrollador”, “Android”
page.tags="preview", "developer", "android"
@jd:body
<!--
<div class="cols" style=
"background-color:#f2daf5; padding: 5px 0;margin-bottom:1em; text-align:center;">
<h3>
Developer Preview 3 is now available
</h3>
<p>Includes final SDK and near-final system images</p>
<div style="margin:auto 1em">
<ul class="dac-section-links">
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-notes">
<span class="dac-sprite dac-auto-chevron"></span>
Read the Notes</a>
</li>
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-get">
<span class="dac-sprite dac-auto-chevron"></span>
Get the Update</a>
</li>
<li class="dac-section-link">
<a href="https://code.google.com/p/android-developer-preview/">
<span class="dac-sprite dac-auto-chevron"></span>
Report Issues</a>
</li>
</ul>
</div>
</div>
-->
<p>
Bienvenido al plan de la <strong>Android N Developer Preview</strong>, un programa en el que
se ofrece todo lo que necesitas a fin de probar y optimizar tus aplicaciones para la próxima
versión de Android. Es gratis y puedes dar tus primeros pasos
descargando las herramientas de la N Developer Preview.
</p>
<div style="background-color:#eceff1;padding:1em;">
<div class="wrap">
<div class="cols">
<div class="col-4of12">
<h5>
Imágenes de hardware y emuladores
</h5>
<p>
Ejecuta y prueba tus aplicaciones en varios dispositivos o en un emulador.
</p>
</div>
<div class="col-4of12">
<h5>
El código de plataforma más reciente
</h5>
<p>
Durante la Preview, ofreceremos varias actualizaciones mensuales. De esta manera, realizarás tus pruebas con los últimos cambios de la plataforma.
</p>
</div>
<div class="col-4of12">
<h5>
Prioridad para problemas de desarrolladores
</h5>
<p>
Durante las primeras semanas, daremos prioridad a los problemas informados por los desarrolladores;
por lo tanto, debes realizar las pruebas y enviar tus comentarios lo antes posible.
</p>
</div>
</div>
<div class="cols">
<div class="col-4of12">
<h5>
Capacidades y comportamientos nuevos
</h5>
<p>
Comienza a trabajar temprano para admitir los comportamientos de la nueva plataforma y realizar desarrollos con nuevas funciones.
</p>
</div>
<div class="col-4of12">
<h5>
Actualizaciones inalámbricas
</h5>
<p>
Actualizaciones inalámbricas sin inconvenientes para dispositivos admitidos a través del
Programa de Android beta. No se requieren actualizaciones.
</p>
</div>
<div class="col-4of12">
<h5>
Comentarios y soporte
</h5>
<p>
Informa los problemas y envíanos comentarios a través de nuestro
<a href="{@docRoot}preview/bug">sistema de seguimiento de problemas</a>. Conéctate con otros desarrolladores
en la
<a href="{@docRoot}preview/dev-community">comunidad de desarrolladores de Android&nbsp;N</a>.
</p>
</div>
</div>
</div>
</div>
<!--
<p>New in the Android N Developer Preview: </p>
<ul>
<li> Accompanying Android Beta Program for consumers, starting later in the preview</li>
<li> More supported devices, including devices from OEM partners</li>
<li> Seamless OTAs for your devices, from initial release to final N release without flashing</li>
</ul>
-->
<h2 id="timeline">Escala de tiempo y actualizaciones</h2>
<img src="{@docRoot}images/n-preview-updates_2x.png">
<p>
La N Developer Preview rige desde el 9 de marzo de 2016 hasta el lanzamiento público de Android N
para AOSP y OEM, previsto para el tercer trimestre de 2016.
</p>
<p>
En momentos claves del desarrollo, ofreceremos actualizaciones para tu entorno de desarrollo y
prueba. En general, podrás contar con una actualización por mes (intervalo de 4 a 6
semanas). A continuación, se mencionan las versiones milestone:
</p>
<ul>
<li><strong><a href="{@docRoot}preview/support.html">Preview 1</a></strong> (versión inicial, alpha);</li>
<li><strong>Preview 2</strong> (actualización gradual, beta);</li>
<li><strong>Preview 3</strong> (actualización gradual, beta);</li>
<li><strong>Preview 4</strong> (API finales y SDK oficial, publicación en Google Play);</li>
<li><strong>Preview 5</strong> (imágenes de sistema casi definitivas para pruebas finales);</li>
<li><strong>lanzamiento de la versión final</strong> para AOSP y el ecosistema.</li>
</ul>
<p>
En cada actualización se incluyen herramientas de SDK, imágenes de sistema de la muestra, emuladores, documentación de
referencia y diferencias de API.
</p>
<p>
En las primeras <strong>tres milestone de la muestra</strong> se proporciona un <strong>entorno
de prueba y desarrollo tempranos</strong> que te permitirá identificar
problemas de compatibilidad en tus aplicaciones actuales y planificar tareas relacionadas con la migración o las funciones
que se necesitan para orientar la nueva plataforma. Este será el período de prioridad en el cual nos
enviarás tus comentarios sobre funciones y problemas de compatibilidad de API y archivos;
para hacerlo, usa el <a href="{@docRoot}preview/bug">sistema se seguimiento de
problemas</a>. Podrás contar con cambios en las API en estas actualizaciones.
</p>
<p>
Entre las <strong>Preview 4 y 5</strong>, tendrás acceso a las <strong>API
y al SDK finales de Android N</strong> para tareas de desarrollo, y también a imágenes de sistema casi definitivas
para poner a prueba comportamientos y funciones del sistema. Durante este período, Android N ofrecerá un nivel de API
estándar. Puedes iniciar la prueba de compatibilidad de tus aplicaciones
heredadas y optimizar el código nuevo en el que se usen las API o funciones de Android N.
</p>
<p>
A su vez, a partir de la Preview 4, podrás <strong>publicar aplicaciones en
dispositivos</strong> con Android N cuyo nivel de API sea el oficial (por ejemplo,
dispositivos de consumidores inscritos en el Programa de Android beta). Puedes
realizar primero publicaciones en los canales alpha y beta de Google Play, a fin de probar
tus aplicaciones con consumidores de Android beta antes de proceder con la distribución a gran escala en la
tienda.
</p>
<p>
A medida que pruebes Android N y lo uses para tus desarrollos, te recomendamos enfáticamente <strong>mantener
actualizado tu entorno de desarrollo</strong> conforme se lancen actualizaciones de la
muestra. Para facilitar el proceso, puedes registrar tus dispositivos de prueba en el
Programa de Android Beta y obtener <strong>actualizaciones inalámbricas (OTA)</strong> en
cada versión milestone. Como alternativa, habrá disponibles imágenes de preview actualizadas que puedes
descargar y actualizar de manera manual.
</p>
<p>
Cuando haya disponibles las actualizaciones de la muestra, te informaremos a través del <a href="http://android-developers.blogspot.com/">blog para desarrolladores de Android</a>, de
este sitio y de la <a href="{@docRoot}preview/dev-community">Comunidad de desarrolladores
de Android N</a>.
</p>
<h2 id="preview_tools">¿Qué es la N Developer Preview?</h2>
<p>
En la N Developer Preview se incluye todo lo que necesitas para probar tus aplicaciones
existentes con diferentes tamaños de pantalla, tecnologías de red, chipsets de CPU y GPU,
y arquitecturas de hardware.
</p>
<h3 id="sdk_tools">Herramientas del SDK</h3>
<p>Puedes descargar todos estos componentes a través de SDK Manager en <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a>:</p>
<ul>
<li> <strong>SDK y herramientas</strong> de la N Developer Preview
<li> <strong>imagen del sistema para el emulador</strong>de la N Developer Preview (32 y 64 bits);
<li> <strong>imagen del sistema para el emulador para Android TV</strong> (32 bits) de la N Developer Preview;
<li> bibliotecas de compatibilidad de la N Developer Preview (para nuevas plantillas de aplicaciones).
</ul>
<p>
Ofreceremos actualizaciones para estas herramientas de desarrollo en cada versión milestone según sea necesario.
</p>
<h3 id="hardware_system_images">Imágenes de sistema de hardware</h3>
<p>
En la N Developer Preview se incluyen, entre otras, imágenes de sistema del hardware de Nexus que puedes usar al
realizar pruebas y desarrollos en dispositivos físicos. Consulta la sección de <a href="{@docRoot}preview/download.html">imágenes de sistema</a> para encontrar la lista completa
de imágenes de hardware.
</p>
<p>
Ofreceremos imágenes de sistema actualizadas para estos dispositivos en cada versión milestone. Puedes
descargar y actualizar manualmente las imágenes de sistema renovadas en tus dispositivos de prueba
con la frecuencia que desees. Esto resulta particularmente útil para entornos
de prueba automatizados en los cuales probablemente debas volver a actualizar tu dispositivo varias
veces.
</p>
<p class="note"><strong>Nota</strong>:
<strong>Los dispositivos actualizados de manera manual no recibirán actualizaciones OTA</strong>, como en la
muestra del año pasado. Este año, podrás recibir OTA registrando dispositivos en el
Programa de Android Beta. Consulta la sección siguiente para obtener información detallada.
</p>
<h3 id="android_beta">Actualizaciones OTA a través del Programa de Android beta</h3>
<p>
Como novedad en Android N, se ofrece un programa de actualización inalámbrica (OTA) que
proporciona las últimas actualizaciones de las muestras de Android N directamente para dispositivos registrados
en él. Es gratuito y está pensado para quienes tengan dispositivos
compatibles registrados en sus cuentas de Google.
</p>
<p>
Para el registro, visita el sitio del <a href="https://g.co/androidbeta">Programa de Android
beta</a>. En él, verás
todos los dispositivos registrados en tu cuenta que cumplen con los requisitos para registrarse en
el programa.
</p>
<ol>
<li> Selecciona los dispositivo para los cuales deseas recibir actualizaciones de Android N.
<li> Haz clic en Registrar, lee y acepta las condiciones de servicio y luego haz clic en Aceptar.
</ol>
<p>
Una vez que realices el registro, tu dispositivo recibirá pronto una actualización. En la mayoría de los casos,
no necesitarás restablecer por completo tus datos para la migración a Android N, pero
te recomendamos hacer una copia de respaldo de los datos que no desees perder antes de
registrar el dispositivo.
</p>
<p>
A medida que tu dispositivo reciba actualizaciones, te recomendamos descargarlas e
instalarlas lo más pronto posible. Te convendrá mantenerte actualizado respecto de
las últimas modificaciones en la IU, el comportamiento, las API y las funciones del sistema.
</p>
<p>
Al finalizar la Developer Preview, tus dispositivos registrados
recibirán una actualización a la versión oficial de Android N.
</p>
<p>
Puedes dar de baja tus dispositivos del Programa de Android beta en cualquier momento desde el
sitio de Android beta. Antes de hacerlo, asegúrate de realizar una copia de respaldo de los datos de tu
dispositivo.
</p>
<p class="note"><strong>Nota</strong>:
Cuando des de baja tu dispositivo, <strong>este se someterá a un restablecimiento de fábrica</strong>
a través del cual se cargará la última versión
de Android 6.0 Marshmallow (no necesariamente la versión
instalada antes del registro). Para garantizar que la instalación sea nueva,
se borrarán tus datos del dispositivo; entre otros, los contactos, los mensajes y
las fotos.
</p>
<h3 id="documentation_and_sample_code">Documentación y ejemplo de código</h3>
<p>
Los siguientes recursos de documentación se encuentran disponibles en el sitio Developer Preview y con ellos
podrás obtener información sobre Android&nbsp;N:
</p>
<ul>
<li> <a href="{@docRoot}preview/setup-sdk.html">Preparación para el desarrollo con
Android N</a>: contiene
instrucciones paso a paso para comenzar.</li>
<li> En <a href="{@docRoot}preview/behavior-changes.html">Cambios
en los comportamientos</a> se indican áreas claves que debes probar.</li>
<li> Documentación de nuevas API, incluyendo <a href="{@docRoot}preview/api-overview.html">Información general de API</a>, una <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia
de API</a>
descargable y guías exhaustivas para desarrolladores que muestran por ejemplo: soporte de
múltiples ventanas, notificaciones integradas, soporte de múltiples regiones, y mucho más.
<li> <a href="{@docRoot}preview/samples.html">Ejemplo de código</a>, en el que
se demuestra la manera de admitir permisos y otras funciones nuevas.
<li> <a href="{@docRoot}preview/support.html#release-notes">Notas de la versión</a>
sobre la versión actual de la N Developer Preview. Se incluyen notas sobre los cambios e informes
de diferencias.
</ul>
<h4 id="reference">Referencia de la API descargable</h4>
<p>
Durante las actualizaciones de la muestra, puedes descargar la
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia de la API
más reciente para la plataforma de Android N</a> como un archivo .zip separado. En esta descarga
también se incluye un informe de diferencias que te permite identificar cambios en la API
en comparación con la API 23 y la actualización anterior.
</p>
<p>
Cuando las API de Android N sean definitivas y se asigne el nivel de API oficial,
te proporcionaremos la referencia de la API en línea en <a href="https://developer.android.com">https://developer.android.com</a>.
</p>
<h3 id="support_resources">
Recursos de soporte
</h3>
<p>
A medida que realices pruebas y desarrollos con la N Developer Preview, recurre a los siguientes canales
para informar problemas y enviar comentarios.
</p>
<ul>
<li> <a href="https://code.google.com/p/android-developer-preview/">El sistema de seguimiento de problemas de la N Developer Preview
</a> es el <strong>canal principal para comentarios.</strong> A través de él, puedes informar errores y problemas de
rendimiento, y enviar comentarios generales. También puedes buscar
<a href="{@docRoot}preview/bug">problemas conocidos</a> y
encontrar pasos para solucionarlos. Te mantendremos informado sobre tu problema durante el proceso de evaluación y
derivación al equipo de ingeniería de Android para su resolución. </li>
<li> La <a href="{@docRoot}preview/dev-community">comunidad de desarrolladores de Android N</a> es
una comunidad de Google+ en la que puedes <strong>conectarte con otros desarrolladores</strong>que trabajen con
Android N. Puedes compartir observaciones o ideas, o encontrar respuestas a
preguntas acerca de Android N. Moderaremos la comunidad y proporcionaremos respuestas y
orientación según sea necesario.</li>
</ul>
<h3 id="targeting">Orientación, API de la muestra y publicación</h3>
<p>
En la N Developer Preview se proporciona un sistema exclusivo para desarrollo y una biblioteca
de Android <strong>cuyo nivel de API no es estándar</strong>. Si deseas
no incluir comportamientos de compatibilidad para probar tu aplicación (muy
recomendado), puedes orientar la versión preview de Android N fijando el valor de
<code><a href=
"{@docRoot}preview/setup-sdk.html#create-update">targetSdkVersion</a></code>
de tu aplicación en <code>“N”</code>.
</p>
<p>
La Android N Developer Preview ofrece las <strong>API de preview</strong>;
estas no serán oficiales hasta el lanzamiento de la versión definitiva del SDK,
actualmente previsto para el tercer trimestre de 2016. Esto significa que podrás
<strong>contar con cambios menores en las API</strong> conforme pase el tiempo, en especial durante
las primeras semanas del programa. Te proporcionaremos un resumen de cambios con
cada actualización de la Android N Developer Preview.
</p>
<p class="note">
<strong>Nota</strong>: Aunque las API de la muestra pueden modificarse, los comportamientos del sistema
subyacente permanecen estables y disponibles para cualquier prueba
inmediata.
</p>
<p>
Google Play <strong>evita la publicación de aplicaciones orientadas a la N Developer
Preview</strong>. Cuando esté disponible el SDK definitivo de Android N, podrás
apuntar hacia el nivel de API oficial de Android N y publicar tu aplicación en Google
Play a través de los canales para versiones alpha y beta. Mientras tanto, si deseas
distribuir una aplicación orientada a Android N para testers, puedes hacerlo por correo electrónico o
mediante descarga directa desde tu sitio.
</p>
<p>
Cuando se lance la versión completa de Android N para AOSP y OEM, evento previsto para el tercer trimestre de 2016,
podrás publicar tus aplicaciones orientadas a Android N en el canal de lanzamientos
públicos de Google Play.
</p>
<h2 id="how_to_get_started">Primeros pasos</h2>
<p>
Para comenzar a probar tu aplicación con Android N:
</p>
<ol>
<li> Revisa las secciones <a href="{@docRoot}preview/api-overview.html">Información general de la API</a>
y <a href="{@docRoot}preview/behavior-changes.html">Cambios en los comportamientos</a> a fin de
conocer las novedades y el efecto que tienen en tus aplicaciones. En particular,
procura obtener información sobre las nuevas funciones de <a href="{@docRoot}preview/features/notification-updates.html">notificaciones</a> y la
<a href="{@docRoot}preview/features/multi-window.html">compatibilidad con ventanas múltiples</a>.</li>
<li> Configura tu entorno siguiendo las instrucciones para <a href="{@docRoot}preview/setup-sdk.html">configurar el SDK Preview</a>
y los dispositivos de prueba.</li>
<li> Sigue las <a href="https://developers.google.com/android/nexus/images">instrucciones de
actualización</a> a fin de usar la última imagen de sistema de Android N para tu dispositivo. </li>
<li> Revisa la <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referencia de la API</a>
y los <a href="{@docRoot}preview/samples.html">Ejemplos de Android N</a> para obtener más
información sobre las nuevas funciones de la API y la manera de usarlas en tu aplicación.
<li> Únete a la <a href="{@docRoot}preview/dev-community">comunidad de
desarrolladores de Android N</a> para recibir las últimas noticias y para contactarte con otros
desarrolladores que estén trabajando con la nueva plataforma.</li>
</ol>
<p>
¡Te agradecemos por participar de la Android N Developer Preview!
</p>

View File

@@ -0,0 +1,85 @@
page.title=Ejemplos
page.tags="preview", "samples", "android"
page.image=images/cards/card-n-samples_2x.png
@jd:body
<p>
Los siguientes ejemplos de código se proporcionan para Android N. Para
descargarlos en Android Studio, selecciona la opción de menú <b>File &gt; Import
Samples</b>.
</p>
<p class="note">
<strong>Nota:</strong> Estos proyectos descargables están diseñados
para usarse con Gradle y Android Studio.
</p>
<h3 id="mw">“Área de juegos” de ventanas múltiples</h3>
<img src="{@docRoot}preview/images/sample-multiwindow.png" style="float: left; padding-right: 0.5em" height="250" width="156" />
<p>
En este ejemplo se muestra la manera de aprovechar interfaces de usuario
de ventanas múltiples con tu aplicación.
</p>
<p>
<a href="https://github.com/googlesamples/android-MultiWindowPlayground">
Obtener en GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="an">Notificaciones activas</h3>
<img src="{@docRoot}preview/images/sample-activenotifications.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
Este es un ejemplo preexistente en el cual se muestra un servicio simple que envía
notificaciones con NotificationCompat. Cada conversación no leída
se envía como una notificación diferente.
</p>
<p>
Este ejemplo se actualizó para aprovechar nuevas funciones de notificación
disponibles en Android N.
</p>
<p>
<a href="https://github.com/googlesamples/android-ActiveNotifications">
Obtener en GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="ms">Servicio de mensajería</h3>
<img src="{@docRoot}preview/images/sample-messagingservice.png" style="float: left; padding-right: 0.5em" height="250" width="150" />
<p>
Este es un ejemplo preexistente en el que se demuestra la manera de usar
NotificationManager para indicar la cantidad de notificaciones que se aparecen actualmente en una
aplicación.
</p>
<p>
Este ejemplo se actualizó para aprovechar nuevas funciones de notificación
disponibles en Android N.
</p>
<p>
<a href="https://github.com/googlesamples/android-MessagingService">
Obtener en GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="fbe">Inicio directo</h3>
<img src="{@docRoot}preview/images/sample-directboot.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
En este ejemplo se demuestra la manera de almacenar datos, y de acceder a ellos, en un medio de almacenamiento cifrado por
dispositivo que esté siempre disponible mientras el dispositivo se haya iniciado.
</p>
<p>
<a href="https://github.com/googlesamples/android-DirectBoot">
Obtener en GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="sda">Acceso a directorios determinados</h3>
<img src="{@docRoot}preview/images/sample-scopeddirectoryaccess.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
En este ejemplo se demuestra la manera de leer y escribir datos de
directorios específicos y, al mismo tiempo, evitar más permisos.
</p>
<p>
<a href="https://github.com/googlesamples/android-ScopedDirectoryAccess">
Obtener en GitHub</a>
</p>

View File

@@ -0,0 +1,226 @@
page.title=Configuración de la Preview
meta.keywords=“preview”, “Android”
page.tags="preview", "developer preview"
page.image=images/cards/card-n-sdk_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li><a href="#get-as13">Obtener Android Studio 2.1</a></li>
<li><a href="#get-sdk">Obtener el SDK de Android N</a>
<ol>
<li><a href="#docs-dl">Documentación de referencia</a>
</ol>
</li>
<li><a href="#java8">Obtener el JDK y JRE de Java 8</a></li>
<li><a href="#create-update">Actualizar o crear un proyecto</a></li>
<li><a href="#next">Próximos pasos</a></li>
</ol>
</div>
</div>
<p>A fin de desarrollar aplicaciones para la Android N Preview, debes aplicar algunas actualizaciones
a tu entorno de desarrollo, como se describe en esta página.</p>
<p>Para solo probar la compatibilidad de tu aplicación en la
imagen de sistema de Android N, sigue la guía de <a href="{@docRoot}preview/download.html">Prueba en un dispositivo Android N</a>.</p>
<img src="{@docRoot}preview/images/n-preview-setup.png" width="700" alt="" />
<h2 id="get-as13">Obtener Android Studio 2.1 (muestra)</h2>
<p>La plataforma de Android N agrega compatibilidad para <a href="{@docRoot}preview/j8-jack.html">funciones de lenguaje de Java 8</a>,
que requieren un nuevo compilador llamado Jack. La última versión de Jack
actualmente solo es compatible con Android Studio 2.1. Por lo tanto, si deseas
usar funciones de lenguaje de Java 8, debes usar Android Studio 2.1 para
crear tu aplicación. De lo contrario, no necesitarás el compilador Jack, pero
deberás aplicar una actualización a JDK 8 para compilar tu proyecto en función a la plataforma de Android N,
según lo descrito a continuación.
</p>
<iframe width="400" height="225" src="//www.youtube.com/embed/SBbWGxXCMqQ?autohide=1&amp;showinfo=0" frameborder="0" allowfullscreen="" style="float: right; margin: 0 0 20px 20px;"></iframe>
<p>Android Studio 2.1 actualmente se encuentra disponible como muestra en el canal de
versiones Canary. Si ya
cuentas con Android Studio y no deseas realizar la actualización al canal Canary, puedes
descargar Android Studio 2.1 como una instalación independiente, usarlo
para desarrollar aplicaciones con Android N y así dejar el entorno Android Studio
inalterado.</p>
<p>Para descargar Android Studio 2.1 como una instalación independiente, sigue estos
pasos (si deseas recibir Android Studio 2.1 como una actualización a tu
instalación existente, omite el paso 4):</p>
<ol>
<li>Modifica el nombre de tu
instalación existente de Android Studio y anéxale el número de versión. De esta manera,
la versión nueva no reemplazará a la existente al instalarse.</li>
<li>Descarga el archivo .zip correspondiente para tu sistema operativo desde la
<a href="http://tools.android.com/download/studio/canary/latest">página de descarga del canal Canary</a>.
</li>
<li>Descomprime el paquete y mueve el contenido de Android Studio 2.1 a la ubicación
que corresponda para las aplicaciones de tu sistema. Luego inícialo.</li>
<li>Abre el cuadro de diálogo Settings
(<strong>File &gt; Settings</strong> en Windows y Linux, o
<strong>Android Studio &gt; Preferences</strong> en Mac). En el panel
izquierdo, selecciona <strong>Appearance &amp; Behavior &gt; System Settings &gt;
Updates</strong>.
</li>
<li>En el panel Updates, selecciona la casilla de verificación <strong>Automatically
check updates for</strong> y luego
<strong>Canary Channel</strong> en la lista desplegable.
</li>
</ol>
<p>Mantén esta ventana de configuración abierta para el paso siguiente.</p>
<h2 id="get-sdk">Obtener el N Preview SDK</h2>
<p>Para comenzar a desarrollar proyectos con las API de Android N, debes instalar el
Android N Preview SDK en Android Studio de la siguiente manera:</p>
<ol>
<li>Con el panel Updates aún a la vista (paso 4 anterior),
selecciona la casilla de verificación <strong>Automatically
check updates for Android SDK</strong> y luego
<strong>Preview Channel</strong> en la lista desplegable.
</li>
<li>Haz clic en <strong>Check Now</strong>.</li>
<li>En el panel izquierdo, selecciona <strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>.
<li>Haz clic en la pestaña <strong>SDK Platforms</strong> y luego selecciona la casilla de verificación
<strong>Android N Preview</strong>.</li>
<li>Haz clic en la pestaña <strong>SDK Tools</strong> y luego selecciona las casillas de verificación
<strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong> y
<strong>Android SDK Tools</strong>.
</li>
<li>Haz clic en <strong>OK</strong> y acepta los acuerdos
de licencia para instalar cualquier paquete que se necesite.
</li>
</ol>
<h3 id="docs-dl">Obtener documentación de referencia de la Android N Preview</h3>
<p>
En la documentación de referencia de la Android N Preview, se encuentra disponible información
detallada acerca de las API de Android N. Puedes descargar la documentación de la tabla siguiente.
Este paquete contiene una versión abreviada y de uso sin conexión del sitio web para desarrolladores
de Android, y en ella se incluyen una referencia de API actualizada para las API de Android N y un
informe de diferencia de API.
</p>
<table>
<tr>
<th scope="col">Documentación</th>
<th scope="col">Sumas de comprobación</th>
</tr>
<tr>
<td style="white-space: nowrap">
<a href="{@docRoot}shareables/preview/n-preview-1-docs.zip">n-preview-1-docs.zip</a></td>
<td width="100%">
MD5: 4ab33ccbe698f46f125cc5b807cf9c2f<br>
SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5
</td>
</tr>
<table>
<h2 id="java8">Obtener el JDK y JRE de Java 8</h2>
<p>Para compilar tu aplicación en función de la plataforma de Android N debes usar
el Java 8 Developer Kit (JDK 8), y para usar algunas herramientas con Android
Studio 2.1 debes instalar Java 8 Runtime Environment (JRE 8). Si
aún no cuentas con la última versión de las dos herramientas, descarga JDK 8 y JRE 8
ahora.</p>
<p>Luego configura la versión de JDK en Android Studio de la siguiente manera:</p>
<ol>
<li>Abre un proyecto de Android en Android Studio y luego el
cuadro de diálogo de estructura del proyecto seleccionando <strong>File &gt;
Project Structure</strong>. (Como alternativa, puedes fijar el valor predeterminado
para todos los proyectos seleccionando <strong>File &gt; Other Settings &gt;
Default Project Structure</strong>).
</li>
<li>En el panel izquierdo del cuadro de diálogo, haz clic en <strong>SDK Location</strong>.
</li>
<li>En el campo <strong>JDK Location</strong>, escribe la ubicación del
JDK de Java 8 (haz clic en el botón de la derecha
para explorar tus archivos) y luego haz clic en <strong>OK</strong>.
</li>
</ol>
<img src="{@docRoot}preview/images/studio-jdk-location.jpg" width="700" alt="" />
<h2 id="create-update">Actualizar o crear un proyecto</h2>
<p>
Para usar las API de Android N, debes configurar tu proyecto en forma correspondiente.
</p>
<p>Si planeas usar funciones del lenguaje Java 8, también debes leer
<a href="{@docRoot}preview/j8-jack.html">Funciones del lenguaje Java 8</a>
para obtener información sobre las funciones de Java 8 admitidas y
la manera de configurar tu proyecto con el compilador Jack.</p>
<h3 id="update">Actualizar un proyecto existente</h3>
<p>Abre el archivo
<code>build.gradle</code> de tu módulo y actualiza los valores de la siguiente
manera:
</p>
<pre>
android {
compileSdkVersion <strong>'android-N'</strong>
buildToolsVersion <strong>'24.0.0-rc1'</strong>
...
defaultConfig {
minSdkVersion <strong>'N'</strong>
targetSdkVersion <strong>'N'</strong>
...
}
...
}</pre>
<h3 id="create">Crear un proyecto nuevo</h3>
<p>Si deseas crear un proyecto nuevo para realizar desarrollos con el Android N Preview SDK:</p>
<ol>
<li>Haz clic en <strong>File &gt; New Project</strong> y sigue los pasos correspondientes hasta
llegar a la página Target Android Devices.
</li>
<li>En la página, selecciona la opción <strong>Phone and Tablet</strong>.</li>
<li>En la opción <strong>Phone and Tablet</strong>, dentro de la lista de opciones <strong>Minimum
SDK</strong>, selecciona
<strong>N: Android API 23, N Preview (Preview)</strong>.</li>
</ol>
<h2 id="next">Próximos pasos</h2>
<ul>
<li>Sigue la guía de <a href="{@docRoot}preview/download.html">Prueba en un dispositivo Android N</a>.</li>
<li>Para obtener más información sobre la plataforma de Android N, visita las secciones
<a href="{@docRoot}preview/behavior-changes.html">Cambios en los comportamientos</a>
y <a href="{@docRoot}preview/api-overview.html">API y funciones de Android N
</a>.</li>
</ul>

View File

@@ -0,0 +1,676 @@
page.title=Android N untuk Pengembang
meta.tags="preview", "androidn"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-apis_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Fitur-fitur utama untuk pengembang</h2>
<ol>
<ul style="list-style-type:none;">
<li><a href="#multi-window_support">Dukungan multi-jendela</a></li>
<li><a href="#notification_enhancements">Pemberitahuan</a></li>
<li><a href="#jit_aot">Kompilasi JIT/AOT</a></li>
<li><a href="#quick_path_to_app_install">Jalur cepat untuk menginstal aplikasi</a></li>
<li><a href="#doze_on_the_go">Doze di perjalanan</a></li>
<li><a href="#background_optimizations">Optimisasi latar belakang</a></li>
<li><a href="#data_saver">Data Saver</a></li>
<li><a href="#tile_api">Quick Settings Tile API</a></li>
<li><a href="#number-blocking">Pemblokiran nomor</a></li>
<li><a href="#call_screening">Penyaringan panggilan</a></li>
<li><a href="#multi-locale_languages">Lokal dan bahasa</a></li>
<li><a href="#icu4">ICU4J API di Android</a></li>
<li><a href="#gles_32">OpenGL ES 3.2 API</a></li>
<li><a href="#android_tv_recording">Perekaman Android TV</a></li>
<li><a href="#android_for_work">Android for Work</a></li>
<li><a href="#accessibility_enhancements">Aksesibilitas</a></li>
<li><a href="#direct_boot">Direct Boot</a></li>
<li><a href="#key_attestation">Pengesahan Kunci</a></li>
<li><a href="#network_security_config">Network Security Config</a></li>
<li><a href="#default_trusted_ca">CA Tepercaya Default</a></li>
<li><a href="apk_signature_v2">APK Signature Scheme v2</a></li>
<li><a href="#scoped_directory_access">Scoped Directory Access</a></li>
</ol>
</div>
</div>
<p>Android N masih dalam pengembangan aktif, namun Anda bisa mencobanya
sekarang sebagai bagian dari N Developer Preview. Bagian-bagian di bawah ini akan menyoroti sebagian dari
fitur baru untuk pengembang. </p>
<p>
Pastikan memeriksa <a href="{@docRoot}preview/behavior-changes.html">Perubahan Perilaku</a> untuk mengetahui selengkapnya tentang
bagian-bagian perubahan platform yang bisa memengaruhi aplikasi Anda, lihatlah
panduan pengembang untuk mengetahui selengkapnya tentang fitur-fitur utama, dan unduh <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi API</a> untuk mengetahui detail tentang
API baru.
</p>
<h2 id="multi-window_support">Dukungan multi-jendela</h2>
<p>Di Android N, kami memperkenalkan fitur multitasking baru yang banyak diminta
ke dalam platform &mdash; dukungan multi-jendela. </p>
<p>Pengguna sekarang bisa membuka dua aplikasi sekaligus di layar. </p>
<ul>
<li>Pada ponsel dan tablet
yang menjalankan Android N, pengguna bisa menjalankan dua aplikasi secara berdampingan atau
satu aplikasi di atas yang lain dalam mode layar terbagi. Pengguna bisa mengubah ukuran aplikasi dengan menyeret
pembagi di antara keduanya. </li>
<li>Pada perangkat Android TV, aplikasi bisa menempatkan dirinya sendiri dalam <a href="{@docRoot}preview/features/picture-in-picture.html">mode
gambar-dalam-gambar</a>, sehingga aplikasi bisa terus menampilkan konten sementara pengguna menjelajahi atau
berinteraksi dengan aplikasi lain. Lihat di bawah ini untuk informasi selengkapnya. </li>
</ul>
<div class="col-4of10">
<img src="{@docRoot}preview/images/mw-portrait.png" alt="" style="height:460px;padding-left:1em;" id="img-split-screen" />
<p class="img-caption">
<strong>Gambar 1.</strong> Aplikasi yang dijalankan dalam mode layar terbagi.
</p>
</div>
<p>Terutama pada tablet dan perangkat yang berlayar lebih besar lainnya, dukungan multi-jendela
memberi cara baru untuk memikat pengguna. Anda bahkan bisa mengaktifkan fitur seret-dan-letakkan dalam
aplikasi Anda untuk memudahkan pengguna menyeret konten ke dan dari aplikasi Anda &mdash; cara yang bagus
untuk menyempurnakan pengalaman pengguna. </p>
<p>Tidak sulit menambahkan dukungan multi-jendela ke aplikasi Anda dan mengonfigurasi cara
menangani tampilan multi-jendela. Misalnya, Anda bisa menetapkan dimensi
minimum aktivitas, sehingga mencegah pengguna mengubah ukuran aktivitas di bawah
ukuran itu. Anda juga bisa menonaktifkan tampilan multi-jendela untuk aplikasi Anda, yang
akan memastikan sistem hanya menampilkan aplikasi dalam mode layar penuh.</p>
<p>
Untuk informasi selengkapnya, lihat dokumentasi pengembang <a href="{@docRoot}preview/features/multi-window.html">Dukungan Multi-Jendela</a>.
</p>
<h2 id="notification_enhancements">Penyempurnaan pemberitahuan</h2>
<p>Di Android N kami telah mengubah desain pemberitahuan agar lebih mudah dan lebih cepat
digunakan. Beberapa perubahan tersebut antara lain:</p>
<ul>
<li>
<strong>Pembaruan template</strong>: Kami telah memperbarui template pemberitahuan untuk
lebih menekankan citra pahlawan dan avatar. Pengembang akan dapat
memanfaatkan template baru dengan penyesuaian kode yang minimal.
</li>
<li>
<strong>Bundel pemberitahuan</strong>: Sistem bisa mengelompokkan pesan,
misalnya menurut topik pesan, dan menampilkan kelompok tersebut. Pengguna bisa
mengambil tindakan, misalnya Dismiss atau Archive, atas kelompok pesan tersebut. Jika Anda telah
mengimplementasikan pemberitahuan untuk Android Wear, Anda tentu sudah terbiasa dengan
model ini.
</li>
<li>
<strong>Balasan langsung</strong>: Untuk aplikasi komunikasi real-time, sistem
Android mendukung balasan inline sehingga pengguna bisa membalas
SMS atau pesan teks secara langsung dari dalam antarmuka pemberitahuan.
</li>
<li>
<strong>Tampilan custom</strong>: Dua API baru memungkinkan Anda memanfaatkan dekorasi sistem,
misalnya header pemberitahuan dan tindakan, saat menggunakan tampilan
custom dalam pemberitahuan.
</li>
</ul>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-1.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-3.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-2.png" alt="" style="padding:.5em;max-width:226px">
</div>
<p class="img-caption">
<strong>Gambar 2.</strong> Bundel pemberitahuan dan balasan langsung.
</p>
<p>Untuk mengetahui cara mengimplementasikan fitur-fitur baru ini, lihat panduan
<a href="{@docRoot}preview/features/notification-updates.html">Pemberitahuan</a>.
</p>
<h2 id="jit_aot">Kompilasi JIT/AOT yang dipandu profil</h2>
<p>Di Android N, kami telah menambahkan compiler Just in Time (JIT) dengan pembuatan profil kode ke
ART, yang memungkinkannya terus meningkatkan kinerja aplikasi Android saat
dijalankan. Compiler JIT melengkapi compiler Ahead of Time (AOT) pada ART
dan membantu memperbaiki kinerja runtime, menghemat ruang penyimpanan, dan mempercepat
pembaruan aplikasi serta pembaruan sistem.</p>
<p>Kompilasi yang dipandu profil memungkinkan ART mengelola kompilasi AOT/JIT untuk setiap aplikasi
sesuai dengan penggunaan sebenarnya, serta kondisi pada perangkat. Misalnya,
ART menyimpan profil setiap metode terbaik aplikasi dan bisa melakukan kompilasi lebih awal
serta menyimpan sementara metode-metode tersebut di cache untuk mendapatkan kinerja terbaik. Hal ini membuat bagian lain dari aplikasi
dibiarkan tidak dikompilasi hingga benar-benar digunakan.</p>
<p>Di samping meningkatkan kinerja bagian-bagian penting aplikasi, kompilasi yang dipandu profil
membantu mengurangi footprint RAM keseluruhan aplikasi, termasuk biner
terkait. Fitur ini terutama penting pada perangkat dengan memori minim.</p>
<p>ART mengelola kompilasi yang dipandu profil dengan cara yang meminimalkan dampak terhadap baterai perangkat.
ART melakukan prakompilasi hanya bila perangkat sedang diam dan
mengisi daya, sehingga menghemat waktu dan baterai dengan melakukan pekerjaan tersebut di awal.</p>
<h2 id="quick_path_to_app_install">Jalur cepat untuk menginstal aplikasi</h2>
<p>Salah satu manfaat paling nyata dari compiler JIT pada ART adalah kecepatan instalasi aplikasi
dan pembaruan sistem. Bahkan aplikasi besar yang tadinya perlu beberapa menit untuk
dioptimalkan dan diinstal di Android 6.0 sekarang bisa diinstal hanya dalam hitungan
detik. Pembaruan sistem juga lebih cepat, karena tidak ada lagi langkah pengoptimalan. </p>
<h2 id="doze_on_the_go">Doze di perjalanan...</h2>
<p>Android 6.0 memperkenalkan Doze, yaitu mode sistem yang menghemat baterai dengan menangguhkan
aktivitas CPU dan jaringan di aplikasi bila perangkat sedang diam, misalnya saat
diletakkan di atas meja atau dalam laci. </p>
<p>Sekarang di Android N, Doze jauh lebih maju dan menghemat baterai saat di perjalanan.
Setiap kali layar mati selama jangka waktu tertentu dan perangkat tidak terhubung ke sumber daya,
Doze akan menerapkan subset pembatasan CPU dan jaringan yang sudah familier pada aplikasi.
Ini berarti pengguna bisa menghemat daya baterai meskipun saat membawa perangkat mereka di
saku.</p>
<img src="/preview/images/doze-diagram-1.png" alt="" id="figure1" />
<p class="img-caption">
<strong>Gambar 3.</strong> Doze sekarang menerapkan
pembatasan untuk meningkatkan daya tahan baterai bahkan saat perangkat sedang tidak diam.
</p>
<p>Tidak lama setelah layar mati saat perangkat menggunakan daya baterai, Doze
akan membatasi akses jaringan serta menangguhkan pekerjaan dan sinkronisasi. Selama jeda
pemeliharaan singkat, aplikasi diizinkan mengakses jaringan dan menjalankan semua
pekerjaan/sinkronisasi yang ditangguhkan. Menyalakan layar atau menghubungkan perangkat ke listrik akan
menutup Doze di perangkat.</p>
<p>Bila perangkat dalam kondisi diam lagi, dengan layar mati dan menggunakan daya baterai selama
jangka waktu tertentu, Doze akan menerapkkan pembatasan CPU dan jaringan pada {@link
android.os.PowerManager.WakeLock}, alarm {@link android.app.AlarmManager}, dan
pemindaian GPS/Wi-Fi.</p>
<p>Praktik terbaik untuk menyesuaikan aplikasi Anda dengan Doze adalah sama, baik
perangkat sedang bergerak maupun diam, jadi jika Anda sudah memperbarui aplikasi untuk
menjalankan Doze dengan lancar, berarti Anda sudah siap. Jika belum, mulailah <a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">menyesuaikan
aplikasi Anda dengan Doze</a> sekarang juga.</p>
<h2 id="background_optimizations">Project Svelte: Optimisasi Latar Belakang</h2>
<p>Project Svelte merupakan upaya berkelanjutan untuk meminimalkan penggunaan RAM oleh sistem dan aplikasi
di semua jenis perangkat Android dalam ekosistem. Di Android N, Project
Svelte berfokus pada optimisasi cara aplikasi berjalan di latar belakang. </p>
<p>Pemrosesan latar belakang adalah bagian sangat penting pada sebagian besar aplikasi. Bila ditangani dengan benar, pemrosesan
ini bisa membuat pengalaman pengguna jadi mengagumkan &mdash; segera, cepat, dan sesuai konteks.
Bila tidak ditangani dengan benar, pemrosesan latar belakang bisa menguras RAM (dan
baterai) dengan percuma serta memengaruhi kinerja sistem untuk aplikasi lainnya. </p>
<p>Sejak Android 5.0, {@link android.app.job.JobScheduler} telah menjadi
cara yang disukai untuk melakukan pekerjaan latar belakang dengan cara yang baik
bagi pengguna. Aplikasi bisa menjadwalkan pekerjaan sekaligus memungkinkan sistem mengoptimalkan berdasarkan
kondisi memori, daya, dan konektivitas. JobScheduler menawarkan kontrol serta
kemudahan, dan kami ingin semua aplikasi menggunakannya. </p>
<p>
Opsi baik lainnya adalah <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
<code>GCMNetworkManager</code></a>, bagian dari Google Play Services, yang
menawarkan penjadwalan pekerjaan serupa dengan kompatibilitas pada semua versi lama
Android.
</p>
<p>Kami terus memperluas <code>JobScheduler</code> dan
<code>GCMNetworkManager</code> untuk memenuhi lebih banyak
kasus penggunaan Anda &mdash; misalnya, di Android N Anda sekarang bisa menjadwalkan pekerjaan
latar belakang berdasarkan perubahan di Penyedia Konten. Pada saat yang sama kami mulai
menghilangkan beberapa pola lama yang bisa mengurangi kinerja sistem,
terutama pada perangkat yang minim memori.</p>
<p>Di Android N kami menghilangkan tiga siaran implisit yang umum digunakan &mdash;
{@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}, {@link
android.hardware.Camera#ACTION_NEW_PICTURE}, dan {@link
android.hardware.Camera#ACTION_NEW_VIDEO} &mdash; karena ketiganya bisa mengaktifkan
proses latar belakang pada beberapa aplikasi sekaligus serta menguras memori dan baterai. Jika
aplikasi Anda menerimanya, manfaatkan N Developer Preview untuk
beralih ke <code>JobScheduler</code> dan API terkait sebagai gantinya. </p>
<p>
Lihat dokumentasi <a href="{@docRoot}preview/features/background-optimization.html">Optimisasi
Latar Belakang</a> untuk mengetahui detailnya.
</p>
<h2 id="data_saver">Data Saver</h2>
<div class="col-5of12" style="margin-right:1.5em;">
<img src="{@docRoot}preview/images/datasaver.png" style="border:2px solid #ddd">
<p class="img-caption" style="padding-right:2em;">
<strong>Gambar 4.</strong> Data Saver di Settings.
</p>
</div>
<p>Selama penggunaan perangkat seluler, biaya paket data seluler biasanya
melebihi harga perangkat itu sendiri. Bagi banyak pengguna, adalah sumber daya
mahal yang ingin mereka hemat. </p>
<p>Android N memperkenalkan mode Data Saver, layanan sistem baru yang membantu mengurangi
penggunaan data seluler oleh aplikasi, baik sedang roaming, mendekati siklus akhir penagihan,
atau sedang menggunakan paket data prabayar yang kecil. Data Saver memberi pengguna kemampuan mengontrol cara aplikasi
menggunakan data seluler dan memungkinkan pengembang untuk memberikan layanan yang efisien bila Data
Saver sedang aktif. </p>
<p>Bila pengguna mengaktifkan Data Saver di <strong>Settings</strong> dan perangkat
dalam jaringan berkuota data, sistem akan memblokir penggunaan data latar belakang dan memberi tahu aplikasi
untuk menghemat penggunaan data latar depan &mdash; misalnya dengan membatasi
laju bit untuk streaming, mengurangi kualitas gambar, menangguhkan precaching optimistik,
dan seterusnya. Pengguna bisa memasukkan aplikasi tertentu ke daftar putih untuk memungkinkan penggunaan data berkuota di latar belakang
meskipun saat Data Saver diaktifkan.</p>
<p>Android N menambah {@link android.net.ConnectivityManager} untuk menyediakan
cara bagi aplikasi untuk <a href="{@docRoot}preview/features/data-saver.html#status">mengambil
preferensi Data Saver</a> pengguna dan <a href="{@docRoot}preview/features/data-saver.html#monitor-changes">memantau
perubahan preferensi</a>. Semua aplikasi harus memeriksa apakah pengguna telah mengaktifkan Data
Saver dan melakukan upaya untuk membatasi penggunaan data di latar depan dan latar belakang.</p>
<h2 id="tile_api">Quick Settings Tile API</h2>
<div style="float:right;max-width:320px">
<img src="{@docRoot}preview/images/quicksettings.png" style="padding-left:1.5em;">
<p class="img-caption" style="padding-left:2em;">
<strong>Gambar 5.</strong> Petak Quick Settings dalam bayangan pemberitahuan.
</p>
</div><p>Quick Settings adalah cara populer dan mudah untuk mengekspos pengaturan dan tindakan utama,
langsung dari bayangan pemberitahuan. Di Android N, kami telah memperluas lingkup
Quick Settings untuk membuatnya lebih berguna dan praktis lagi. </p>
<p>Kami telah menambahkan ruang lebih banyak untuk petak Quick Settings tambahan, yang bisa
diakses pengguna di semua bagian area halaman tampilan bernomor dengan mengusap ke kiri atau kanan. Kami juga menyediakan pengguna
kontrol untuk mengatur letak dan petak Quick Settings apa yang akan
ditampilkan &mdash; pengguna bisa menambahkan atau memindahkan petak dengan menyeret dan meletakkannya. </p>
<p>Bagi pengembang, Android N juga menambahkan API baru yang memungkinkan Anda mendefinisikan
petak Quick Settings agar pengguna bisa dengan mudah mengakses kontrol kunci dan tindakan dalam aplikasi Anda.</p>
<p>
Petak Quick Settings dicadangkan untuk kontrol atau tindakan yang
mendesak atau sering digunakan, dan tidak boleh digunakan sebagai pintasan untuk
membuka aplikasi.
</p>
<p>
Setelah mendefinisikan petak, Anda bisa menyediakannya kepada pengguna, yang bisa mereka tambahkan
ke Quick Settings cukup dengan menyeret dan meletakkannya.
</p>
<p>
Untuk informasi tentang pembuatan petak aplikasi, lihat
<code>android.service.quicksettings.Tile</code> dalam <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi API</a> yang bisa diunduh.
</p>
<h2 id="number-blocking">Pemblokiran nomor</h2>
<p>Android N sekarang mendukung pemblokiran nomor di platform dan menyediakan
API kerangka kerja agar penyedia layanan bisa mengelola daftar nomor blokir. Aplikasi
SMS default, aplikasi telepon default, dan aplikasi penyedia layanan bisa membaca dari dan
menulis ke daftar nomor blokir. Daftar ini tidak dapat diakses oleh aplikasi lain.</p>
<p>Dengan membuat pemblokiran nomor sebagai fitur standar pada platformnya, Android menyediakan
cara konsisten bagi aplikasi untuk mendukung pemblokiran nomor di berbagai
perangkat. Manfaat lain yang bisa diperoleh aplikasi antara lain:</p>
<ul>
<li> Nomor yang diblokir untuk panggilan juga akan diblokir untuk SMS
<li> Nomor yang diblokir tetap disimpan saat pengaturan ulang dan pada berbagai perangkat melalui fitur Backup &amp;
Restore.
<li> Beberapa aplikasi sekaligus bisa menggunakan daftar nomor blokir yang sama.
</ul>
<p>Selain itu, dengan integrasi aplikasi operator melalui Android berarti operator bisa
membaca daftar nomor blokir pada perangkat dan melakukan pemblokiran di sisi layanan
bagi pengguna tersebut untuk menghentikan panggilan dan SMS yang tidak diinginkan
agar tidak sampai ke pengguna lewat media apa pun, misalnya VOIP-endpoint atau meneruskan panggilan telepon.</p>
<p>
Untuk informasi selengkapnya, lihat <code>android.provider.BlockedNumberContract</code>
dalam <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi
API</a> yang bisa diunduh.
</p>
<h2 id="call_screening">Penyaringan panggilan</h2>
<p>
Android N memungkinkan aplikasi telepon default untuk menyaring panggilan masuk. Aplikasi
telepon melakukannya dengan mengimplementasikan <code>CallScreeningService</code> baru,
yang memungkinkan aplikasi telepon untuk melakukan sejumlah tindakan berdasarkan
{@link android.telecom.Call.Details Call.Details} panggilan masuk, misalnya:
</p>
<ul>
<li> Menolak panggilan masuk
<li> Tidak mengizinkan panggilan tersebut disimpan ke catatan panggilan
<li> Tidak menampilkan pemberitahuan untuk panggilan tersebut kepada pengguna
</ul>
<p>
Untuk informasi selengkapnya, lihat <code>android.telecom.CallScreeningService</code>
dalam <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi
API</a> yang bisa diunduh.
</p>
<h2 id="multi-locale_languages">Dukungan multilokal, lebih banyak bahasa yang didukung</h2>
<p>Android N sekarang memungkinkan pengguna memilih <strong>multiple locales</strong> dalam Settings,
untuk mendukung kasus penggunaan dua-bahasa secara lebih baik. Aplikasi bisa menggunakan
API baru untuk mendapatkan lokal pilihan pengguna kemudian menawarkan pengalaman pengguna
yang lebih canggih untuk pengguna multilokal &mdash; seperti menampilkan hasil pencarian dalam
beberapa bahasa dan tidak menawarkan untuk menerjemahkan halaman web dalam bahasa
yang sudah diketahui pengguna.</p>
<p>Bersama dukungan multi-lokal, Android N juga memperluas ragam bahasa
yang tersedia untuk pengguna. Masing-masing ditawarkan lebih dari 25 varian untuk bahasa yang umum
digunakan seperti Inggris, Spanyol, Prancis, dan Arab. Juga ditambahkan dukungan
parsial untuk lebih dari 100 bahasa baru.</p>
<p>Aplikasi bisa mendapatkan daftar lokal yang diatur oleh pengguna dengan memanggil <code>LocaleList.GetDefault()</code>. Untuk mendukung jumlah lokal yang diperluas, Android N sedang mengubah cara
mengatasi masalah sumber daya. Pastikan Anda menguji dan memverifikasi bahwa aplikasi Anda
berfungsi seperti yang diharapkan dengan logika resolusi sumber daya baru.</p>
<p>Untuk mempelajari tentang perilaku resolusi sumber daya baru dan praktik terbaik yang
harus Anda ikuti, lihat <a href="{@docRoot}preview/features/multilingual-support.html">Dukungan Multibahasa</a>.</p>
<h2 id="icu4">ICU4J API di Android</h2>
<p>
Android N saat ini menawarkan subset <a href="http://site.icu-project.org/">ICU4J</a> API dalam kerangka kerja Android pada
paket <code>android.icu</code>. Migrasinya mudah, dan kebanyakan hanya
perlu mengubah namespace <code>com.java.icu</code> menjadi
<code>android.icu</code>. Jika Anda sudah menggunakan bundel ICU4J dalam aplikasi
Anda, beralih ke <code>android.icu</code> API yang disediakan dalam kerangka kerja
Android bisa menghasilkan penghematan besar dalam ukuran APK.
</p>
<p>
Untuk mengetahui selengkapnya tentang Android ICU4J API, lihat <a href="{@docRoot}preview/features/icu4j-framework.html">Dukungan ICU4J</a>.
</p>
<h2 id="gles_32">OpenGL&trade; ES 3.2 API</h2>
<p>Android N menambahkan antarmuka kerangka kerja dan dukungan platform untuk OpenGL ES 3.2, termasuk:</p>
<ul>
<li> Semua ekstensi dari <a class="external-link" href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">Android Extension Pack</a></a> (AEP) kecuali untuk <code>EXT_texture_sRGB_decode</code>.
<li> Floating-point framebuffer untuk HDR dan shading yang ditangguhkan.
<li> Panggilan draw BaseVertex agar batching dan streaming jadi lebih baik.
<li> Kontrol akses buffer yang tangguh untuk mengurangi overhead WebGL.
</ul>
<p>Kerangka kerja API untuk OpenGL ES 3.2 pada Android N dilengkapi dengan kelas
<code>GLES32</code>. Saat menggunakan OpenGL ES 3.2, pastikan Anda
mendeklarasikan persyaratan dalam file manifes, dengan tag <code>&lt;uses-feature&gt;</code> dan
atribut <code>android:glEsVersion</code>. </p>
<p>Untuk informasi tentang menggunakan OpenGL ES, termasuk cara memeriksa versi
OpenGL ES yang didukung perangkat saat runtime, lihat <a href="{@docRoot}guide/topics/graphics/opengl.html">Panduan API OpenGL ES</a>.</p>
<h2 id="android_tv_recording">Perekaman Android TV</h2>
<p>Android N menambahkan kemampuan untuk merekam dan memutar kembali konten dari layanan input
Android TV melalui API perekaman baru. Karena dibangun dengan API perekaman yang sudah
ada, layanan input TV bisa mengontrol data saluran apa yang bisa direkam, cara menyimpan
sesi rekaman, dan mengelola interaksi pengguna dengan konten rekaman. </p>
<p>Untuk informasi selengkapnya, lihat <a href="{@docRoot}preview/features/tv-recording-api.html">API Perekaman Android TV</a>.</p>
<h2 id="android_for_work">Android for Work</h2>
<p>Android for Work menambahkan berbagai fitur dan API baru untuk perangkat yang menjalankan Android N.
Beberapa fitur unggulannya ada di bawah ini &mdash; untuk mengetahui daftar lengkap pembaruan Android for Work
yang terkait dengan Android N, lihat Perubahan Android for Work.</p>
<h3 id="work_profile_security_challenge">Pertanyaan keamanan profil pekerjaan </h3>
<p>
Pemilik profil bisa menetapkan pertanyaan keamanan terpisah untuk aplikasi yang berjalan dalam
profil pekerjaan. Pertanyaan pekerjaan ditampilkan bila pengguna berusaha membuka
aplikasi pekerjaan. Jawaban pertanyaan keamanan yang benar akan membuka
profil pekerjaan dan mendekripsinya jika diperlukan. Untuk pemilik profil,
<code>ACTION_SET_NEW_PASSWORD</code> akan meminta pengguna untuk menetapkan pertanyaan
pekerjaan, dan <code>ACTION_SET_NEW_PARENT_PROFILE_PASSWORD</code> meminta
pengguna untuk menetapkan kunci perangkat.
</p>
<p>
Pemilik profil bisa mengatur kebijakan kata sandi yang berbeda untuk pertanyaan pekerjaan
(seperti berapa lama PIN diperlukan, atau apakah sidik jari bisa digunakan
untuk membuka kunci profil) menggunakan <code>setPasswordQuality()</code>,
<code>setPasswordMinimumLength()</code> dan metode terkait. Pemilik
profil juga bisa menetapkan kunci perangkat menggunakan instance <code>DevicePolicyManager</code>
yang dikembalikan oleh metode <code>getParentProfileInstance()</code> baru.
Selain itu, pemilik profil bisa menyesuaikan layar kredensial untuk
pertanyaan pekerjaan dengan metode <code>setOrganizationColor()</code> dan
<code>setOrganizationName()</code> baru.
</p>
<h3 id="turn_off_work">Menonaktifkan pekerjaan </h3>
<p>Pada perangkat dengan profil pekerjaan, pengguna bisa berganti-ganti mode pekerjaan. Bila mode pekerjaan
dinonaktifkan maka pengguna yang dikelola untuk sementara akan dinonaktifkan, sehingga menonaktifkan aplikasi profil
pekerjaan, sinkronisasi latar belakang, dan pemberitahuan. Ini termasuk aplikasi pemilik
profil. Bila mode pekerjaan dinonaktifkan, sistem akan menampilkan ikon status menetap
untuk mengingatkan pengguna bahwa mereka tidak bisa membuka aplikasi pekerjaan. Launcher
akan menunjukkan bahwa aplikasi dan widget pekerjaan tidak bisa diakses. </p>
<h3 id="always_on_vpn">Always on VPN </h3>
<p>Pemilik perangkat dan pemilik profil bisa memastikan bahwa aplikasi pekerjaan selalu terhubung
melalui VPN yang ditetapkan. Sistem secara otomatis akan memulai VPN itu setelah booting
perangkat.</p>
<p>
Metode <code>DevicePolicyManager</code> baru adalah
<code>setAlwaysOnVpnPackage()</code> dan
<code>getAlwaysOnVpnPackage()</code>.
</p>
<p>Karena layanan VPN bisa diikat langsung oleh sistem tanpa interaksi
aplikasi, klien VPN perlu menangani titik masuk baru untuk Always on VPN. Seperti
sebelumnya, layanan ditunjukkan ke sistem melalui
tindakan pencocokan filter intent <code>android.net.VpnService</code>. </p>
<p>
Pengguna bisa secara manual mengatur klien Always on VPN yang mengimplementasikan
metode <code>VPNService</code> dalam pengguna utama dengan menggunakan
<strong>Settings&gt;More&gt;Vpn</strong>.
</p>
<h2 id="accessibility_enhancements">Penyempurnaan aksesibilitas</h2>
<p>Android N saat ini menawarkan Vision Settings langsung di layar Welcome untuk
penyiapan perangkat baru. Ini sangat memudahkan pengguna untuk menemukan dan mengonfigurasi
fitur aksesibilitas pada perangkat mereka, termasuk gerakan untuk memperbesar, ukuran
font, ukuran layar, dan TalkBack. </p>
<p>Dengan fitur aksesibilitas yang penempatannya semakin jelas, pengguna Anda
kemungkinan besar akan mencoba aplikasi dengan fitur-fitur yang diaktifkan itu. Pastikan Anda menguji aplikasi
lebih dini dengan mengaktifkan dahulu pengaturan fitur ini. Anda bisa mengaktifkannya dari Settings &gt;
Accessibility.</p>
<p>Di Android N, layanan aksesibilitas sekarang bisa membantu pengguna yang mengalami gangguan
motorik untuk menyentuh layar. API baru memungkinkan membangun layanan dengan
fitur-fitur seperti pelacakan wajah, pelacakan mata, pemindaian titik, dan seterusnya, untuk
memenuhi kebutuhan para pengguna tersebut.</p>
<p>Untuk informasi selengkapnya, lihat <code>android.accessibilityservice.GestureDescription</code>
dalam <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi API</a> yang bisa diunduh.</p>
<h2 id="direct_boot">Direct Boot</h2>
<p>Direct Boot memperbaiki waktu startup perangkat dan memungkinkan aplikasi
yang telah didaftarkan memiliki fungsionalitas terbatas bahkan setelah reboot tak terduga.
Misalnya, jika perangkat yang direnkripsi melakukan reboot selagi pengguna tidur,
alarm terdaftar, pesan dan panggilan masuk sekarang bisa terus memberi tahu
pengguna seperti biasa. Ini juga berarti layanan aksesibilitas bisa segera
tersedia setelah restart.</p>
<p>Boot langsung memanfaatkan enkripsi berbasis file di Android N
untuk mengaktifkan kebijakan enkripsi yang halus bagi sistem dan data aplikasi.
Sistem akan menggunakan penyimpanan yang dienkripsi dengan perangkat untuk data sistem terpilih dan data
aplikasi yang terdaftar secara eksplisit. Secara default, penyimpanan yang dienkripsi dengan kredensial digunakan untuk semua
data sistem lainnya, data pengguna, aplikasi, dan data aplikasi. </p>
<p>Saat boot, sistem dimulai dalam mode terbatas dengan akses
ke data yang dienkripsi dengan perangkat saja, dan tanpa akses umum ke aplikasi atau data.
Jika Anda memiliki komponen yang ingin Anda jalankan dalam mode ini, Anda bisa mendaftarkannya
dengan mengatur flag dalam manifes. Setelah restart, sistem akan mengaktifkan
komponen terdaftar dengan menyiarkan intent <code>LOCKED_BOOT_COMPLETED</code>.
Sistem akan memastikan data aplikasi yang dienkripsi dengan perangkat tersedia
sebelum membuka kunci. Semua data lainnya tidak tersedia sebelum Pengguna mengonfirmasi kredensial
layar kunci mereka untuk mendekripsinya. </p>
Untuk informasi selengkapnya, lihat <a href="{@docRoot}preview/features/direct-boot.html">Direct Boot</a>.</p>
</p>
<h2 id="key_attestation">Pengesahan Kunci</h2>
<p>Keystore yang didukung perangkat keras menyediakan metode yang jauh lebih aman untuk membuat, menyimpan,
dan menggunakan kunci kriptografi pada perangkat Android. Keystore itu melindungi kunci dari
kernel Linux, potensi kerentanan Android, dan ekstraksi
dari perangkat yang di-root.</p>
<p>Agar lebih mudah dan lebih aman dalam menggunakan keystore yang didukung perangkat keras,
Android N memperkenalkan Pengesahan Kunci. Aplikasi dan perangkat-nonaktif bisa menggunakan Pengesahan
Kunci untuk menentukan apakah pasangan kunci RSA atau EC
didukung perangkat keras, apa properti dari pasangan kunci, dan batasan
apa yang diterapkan terhadap penggunaan dan validitasnya. </p>
<p>Aplikasi dan layanan perangkat-nonaktif bisa meminta informasi tentang pasangan kunci
melalui sertifikat pengesahan X.509 yang harus ditandatangani dengan kunci
pengesahan yang valid. Kunci pengesahan adalah kunci penandatangan ECDSA yang
telah diinjeksikan ke dalam keystore yang didukung perangkat keras pada perangkat saat di pabriknya.
Karena itu, sertifikat pengesahan yang ditandatangani oleh kunci pengesahan yang
valid akan mengonfirmasi keberadaan keystore yang didukung perangkat keras, bersama
detail pasangan kunci dalam keystore itu.</p>
<p>Untuk memastikan perangkat ini menggunakan citra Android resmi yang
aman dari pabrik, Pengesahan Kunci mengharuskan <a class="external-link" href="https://source.android.com/security/verifiedboot/verified-boot.html#bootloader_requirements">bootloader</a> perangkat
menyediakan informasi berikut kepada <a class="external-link" href="https://source.android.com/security/trusty/index.html">Trusted
Execution Environment (TEE)</a>:</p>
<ul>
<li>Versi OS dan level patch yang diinstal pada perangkat</li>
<li>Kunci publik <a href="https://source.android.com/security/verifiedboot/index.html" class="external-link">Verified Boot</a> dan status kunci</li>
</ul>
<p>Untuk informasi selengkapnya tentang fitur keystore yang didukung perangkat keras,
lihat panduan untuk <a href="https://source.android.com/security/keystore/" class="external-link">Keystore yang Didukung Perangkat Keras</a>.</p>
<p>Selain Pengesahan Kunci, Android N juga memperkenalkan
kunci yang terikat sidik jari yang tidak dipanggil saat pendaftaran sidik jari.</p>
<h2 id="network_security_config">Network Security Config</h2>
<p>Di Android N, aplikasi bisa menyesuaikan perilaku koneksi aman mereka
(HTTPS, TLS) secara aman, tanpa modifikasi kode, dengan menggunakan
<em>Network Security Config</em> deklaratif sebagai ganti menggunakan API programatik
konvensional yang rawan kesalahan (misalnya X509TrustManager).</p>
<p>Fitur yang didukung:</p>
<ul>
<li><b>Trust-anchor custom.</b> Memungkinkan aplikasi menyesuaikan Certificate
Authorities (CA) mana yang dipercaya untuk koneksi aman. Misalnya,
mempercayai sertifikat bertanda tangan sendiri tertentu atau serangkaian CA publik terbatas.
</li>
<li><b>Pengesampingan hanya-runut.</b> Memungkinkan pengembang aplikasi merunut
koneksi aman aplikasi mereka secara aman tanpa menambah risiko terhadap basis yang sudah
diinstal.
</li>
<li><b>Keluar dari lalu lintas cleartext.</b> Memungkinkan aplikasi melindungi dirinya sendiri dari
penggunaan lalu lintas cleartext yang tidak disengaja.</li>
<li><b>Penyematan sertifikat.</b> Sebuah fitur canggih yang memungkinkan aplikasi
membatasi kunci server mana yang dipercaya untuk koneksi aman.</li>
</ul>
<p>Untuk informasi selengkapnya, lihat <a href="{@docRoot}preview/features/security-config.html">Network Security
Config</a>.</p>
<h2 id="default_trusted_ca">Certificate Authority Tepercaya Default</h2>
<p>Secara default, aplikasi yang menargetkan Android N hanya mempercayai sertifikat yang disediakan sistem
dan tidak lagi mempercayai Certificate Authorities (CA) yang ditambahkan pengguna. Aplikasi yang menargetkan Android
N dan ingin mempercayai CA yang ditambahkan pengguna harus menggunakan
<a href="{@docRoot}preview/features/security-config.html">Network Security Config</a> untuk
menetapkan cara mempercayai CA pengguna.</p>
<h2 id="apk_signature_v2">APK Signature Scheme v2</h2>
<p>Kelas PackageManager sekarang mendukung verifikasi aplikasi menggunakan
APK Signature Scheme v2. APK Signature Scheme v2 adalah skema tanda tangan seluruh file
yang secara signifikan meningkatkan kecepatan verifikasi dan memperkuat jaminan
integritas dengan mendeteksi setiap perubahan tidak sah terhadap file APK.</p>
<p>Untuk menjaga kompatibilitas mundur, APK harus ditandatangani dengan Signature Scheme
v1 (skema tanda tangan JAR) sebelum ditandatangani dengan Signature Scheme v2.
Dengan Signature Scheme v2, verifikasi akan gagal jika Anda menandatangani APK dengan
sertifikat tambahan setelah menandatangani dengan Signature Scheme v2. </p>
<p>Dukungan APK Signature Scheme v2 akan tersedia nanti dalam N Developer
Preview.</p>
<h2 id="scoped_directory_access">Scoped Directory Access</h2>
<p>Di Android N, aplikasi bisa menggunakan API baru untuk meminta akses ke direktori <a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">penyimpanan
eksternal</a> tertentu, termasuk direktori di media lepas-pasang seperti kartu
SD. API baru ini sangat menyederhanakan cara aplikasi Anda mengakses direktori
penyimpanan eksternal standar, seperti direktori <code>Pictures</code>. Aplikasi
seperti aplikasi foto bisa menggunakan API ini sebagai ganti menggunakan
<code>READ_EXTERNAL_STORAGE</code>, yang memberikan akses ke semua direktori
penyimpanan, atau Storage Access Framework, yang membuat pengguna mengarah ke
direktori tersebut.</p>
<p>Selain itu, API baru ini menyederhanakan langkah-langkah yang diambil pengguna untuk memberikan akses
penyimpanan eksternal ke aplikasi Anda. Bila Anda menggunakan API baru, sistem akan menggunakan UI izin
sederhana yang memperinci dengan jelas direktori apa yang aksesnya diminta
oleh aplikasi.</p>
<p>Untuk informasi selengkapnya, lihat dokumentasi pengembang
<a href="{@docRoot}preview/features/scoped-folder-access.html">Scoped
Directory Access</a>.</p>

View File

@@ -0,0 +1,480 @@
page.title=Perubahan Perilaku
page.keywords=preview,sdk,compatibility
meta.tags="preview", "kompatibilitas"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-changes_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#perf">Peningkatan Kinerja</a>
<ol>
<li><a href="#doze">Doze</a></li>
<li><a href="#bg-opt">Optimisasi Latar Belakang</a></li>
</ol>
</li>
<li><a href="#perm">Perubahan Izin</a></li>
<li><a href="#accessibility">Peningkatan Aksesibilitas</a>
<ol>
<li><a href="#screen-zoom">Zoom Layar</a></li>
<li><a href="#vision-settings">Vision Settings di Setup Wizard</a></li>
</ol>
</li>
<li><a href="#ndk">Menautkan Aplikasi NDK ke Pustaka Platform</a></li>
<li><a href="#afw">Android for Work</a></li>
</ol>
<h2>Lihat Juga</h2>
<ol>
<li><a href="{@docRoot}preview/api-overview.html">
Ikhtisar Android N API</a></li>
</ol>
</div>
</div>
<p>
Selain fitur dan kemampuan baru, Android N
juga menyertakan berbagai perubahan perilaku sistem dan API. Dokumen ini
menyoroti beberapa perubahan utama yang harus dipahami dan diperhitungkan
dalam aplikasi Anda.
</p>
<p>
Jika Anda sebelumnya telah mempublikasikan aplikasi untuk Android, ketahuilah bahwa aplikasi Anda
mungkin akan terpengaruh oleh perubahan dalam platform ini.
</p>
<h2 id="perf">Peningkatan Kinerja</h2>
<p>
Android N berisi perubahan perilaku sistem yang bertujuan meningkatkan daya tahan
baterai perangkat, penggunaan RAM, dan kinerja aplikasi. Perubahan-perubahan ini bisa memengaruhi
ketersediaan sumber daya sistem dan pemberitahuan sistem bagi aplikasi. Anda
harus meninjau perubahan ini dan mengevaluasi cara menyesuaikan aplikasi Anda terhadap perubahan
tersebut.
</p>
<h3 id="doze">Doze</h3>
<p>
Diperkenalkan dalam Android 6.0 (API level 23), Doze meningkatkan daya tahan baterai dengan
menangguhkan aktivitas CPU dan jaringan bila pengguna mencabut steker perangkat,
diam, dan layar dinonaktifkan. Android N
menyempurnakan Doze lebih jauh dengan menerapkan subset CPU dan pembatasan jaringan
bila perangkat dicabut stekernya dan layar dinonaktifkan, namun tidak harus
diam, misalnya, bila handset dibawa bepergian di saku pengguna.
</p>
<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" />
<p class="img-caption">
<strong>Gambar 1.</strong> Ilustrasi tentang cara Doze menerapkan pembatasan
aktivitas sistem tingkat pertama untuk meningkatkan daya tahan baterai.
</p>
<p>
Bila perangkat sedang menggunakan daya baterai, dan layar telah nonaktif selama jangka waktu
tertentu, perangkat akan memasuki Doze dan menerapkan pembatasan subset pertama: Perangkat
akan menutup akses jaringan aplikasi, serta menangguhkan pekerjaan dan sinkronisasi. Jika perangkat
sedang diam selama jangka waktu tertentu setelah memasuki Doze, sistem akan menerapkan pembatasan
Doze lainnya terhadap alarm {@link android.os.PowerManager.WakeLock},
{@link android.app.AlarmManager}, GPS, dan pemindaian Wi-Fi. Tidak peduli
apakah sebagian atau semua pembatasan Doze diterapkan, sistem akan membangunkan
perangkat selama jeda pemeliharaan singkat, dan selama itu aplikasi diizinkan
mengakses jaringan dan bisa mengeksekusi semua pekerjaan/sinkronisasi yang telah ditangguhkan.
</p>
<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
<p class="img-caption">
<strong>Gambar 2.</strong> Ilustrasi tentang cara Doze menerapkan pembatasan
aktivitas sistem tingkat kedua setelah perangkat diam selama jangka waktu tertentu.
</p>
<p>
Perhatikan, mengaktifkan layar atau memasang steker perangkat akan menyebabkan keluar dari Doze dan
menghilangkan pembatasan pemrosesan ini. Perilaku tambahan ini tidak
memengaruhi rekomendasi dan praktik terbaik dalam menyesuaikan aplikasi Anda dengan versi
Doze sebelumnya yang diperkenalkan dalam Android 6.0 (API level 23), seperti yang dibahas di
<a href="{@docRoot}training/monitoring-device-state/doze-standby.html">
Mengoptimalkan untuk Doze dan App Standby</a>. Anda tetap harus
mengikuti rekomendasi itu, seperti menggunakan Google Cloud Messaging (GCM) untuk
mengirim dan menerima pesan, dan mulai merencanakan pembaruan untuk mengakomodasi
perilaku Doze tambahan.
</p>
<h3 id="bg-opt">Project Svelte: Optimisasi Latar Belakang</h3>
<p>
Android N menghilangkan tiga siaran implisit untuk membantu mengoptimalkan
penggunaan memori dan konsumsi daya. Perubahan ini penting karena siaran
implisit sering memulai aplikasi yang telah didaftarkan untuk mendengarkannya di
latar belakang. Menghilangkan siaran ini bisa sangat menguntungkan kinerja perangkat dan pengalaman
pengguna.
</p>
<p>
Perangkat seluler sering mengalami perubahan konektivitas, seperti saat berpindah
antara Wi-Fi dan data seluler. Saat ini, aplikasi bisa memantau perubahan dalam
konektivitas dengan mendaftarkan suatu penerima untuk siaran implisit {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} dalam manifes
mereka. Karena banyak aplikasi yang didaftarkan untuk menerima siaran ini, switch
jaringan tunggal bisa menyebabkan semuanya aktif dan memproses siaran tersebut
secara bersamaan.
</p>
<p>
Demikian pula, aplikasi bisa mendaftar untuk menerima siaran implisit {@link
android.hardware.Camera#ACTION_NEW_PICTURE} dan {@link
android.hardware.Camera#ACTION_NEW_VIDEO} dari aplikasi lain, seperti
Kamera. Bila pengguna mengambil gambar dengan aplikasi Kamera, semua aplikasi ini akan aktif
untuk memproses siaran.
</p>
<p>
Untuk meminimalkan masalah ini, Android N menerapkan optimisasi
berikut:
</p>
<ul>
<li>Aplikasi yang menargetkan Android N tidak menerima siaran {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION}, sekalipun
memiliki entri manifes untuk meminta pemberitahuan mengenai kejadian ini. Aplikasi yang berjalan
di latar depan tetap bisa mendengarkan {@code CONNECTIVITY_CHANGE} pada thread
utama jika meminta pemberitahuan dengan {@link
android.content.BroadcastReceiver}.
</li>
<li>Aplikasi tidak bisa mengirim atau menerima siaran {@link
android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Optimisasi ini
memengaruhi semua aplikasi, bukan hanya yang menargetkan Android N.
</li>
</ul>
<p>
Rilis Android mendatang mungkin akan menghilangkan siaran implisit tambahan,
juga layanan latar belakang tak terikat. Karena itu, Anda harus menghindari atau
menghilangkan dependensi terhadap penerima yang dideklarasikan manifes untuk siaran implisit,
serta layanan latar belakang.
</p>
<p>
Kerangka kerja Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan
siaran implisit atau layanan latar belakang ini. Misalnya, {@link
android.app.job.JobScheduler} API menyediakan mekanisme yang tangguh untuk menjadwalkan
operasi jaringan bila syarat yang ditetapkan terpenuhi, misalnya koneksi ke suatu
jaringan berbiaya tetap. Anda bahkan bisa menggunakan {@link
android.app.job.JobScheduler} untuk bereaksi terhadap perubahan kepada penyedia konten.
</p>
<p>
Untuk informasi selengkapnya tentang perubahan perilaku ini dan cara menyesuaikan aplikasi Anda,
lihat <a href="{@docRoot}preview/features/background-optimization.html">Optimalisasi
Latar Belakang</a>.
</p>
<h2 id="perm">Perubahan Izin</h2>
<p>
Android N menyertakan perubahan pada izin yang bisa memengaruhi aplikasi Anda,
termasuk izin akun pengguna dan izin baru untuk menulis ke
penyimpanan eksternal. Inilah rangkuman izin-izin yang telah berubah dalam
preview:
</p>
<ul>
<li>{@code GET_ACCOUNTS} (Tidak digunakan lagi)
<p>
Izin GET_ACCOUNTS sekarang tidak digunakan lagi. Sistem mengabaikan izin ini
untuk aplikasi yang menargetkan Android N.
</p>
</li>
</ul>
<h2 id="accessibility">Peningkatan Aksesibilitas</h2>
<p>
Android N menyertakan perubahan yang bertujuan meningkatkan kegunaan
platform ini untuk pengguna dengan penglihatan yang kurang atau lemah. Perubahan ini secara umum tidak
akan mengharuskan perubahan kode dalam aplikasi Anda, akan tetapi Anda harus meninjau
fitur ini dan mengujinya dengan aplikasi Anda untuk menilai dampak potensial terhadap pengalaman
pengguna.
</p>
<h3 id="screen-zoom">Zoom Layar</h3>
<p>
Android N memungkinkan pengguna untuk mengatur <strong>Display size</strong> yang akan memperbesar
atau memperkecil semua elemen pada layar, sehingga meningkatkan aksesibilitas perangkat
bagi pengguna yang kurang melihat. Pengguna tidak bisa memperbesar layar melewati lebar layar
minimum <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">
sw320dp</a>, yang merupakan lebar Nexus 4, yakni ponsel ukuran sedang pada umumnya.
</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>Gambar 3.</strong> Layar di sebelah kanan menampilkan efek
penambahan Display size perangkat yang menjalankan citra sistem Android N.
</p>
<p>
Bila densitas perangkat berubah, sistem akan memberi tahu aplikasi yang sedang berjalan dengan
cara berikut:
</p>
<ul>
<li>Jika aplikasi menargetkan API level 23 atau yang lebih rendah, sistem secara otomatis akan mematikan
semua proses latar belakang. Artinya, jika pengguna beralih dari
aplikasi tersebut untuk membuka layar <em>Settings</em> dan mengubah
pengaturan <strong>Display size</strong>, maka sistem akan mematikan aplikasi tersebut dengan cara yang
sama dengan saat memori tinggal sedikit. Jika aplikasi memiliki beberapa proses
latar depan, sistem akan memberi tahu proses tersebut mengenai perubahan konfigurasi seperti
dijelaskan dalam <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani Perubahan
Runtime</a>, seolah-olah orientasi perangkat telah berubah.
</li>
<li>Jika sebuah aplikasi menargetkan Android N, semua prosesnya
(latar depan dan latar belakang) akan diberi tahu mengenai perubahan konfigurasi seperti
dijelaskan dalam <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani Perubahan
Runtime</a>.
</li>
</ul>
<p>
Sebagian besar aplikasi tidak perlu melakukan perubahan untuk mendukung fitur ini, asalkan
aplikasi tersebut mengikuti praktik terbaik Android. Hal-hal tertentu yang harus diperiksa:
</p>
<ul>
<li>Uji aplikasi Anda pada perangkat dengan lebar layar <code><a href=
"{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
dan pastikan aplikasinya berjalan dengan semestinya.
</li>
<li>Bila konfigurasi perangkat berubah, perbarui informasi cache
yang bergantung pada densitas, seperti bitmap di cache atau sumber daya yang dimuat dari
jaringan. Periksa perubahan konfigurasi bila aplikasi melanjutkan dari status dihentikan
sementara.
<p class="note">
<strong>Catatan:</strong> Jika Anda menyimpan sementara data yang bergantung pada konfigurasi, ada
baiknya untuk menyertakan metadata yang relevan seperti ukuran layar
atau densitas piksel yang sesuai untuk data tersebut. Menyimpan metadata ini memungkinkan Anda untuk
memutuskan apakah Anda perlu memperbarui data cache setelah perubahan
konfigurasi.
</p>
</li>
<li>Hindari menetapkan dimensi dengan satuan px, karena satuan ini tidak diskalakan dengan
densitas layar. Sebagai gantinya, tetapkan dimensi dengan satuan <a href="{@docRoot}guide/practices/screens_support.html">piksel yang tidak bergantung densitas
</a> (<code>dp</code>).
</li>
</ul>
<h3 id="vision-settings">Vision Settings di Setup Wizard</h3>
<p>
Android N menyertakan Vision Settings pada layar Welcome, di mana pengguna bisa
menyiapkan pengaturan aksesibilitas berikut pada perangkat baru:
<strong>Magnification gesture</strong>, <strong>Font size</strong>,
<strong>Display size</strong> dan <strong>TalkBack</strong>. Perubahan ini
menambah visibilitas bug yang terkait dengan berbagai pengaturan layar. Untuk
menilai dampak dari fitur ini, Anda harus menguji aplikasi dengan mengaktifkan
pengaturan ini. Anda bisa menemukan pengaturan ini pada <strong>Settings &gt;
Accessibility</strong>.
</p>
<h2 id="ndk">Menautkan Aplikasi NDK ke Pustaka Platform</h2>
<p>
Android N menyertakan perubahan namespace untuk mencegah pemuatan API non-publik.
Jika Anda menggunakan NDK, Anda hanya bisa menggunakan API publik dari platform
Android. Menggunakan API non-publik dalam rilis Android resmi berikutnya
bisa menyebabkan aplikasi mengalami crash.
</p>
<p>
Untuk memperingatkan Anda terhadap penggunaan API non-publik, aplikasi yang berjalan pada perangkat
Android N akan menghasilkan kesalahan output logcat bila sebuah aplikasi memanggil API non-publik.
Kesalahan ini juga ditampilkan pada layar perangkat berupa pesan untuk membantu
meningkatkan kesadaran akan situasi ini. Anda harus meninjau kode aplikasi untuk
menghilangkan penggunaan API platform non-publik dan secara saksama menguji aplikasi Anda menggunakan
perangkat preview atau emulator.
</p>
<p>
Jika aplikasi Anda bergantung pada pustaka platform, lihat dokumentasi NDK untuk
perbaikan tipikal guna menggantikan API privat umum dengan padanan API publik.
Anda mungkin juga menautkan ke pustaka platform tanpa menyadarinya,
terutama jika aplikasi Anda menggunakan pustaka yang merupakan bagian dari platform ini (seperti
<code>libpng</code>), namun bukan bagian dari NDK. Dalam hal ini, pastikan
APK Anda berisi semua file .so yang ingin ditautkan.
</p>
<p class="caution">
<strong>Peringatan:</strong> Beberapa pustaka pihak ketiga mungkin menautkan ke API
non-publik. Jika aplikasi Anda menggunakan pustaka ini, aplikasi Anda mungkin akan crash saat dijalankan
pada rilis resmi Android berikutnya.
</p>
<p>
Aplikasi tidak boleh bergantung pada atau menggunakan pustaka bawaan yang tidak disertakan dalam
NDK, karena bisa mengalami perubahan, atau dipindahkan dari satu rilis Android ke
rilis lainnya. Peralihan dari OpenSSL ke BoringSSL merupakan satu contoh dari perubahan semacam ini.
Selain itu, perbedaan perangkat juga bisa menawarkan tingkat kompatibilitas, karena
tidak ada persyaratan kompatibilitas bagi pustaka platform yang tidak disertakan
dalam NDK. Jika Anda harus mengakses pustaka non-NDK pada perangkat yang lebih lama, jadikan
pemuatan bergantung pada level API Android.
</p>
<p>
Untuk membantu Anda mendiagnosis tipe masalah ini ada beberapa contoh kesalahan Java dan NDK
yang mungkin Anda temui saat berusaha membangun aplikasi dengan Android N:
</p>
<p>Contoh kesalahan 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>Contoh kesalahan NDK:</p>
<pre class="no-pretty-print">
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
</pre>
<p>
Inilah beberapa perbaikan tipikal untuk aplikasi yang mengalami tipe kesalahan ini:
</p>
<ul>
<li>Penggunaan getJavaVM dan getJNIEnv dari libandroid_runtime.so bisa diganti
dengan fungsi JNI standar:
<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>Penggunaan simbol {@code property_get} dari {@code libcutils.so} bisa
diganti dengan {@code __system_property_get} alternatif publik.
Caranya, gunakan {@code __system_property_get} dengan include berikut:
<pre>
#include &lt;sys/system_properties.h&gt;
</pre>
</li>
<li>Penggunaan simbol {@code SSL_ctrl} dari {@code libcrypto.so} harus
diganti dengan aplikasi versi lokal. Misalnya, Anda harus menautkan
{@code libcyrpto.a} secara statis dalam file {@code .so} atau menyertakan
{@code libcrypto.so} Anda sendiri secara dinamis dari BoringSSL atau OpenSSL dalam aplikasi Anda.
</li>
</ul>
<h2 id="afw">Android for Work</h2>
<p>
Android N berisi perubahan untuk aplikasi yang menargetkan Android for Work, termasuk
perubahan pada instalasi sertifikat, pengaturan ulang kata sandi, manajemen pengguna
tambahan, dan akses ke identifier perangkat. Jika Anda membangun aplikasi untuk
lingkungan Android for Work, Anda harus meninjau perubahan ini dan memodifikasi
aplikasi sebagaimana mestinya.
</p>
<ul>
<li>Anda harus menginstal penginstal sertifikat yang didelegasikan sebelum DPC bisa
mengaturnya. Untuk profil dan aplikasi pemilik perangkat yang menargetkan N SDK, Anda harus
menginstal penginstal sertifikat yang didelegasikan sebelum pengontrol kebijakan
perangkat (DPC) memanggil
<code>DevicePolicyManager.setCertInstallerPackage()</code>. Jika penginstal
belum diinstal, sistem akan melontarkan
<code>IllegalArgumentException</code>.
</li>
<li>Pembatasan pengaturan ulang kata sandi untuk admin perangkat sekarang diterapkan kepada pemilik
profil. Admin perangkat tidak bisa lagi menggunakan
<code>DevicePolicyManager.resetPassword()</code> untuk menghapus kata sandi atau mengubah
kata sandi yang sudah ditetapkan. Admin perangkat tetap bisa menetapkan kata sandi, namun hanya
bila perangkat belum memiliki kata sandi, PIN, atau pola.
</li>
<li>Pemilik perangkat dan profil bisa mengelola akun meskipun pembatasan
ditetapkan. Pemilik perangkat dan pemilik profil bisa memanggil Account Management API
sekalipun pembatasan pengguna <code>DISALLOW_MODIFY_ACCOUNTS</code> diberlakukan.
</li>
<li>Pemilik perangkat bisa mengelola pengguna tambahan dengan lebih mudah. bila perangkat
dijalankan dalam mode pemilik perangkat, pembatasan <code>DISALLOW_ADD_USER</code>
secara otomatis ditetapkan. Ini mencegah pengguna membuat pengguna tambahan yang
tidak terkelola. Selain itu, metode <code>CreateUser()</code> dan
<code>createAndInitial()</code> tidak digunakan lagi; metode
<code>DevicePolicyManager.createAndManageUser()</code> baru telah menggantikannya.
</li>
<li>Pemilik perangkat bisa mengakses identifier perangkat. Pemilik perangkat bisa mengakses
alamat MAC Wi-Fi dari sebuah perangkat, menggunakan
<code>DevicePolicyManagewr.getWifiMacAddress()</code>. Jika Wi-Fi belum pernah
diaktifkan pada perangkat tersebut, metode ini akan mengembalikan nilai {@code null}.
</li>
</ul>
<p>
Untuk informasi selengkapnya tentang perubahan pada Android for Work di Android N, lihat
<a href="{@docRoot}preview/features/afw.html">Pembaruan Android for Work</a>.
</p>
<h2 id="other">Poin penting lainnya</h2>
<ul>
<li>Bila aplikasi berjalan pada Android N, namun menargetkan level API yang lebih rendah,
dan pengguna mengubah ukuran tampilan, proses aplikasi akan dimatikan. Aplikasi
harus dapat menangani skenario ini dengan lancar. Jika tidak, maka akan terjadi crash
bila pengguna memulihkannya dari Recents.
<p>
Anda harus menguji aplikasi untuk memastikan
perilaku ini tidak terjadi.
Anda bisa melakukannya dengan menyebabkan suatu crash yang mirip
saat mematikan aplikasi secara manual melalui DDMS.
</p>
<p>
Aplikasi yang menargetkan N dan yang di atasnya tidak secara otomatis dimatikan saat perubahan densitas;
akan tetapi, aplikasi tersebut mungkin tetap merespons perubahan konfigurasi dengan buruk.
</p>
</li>
<li>
Aplikasi pada Android N harus mampu menangani perubahan konfigurasi dengan lancar,
dan tidak boleh mengalami crash pada start selanjutnya. Anda bisa memverifikasi perilaku aplikasi
dengan mengubah ukuran font (<strong>Setting</strong> &gt;
<strong>Display</strong> &gt; <strong>Font size</strong>), kemudian memulihkan
aplikasi dari Recents.
</li>
</ul>

View File

@@ -0,0 +1,541 @@
page.title=Menguji pada Perangkat
meta.tags="preview", "nexus","citra sistem"
page.tags="preview", "androidn"
page.image=images/cards/card-n-downloads_2x.png
@jd:body
<div style="position:relative; min-height:600px">
<div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
<p class="sdk-terms-intro">Sebelum mengunduh dan menginstal
komponen Android Preview SDK, Anda harus menyetujui ketentuan dan persyaratan
berikut.</p>
<h2 class="norule">Ketentuan dan Persyaratan</h2>
<div class="sdk-terms" onfocus="this.blur()" style="width:678px">
Ini adalah Perjanjian Lisensi Android SDK Preview ("Perjanjian Lisensi").
1. Pengantar
1.1 Android SDK Preview (dalam Perjanjian Lisensi ini disebut "Preview" dan secara spesifik termasuk file sistem Android, paket API, dan file pustaka Preview, jika disediakan) diberikan lisensinya kepada Anda sesuai dengan ketentuan Perjanjian Lisensi. The License Agreement forms a legally binding contract between you and Google in Perjanjian Lisensi ini merupakan kontrak yang mengikat secara hukum antara Anda dan dalam kaitannya dengan penggunaan Anda atas Preview.
1.2 "Android" berarti sekumpulan perangkat lunak Android untuk perangkat, seperti yang tersedia pada Android Open Source Project, yang ada di URL berikut: http://source.android.com/, yang selalu diperbarui.
1.3 “Kompatibel denganAndroid” berarti segala implementasi Android yang (i) sesuai dengan Android Compatibility Definition Document, yang bisa ditemukan di situs web kompatibilitas Android (http://source.android.com/compatibility) dan yang selalu diperbarui; serta (ii) berhasil lulus Android Compatibility Test Suite (CTS).
1.4 "Google" berarti Google Inc., perusahaan asal Delaware dengan kantor bisnis utama di 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.
2. Menerima Perjanjian Lisensi
2.1 Agar bisa menggunakan Preview, Anda terlebih dahulu harus menyetujui Perjanjian Lisensi ini. Anda tidak boleh menggunakan SDK jika tidak menerima Perjanjian Lisensi.
2.2 Dengan mengklik untuk menerima dan/atau menggunakan Preview, berarti Anda menyetujui ketentuan Perjanjian Lisensi.
2.3 Anda tidak boleh menggunakan Preview dan tidak boleh menerima Perjanjian Lisensi jika Anda adalah orang yang dilarang menerima Preview berdasarkan hukum Amerika Serikat atau negara lainnya termasuk negara di mana Anda tinggal atau dari mana Anda menggunakan Preview.
2.4 Jika Anda akan menggunakan Preview di lingkungan perusahaan atau organisasi Anda, berarti Anda setuju untuk terikat oleh Perjanjian Lisensi atas nama perusahaan Anda atau entitas lainnya, serta Anda mewakili dan menjamin bahwa Anda memiliki kewenangan hukum penuh untuk mengikat perusahaan Anda atau entitas tersebut pada Perjanjian Lisensi ini. Jika Anda tidak memiliki kewenangan yang disyaratkan, Anda tidak boleh menerima Perjanjian Lisensi atau menggunakan Preview atas nama perusahaan Anda atau entitas lainnya.
3. Lisensi Preview dari Google
3.1 Sesuai dengan ketentuan Perjanjian Lisensi ini, Google memberi Anda lisensi terbatas, bersifat global, bebas royalti, tidak bisa dialihkan, non-eksklusif, dan tidak bisa disublisensikan untuk menggunakan Preview hanya untuk mengembangkan aplikasi bagi implementasi Android yang kompatibel.
3.2 Anda tidak boleh menggunakan Preview ini untuk mengembangkan aplikasi bagi platform lain (termasuk implementasi Android yang tidak kompatibel) atau untuk mengembangkan SDK lain. Tentu saja Anda bebas mengembangkan aplikasi bagi platform lainnya, termasuk implementasi Android yang tidak kompatibel, asalkan Preview ini tidak digunakan untuk keperluan itu.
3.3 Anda setuju bahwa Google atau pihak ketiga memiliki semua hak, kuasa dan kepentingan hukum dalam dan pada Preview, termasuk Hak Kekayaan Intelektual yang terdapat dalam Preview. "Hak Kekayaan Intelektual" berarti setiap dan semua hak yang berdasarkan pada hukum paten, hukum hak cipta, hukum rahasia dagang, hukum merek dagang, dan setiap dan semua hak kepemilikan lainnya. Google memiliki semua hak yang tidak secara tersurat diberikan kepada Anda.
3.4 Anda tidak boleh menggunakan Preview untuk tujuan apa pun yang tidak secara tersurat diizinkan oleh Perjanjian Lisensi. Kecuali sejauh yang diperlukan oleh lisensi pihak ketiga yang berlaku, Anda tidak boleh: (a) menyalin (kecuali untuk keperluan pencadangan), memodifikasi, mengadaptasi, mendistribusikan kembali, mendekompilasi, merekayasa balik, membongkar atau membuat karya turunan dari Preview atau bagian apa pun dari Preview; atau (b) memuat bagian apa pun dari Preview ke sebuah handset ponsel atau perangkat keras selain komputer pribadi, menggabungkan suatu bagian dari Preview dengan perangkat lunak lain, atau mendistribusikan perangkat lunak atau perangkat yang menggabungkan suatu bagian dari Preview.
3.5 Penggunaan, reproduksi dan distribusi komponen Preview yang berlisensi perangkat lunak sumber terbuka diatur semata-mata oleh ketentuan lisensi perangkat lunak sumber terbuka tersebut dan bukan oleh Perjanjian Lisensi ini. Anda menyetujui bagian selebihnya dari lisensi dengan maksud baik sehubungan dengan lisensi perangkat lunak sumber terbuka tersebut sesuai dengan semua hak yang diberikan dan untuk menahan diri dari segala tindakan yang mungkin akan mengakhiri, menangguhkan, atau melanggar hak tersebut.
3.6 Anda setuju bahwa bentuk dan sifat Preview yang disediakan oleh Google dapat berubah tanpa pemberitahuan sebelumnya kepada Anda dan bahwa versi Preview mendatang mungkin tidak kompatibel dengan aplikasi yang dikembangkan di versi Preview sebelumnya. Anda setuju bahwa Google boleh menghentikan (secara permanen atau sementara) penyediaan Preview (atau fitur apa pun dalam Preview) kepada Anda atau pengguna pada umumnya atas kebijakan Google semata, tanpa pemberitahuan sebelumnya kepada Anda.
3.7 Perjanjian Lisensi ini tidak memberi Anda hak untuk menggunakan nama dagang, merek dagang, merek layanan, logo, nama domain, atau fitur merek khas Google lainnya.
3.8 Anda setuju bahwa Anda tidak akan menghapus, mengaburkan, atau mengubah pernyataan hak kepemilikan apa pun (termasuk pemberitahuan hak cipta dan merek dagang) yang terlampir atau termuat dalam Preview.
4. Penggunaan Preview oleh Anda
4.1 Google setuju bahwa tidak ada dalam Perjanjian Lisensi ini yang memberi Google suatu hak, kuasa atau kepentingan dari Anda (atau pemberi lisensi Anda) berdasarkan Perjanjian Lisensi ini dalam atau pada aplikasi perangkat lunak apa pun yang Anda kembangkan menggunakan Preview, termasuk hak kekayaan intelektual yang terdapat dalam aplikasi tersebut.
4.2 Anda setuju untuk menggunakan Preview dan mengembangkan aplikasi hanya untuk tujuan yang diizinkan oleh (a) Perjanjian Lisensi ini dan (b) hukum yang berlaku, peraturan atau praktik atau panduan yang diterima secara umum di yurisdiksi yang relevan (termasuk hukum mengenai ekspor data atau perangkat lunak ke dan dari Amerika Serikat atau negara lain yang relevan).
4.3 Anda setuju bahwa jika Anda menggunakan Preview untuk mengembangkan aplikasi, Anda akan melindungi privasi dan hak hukum penggunanya. Jika pengguna memberikan nama pengguna, kata sandi, atau informasi login atau informasi pribadinya lainnya, Anda harus membuat pengguna tersebut menyadari bahwa informasi tersebut akan bisa digunakan oleh aplikasi Anda, dan Anda harus memberikan perlindungan dan pemberitahuan privasi yang memadai secara hukum bagi pengguna tersebut. Jika aplikasi Anda menyimpan informasi pribadi atau sensitif yang diberikan oleh pengguna, aplikasi Anda harus melakukannya dengan aman. Jika pengguna memberikan informasi Akun Google, aplikasi Anda hanya boleh menggunakan informasi tersebut untuk mengakses Akun Google pengguna tersebut bila, dan untuk tujuan terbatas di mana, setiap pengguna telah memberikan izin kepada Anda untuk melakukannya.
4.4 Anda setuju bahwa Anda tidak akan terlibat dalam aktivitas apa pun dengan Preview, termasuk pengembangan atau distribusi aplikasi yang mengganggu, mengacaukan, merusak, atau mengakses secara tidak sah server, jaringan atau properti atau layanan pihak ketiga lainnya dari Google atau pihak ketiga.
4.5 Anda setuju untuk bertanggung jawab penuh terhadap (dan bahwa Google tidak bertanggung jawab terhadap Anda atau pihak ketiga untuk) data, konten, atau sumber daya apa pun yang Anda buat, kirimkan atau tampilkan melalui Android dan/atau aplikasi untuk Android, dan terhadap konsekuensi tindakan Anda (termasuk kerugian atau kerusakan apa pun yang mungkin dialami Google) karena melakukannya.
4.6 Anda setuju bertanggung jawab penuh terhadap (dan bahwa Google tidak bertanggung jawab terhadap Anda atau pihak ketiga lainnya untuk) pelanggaran kewajiban Anda berdasarkan Perjanjian Lisensi ini, kontrak pihak ketiga yang berlaku atau Ketentuan Layanan, atau hukum atau peraturan yang berlaku, dan terhadap konsekuensi (termasuk kerugian atau kerusakan yang mungkin dialami Google atau pihak ketiga) akibat pelanggaran tersebut.
4.7 Preview sedang dalam pengembangan, dan pengujian serta umpan balik Anda merupakan bagian penting dari proses pengembangan ini. Dengan menggunakan Preview, Anda mengakui bahwa implementasi sebagian fitur masih dalam tahap pengembangan dan bahwa Anda tidak akan berharap bahwa Preview memiliki fungsionalitas penuh rilis stabil. Anda setuju untuk tidak mendistribusikan atau memasarkan kepada umum aplikasi yang menggunakan Preview ini karena Preview ini tidak akan didukung lagi setelah Android SDK resmi dirilis.
5. Kredensial Pengembang Anda
5.1 Anda setuju bertanggung jawab untuk menjaga kerahasiaan semua kredensial pengembang yang mungkin diberikan Google kepada Anda atau yang mungkin Anda pilih sendiri dan bahwa Anda akan bertanggung jawab penuh terhadap semua aplikasi yang dikembangkan dengan kredensial pengembang Anda.
6. Privasi dan Informasi
6.1 Untuk terus berinovasi dan meningkatkan Preview, Google boleh mengumpulkan statistik penggunaan tertentu dari perangkat lunak termasuk namun tidak terbatas pada identifier unik, alamat IP terkait, nomor versi perangkat lunak, dan informasi yang menjadi tempat penggunaan alat dan/atau layanan dalam Preview dan cara penggunaannya. Sebelum informasi ini dikumpulkan, Preview akan memberi tahu dan meminta persetujuan Anda. Jika Anda tidak memberikan persetujuan, informasi tersebut tidak akan dikumpulkan.
6.2 Data yang dikumpulkan akan diperiksa secara agregat untuk meningkatkan Preview dan dikelola sesuai dengan Kebijakan Privasi Google yang terdapat di http://www.google.com/policies/privacy/.
7. Aplikasi Pihak Ketiga
7.1 Jika Anda menggunakan Preview untuk menjalankan aplikasi yang dikembangkan oleh pihak ketiga atau yang mengakses data, konten atau sumber daya yang disediakan oleh pihak ketiga, Anda setuju bahwa Google tidak bertanggung jawab terhadap aplikasi, data, konten atau sumber daya tersebut. Anda memahami bahwa semua data, konten atau sumber daya yang mungkin Anda akses melalui aplikasi pihak ketiga merupakan tanggung jawab penuh dari pihak yang menjadi asal data tersebut dan Google tidak bertanggung jawab terhadap kerugian atau kerusakan apa pun yang mungkin Anda alami sebagai akibat menggunakan atau mengakses aplikasi, data, konten, atau sumber daya pihak ketiga tersebut.
7.2 Anda harus menyadari bahwa data, konten dan sumber daya yang diberikan kepada Anda melalui aplikasi pihak ketiga mungkin dilindungi oleh hak kekayaan intelektual yang dimiliki oleh penyedia (atau oleh orang lain atau perusahaan atas nama mereka). Anda tidak boleh memodifikasi, menyewakan, menyewabelikan, meminjamkan, menjual, mendistribusikan atau membuat karya turunan berdasarkan data, konten, atau sumber daya ini (baik secara keseluruhan atau sebagian) kecuali Anda secara khusus diberikan izin untuk melakukannya oleh pemilik yang bersangkutan.
7.3 Anda mengakui bahwa penggunaan Anda atas aplikasi, data, konten, atau sumber daya pihak ketiga semacam itu tunduk pada ketentuan terpisah antara Anda dan pihak ketiga yang bersangkutan.
8. Menggunakan API Google
8.1 API Google
8.1.1 Jika Anda menggunakan API (Antarmuka Pemrograman Aplikasi) untuk mengambil data dari Google, Anda mengakui bahwa data tersebut dilindungi hak kekayaan intelektual yang dimiliki Google atau pihak-pihak yang menyediakan data (atau oleh orang lain atau perusahaan atas nama mereka). Penggunaan API oleh Anda tunduk pada Ketentuan Layanan tambahan. Anda tidak boleh memodifikasi, menyewakan, menyewabelikan, meminjamkan, menjual, mendistribusikan atau membuat karya turunan berdasarkan data ini (baik secara keseluruhan atau sebagian) kecuali diizinkan oleh Ketentuan Layanan yang bersangkutan.
8.1.2 Jika Anda menggunakan API dalam bentuk apa pun untuk mengambil data pengguna dari Google, Anda mengakui dan menyetujui bahwa Anda akan mengambil data hanya dengan persetujuan yang jelas dari pengguna dan hanya bila, dan sebatas keperluan yang diizinkan oleh pengguna tersebut untuk Anda lakukan.
9. Mengakhiri Perjanjian Lisensi
9.1 Perjanjian Lisensi ini akan terus berlaku hingga diakhiri oleh Anda atau Google sebagaimana diatur di bawah ini.
9.2 Jika Anda ingin mengakhiri Perjanjian Lisensi ini, Anda boleh melakukannya dengan menghentikan penggunaan Preview dan kredensial pengembang yang relevan.
9.3 Google boleh mengakhiri Perjanjian Lisensi ini dengan Anda kapan saja, dengan atau tanpa sebab, setelah memberi tahu Anda.
9.4 Perjanjian Lisensi akan berakhir secara otomatis tanpa pemberitahuan atau tindakan lainnya bila, mana saja yang lebih dahulu:
(A) Google berhenti menyediakan Preview atau bagian Preview tertentu kepada pengguna di negara tempat Anda tinggal atau negara tempat asal Anda menggunakan layanan; dan
(B) Google mengeluarkan versi rilis final dari Android SDK.
9.5 Bila Perjanjian Lisensi berakhir, lisensi yang telah diberikan kepada Anda dalam Perjanjian Lisensi akan berakhir pula, Anda akan segera menghentikan semua penggunaan Preview, dan ketetapan paragraf 10, 11, 12, dan 14 akan terus berlaku secara tak terbatas.
10. SANGGAHAN
10.1 ANDA SEPENUHNYA MEMAHAMI DAN MENYETUJUI BAHWA PENGGUNAAN PREVIEW OLEH ANDA MERUPAKAN RISIKO ANDA SENDIRI DAN BAHWA PREVIEW INI DISEDIAKAN "APA ADANYA" DAN "SEBAGAIMANA TERSEDIA" TANPA JAMINAN DALAM BENTUK APA PUN DARI GOOGLE.
10.2 PENGGUNAAN PREVIEW DAN MATERI APA PUN YANG DIUNDUH ATAU DIPEROLEH MELALUI PENGGUNAAN PREVIEW OLEH ANDA ADALAH ATAS KEHENDAK DAN RISIKO ANDA SENDIRI DAN ANDA BERTANGGUNG JAWAB PENUH TERHADAP KERUSAKAN PADA SISTEM KOMPUTER ATAU PERANGKAT LAIN ATAU HILANGNYA DATA AKIBAT PENGGUNAANNYA. TANPA MEMBATASI HAL TERSEBUT, ANDA MEMAHAMI BAHWA PREVIEW BUKANLAH RILIS STABIL DAN MUNGKIN BERISI KESALAHAN, CACAT, DAN RISIKO KEAMANAN YANG BISA MENGAKIBATKAN KERUSAKAN SIGNIFIKAN, TERMASUK KEHILANGAN PENGGUNAAN ATAS SISTEM KOMPUTER ANDA ATAU PERANGKAT LAIN DENGAN SEPENUHNYA DAN TIDAK BISA DIPULIHKAN LAGI.
10.3 GOOGLE LEBIH LANJUT MENYANGGAH SEMUA JAMINAN DAN PERSYARATAN APA PUN, BAIK TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN TERSIRAT DAN PERSYARATAN MENGENAI DAYA JUAL, KESESUAIAN DENGAN TUJUAN TERTENTU, DAN NON-PELANGGARAN.
11. PEMBATASAN KEWAJIBAN
11.1 ANDA SEPENUHNYA MEMAHAMI DAN MENYETUJUI BAHWA GOOGLE, ANAK PERUSAHAAN DAN AFILIASINYA, DAN PEMBERI LISENSINYA TIDAK AKAN BERTANGGUNG JAWAB KEPADA ANDA BERDASARKAN TEORI KEWAJIBAN TERHADAP SEGALA KERUGIAN LANGSUNG, TIDAK LANGSUNG, INSIDENTAL, KHUSUS, JANGKA PANJANG ATAU GANTI RUGI YANG DIAKIBATKAN OLEH ANDA, TERMASUK HILANGNYA DATA, WALAUPUN GOOGLE ATAU PERWAKILANNYA TELAH DIBERI TAHU ATAU SEHARUSNYA MENGETAHUI KEMUNGKINAN TIMBULNYA KEHILANGAN TERSEBUT.
12. Penggantian Kerugian
12.1 Sejauh maksimum yang diizinkan oleh hukum, Anda setuju untuk membela, mengganti kerugian dan melepaskan tanggung jawab Google, afiliasinya beserta direksi, petugas, karyawan dan agennya dari dan terhadap setiap dan semua klaim, tindakan, gugatan, proses hukum, serta setiap dan semua kehilangan, kewajiban, kerusakan, biaya dan pengeluaran (termasuk biaya pengacara yang sewajarnya) yang timbul atau diakibatkan dari (a) penggunaan Preview oleh Anda, (b) aplikasi apa pun yang Anda kembangkan dari Preview yang melanggar Hak Kekayaan Intelektual seseorang atau mencemarkan nama baik seseorang atau melanggar hak mereka berkaitan dengan publisitas atau privasi, dan (c) ketidakpatuhan Anda terhadap Perjanjian Lisensi ini.
13. Perubahan Perjanjian Lisensi
13.1 Google boleh membuat perubahan pada Perjanjian Lisensi saat mendistribusikan versi baru Preview. Saat perubahan tersebut dibuat, Google akan menyediakan versi baru Perjanjian Lisensi di situs web penyediaan Preview.
14. Ketentuan Hukum Umum
14.1 Perjanjian Lisensi ini merupakan perjanjian hukum antara Anda dan Google dan mengatur penggunaan Preview oleh Anda (tidak termasuk layanan apa pun yang mungkin disediakan Google untuk Anda dalam perjanjian tertulis terpisah), dan sepenuhnya menggantikan perjanjian sebelumnya antara Anda dan Google dalam kaitannya dengan Preview.
14.2 Anda setuju bahwa jika Google tidak menjalankan atau menerapkan hak atau upaya hukum yang terkandung dalam Perjanjian Lisensi ini (atau bila Google memiliki kewenangan berdasarkan hukum yang berlaku), tindakan ini tidak akan dianggap sebagai pelepasan hak secara resmi oleh Google dan bahwa hak atau upaya hukum tersebut akan tetap bisa digunakan oleh Google.
14.3 Jika persidangan hukum yang berwenang untuk memutuskan perkara ini menetapkan bahwa ada ketetapan Perjanjian Lisensi ini yang tidak berlaku, maka ketetapan tersebut akan dihapus dari Perjanjian Lisensi tanpa memengaruhi bagian selebihnya dari Perjanjian Lisensi ini. Ketetapan selebihnya dari Perjanjian Lisensi ini akan tetap sah dan berlaku.
14.4 Anda mengakui dan menyetujui bahwa setiap anggota dari kelompok perusahaan yang diinduki oleh Google akan menjadi pihak ketiga penerima manfaat dari Perjanjian Lisensi ini dan bahwa perusahaan tersebut berhak untuk secara langsung memberlakukan, dan bergantung pada, ketetapan yang dimuat dalam Perjanjian Lisensi ini yang memberikan manfaat (atau hak yang mendukung) kepada mereka. Selain yang telah disebutkan di atas, tidak ada orang atau perusahaan lain yang akan menjadi pihak ketiga penerima manfaat dari Perjanjian Lisensi ini
14.5 PEMBATASAN EKSPOR. PREVIEW TUNDUK PADA HUKUM DAN PERATURAN EKSPOR AMERIKA SERIKAT. ANDA HARUS MEMATUHI SEMUA HUKUM DAN PERATURAN NASIONAL DAN INTERNASIONAL YANG BERLAKU PADA PREVIEW. HUKUM INI MENYERTAKAN PEMBATASAN ATAS TUJUAN, PENGGUNA AKHIR DAN PENGGUNAAN AKHIR.
14.6 Perjanjian Lisensi ini tidak boleh diberikan atau dialihkan baik oleh Anda tanpa persetujuan tertulis sebelumnya dari Google, dan upaya apa pun untuk mengalihkannya tanpa persetujuan akan menjadi tidak sah. Anda tidak boleh mendelegasikan tanggung jawab atau kewajiban berdasarkan Perjanjian Lisensi ini tanpa persetujuan tertulis sebelumnya dari Google.
14.7 Perjanjian Lisensi ini, dan hubungan Anda dengan Google berdasarkan Perjanjian Lisensi ini, diatur oleh hukum Negara Bagian California tanpa mengindahkan pertentangan ketetapan hukumnya. Anda dan Google setuju untuk tunduk pada yurisdiksi eksklusif pengadilan yang berlokasi di county Santa Clara, California untuk menyelesaikan segala masalah hukum yang timbul dari Perjanjian Lisensi ini. Meski demikian, Anda setuju bahwa Google akan tetap diizinkan untuk mengajukan upaya hukum (atau tipe keringanan hukum setara yang mendesak) dalam yurisdiksi apa pun.
</div><!-- sdk terms -->
<div id="sdk-terms-form">
<p>
<input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
<label id="agreeLabel" for="agree">Saya telah membaca dan menyetujui ketentuan dan persyaratan di atas</label>
</p>
<p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
</div>
</div><!-- end TOS -->
<div id="landing">
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#device-preview">Menyiapkan perangkat keras</a>
<ol>
<li><a href="#ota">Mendapatkan pembaruan lewat jaringan seluler</a></li>
<li><a href="#flash">Mem-flash perangkat secara manual</a></li>
<li><a href="#revertDevice">Menghapus instalasi</a></li>
</ol>
</li>
<li><a href="#setupAVD">Menyiapkan emulator</a></li>
</ol>
</div>
</div>
<p>
Untuk menjalankan dan menguji aplikasi Anda pada platform baru, Anda perlu menyiapkan lingkungan runtime
Android N. Anda bisa melakukannya dengan salah satu cara ini:
</p>
<ul>
<li>Instal Android N pada perangkat keras yang didukung, atau</li>
<li>Siapkan emulator Android yang menjalankan Android N</li>
</ul>
<p>
Jika Anda ingin lingkungan untuk pengujian kompatibilitas dasar aplikasi Anda pada
platform baru, maka Anda hanya perlu APK saat ini dan perangkat keras atau
emulator. Anda tidak perlu memperbarui lingkungan
pengembangan penuh untuk melakukan pengujian dasar.
</p>
<p>
Jika Anda ingin memodifikasi aplikasi untuk menargetkan Android N atau menggunakan API baru Android N,
Anda perlu menyiapkan lingkungan pengembangan yang telah diperbarui untuk mendukung
Android N. <a href="{@docRoot}preview/setup-sdk.html">Menyiapkan Pengembangan
Android N</a> berisi detail mengenai hal ini.
</p>
<h2 id="device-preview">Menyiapkan perangkat keras</h2>
<p>
N Developer Preview menawarkan pembaruan sistem untuk berbagai jenis perangkat keras
yang bisa Anda gunakan untuk menguji aplikasi Anda, dari ponsel hingga tablet dan TV.
</p>
<p>
Jika Anda memiliki akses ke perangkat yang didukung, Anda bisa memperbaruinya ke build tahapan pencapaian Developer
Preview dengan salah satu cara berikut:
</p>
<ul>
<li><strong>Daftarkan perangkat dalam pembaruan sistem OTA otomatis</strong> melalui
<a href="https://g.co/androidbeta">Android Beta Program</a>. Setelah didaftarkan, perangkat Anda akan menerima pembaruan
lewat jaringan seluler (OTA) untuk semua build tahapan pencapaian dalam N Developer Preview. Pendekatan
ini disarankan karena akan membantu Anda melakukan transisi secara mulus dari lingkungan saat ini
ke berbagai rilis N Developer Preview.</li>
<li><strong>Unduh citra sistem a Developer Preview dan flash perangkat</strong>.
Pembaruan OTA tidak disediakan secara otomatis untuk perangkat yang Anda flash secara manual, namun
Anda bisa mendaftarkan perangkat tersebut dalam Android Beta Program untuk memperoleh pembaruan OTA. </li>
</ul>
<h3 id="ota">Mendaftarkan perangkat dalam pembaruan OTA otomatis</h3>
<p>
Jika Anda memiliki akses ke perangkat yang didukung (lihat daftar dalam tabel
Unduhan), Anda bisa menerima pembaruan lewat jaringan seluler ke versi preview Android
dengan mendaftarkan perangkat itu ke <a href="https://g.co/androidbeta">Android Beta Program</a>. Pembaruan ini
secara otomatis akan diunduh dan memperbarui perangkat Anda seperti
pembaruan sistem resmi.
</p>
<p>
Anda bisa membatalkan pendaftaran perangkat kapan saja. Perangkat akan menerima pembaruan OTA
ke versi produksi terbaru Android yang tersedia untuk perangkat itu
(misalnya, Android 6.0 Marshmallow). Pembaruan mengharuskan pengaturan ulang
perangkat secara penuh, jadi data pengguna pada perangkat itu akan dihapus. Pastikan <strong>mencadangkan
data penting</strong> sebelum membatalkan pendaftaran perangkat.
</p>
<p>
Untuk informasi selengkapnya dan untuk mendaftarkan perangkat Anda, lihat
situs web <a href="https://g.co/androidbeta">Android Beta Program</a>.
</p>
<p class="note"><strong>Catatan:</strong>
Membatalkan pendaftaran mengharuskan pengaturan ulang perangkat secara penuh. Cadangkan
data penting terlebih dahulu.
</p>
<h3 id="flash">Mem-flash perangkat secara manual</h3>
<p>
Anda bisa mengunduh citra sistem Developer Preview terbaru dan
mem-flash-nya secara manual ke perangkat Anda. Lihat tabel di bawah untuk mengunduh citra sistem
bagi perangkat pengujian Anda. Mem-flash perangkat secara manual berguna jika Anda harus
mengontrol secara persis lingkungan pengujian tersebut atau harus menginstal ulang secara rutin,
misalnya untuk pengujian otomatis.
</p>
<!-- You can flash by ota or system image --><p>
Menginstal citra sistem pada perangkat <strong>akan menghapus semua data dari
perangkat</strong>, karena itu Anda harus mencadangkan data terlebih dahulu.
</p>
<p>
Setelah Anda mencadangkan data perangkat dan mengunduh citra sistem di bawah ini yang
sesuai dengan perangkat Anda, ikuti instruksi di <a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
untuk mem-flash citra ini ke perangkat Anda.
</p>
<p>
Mem-flash citra sistem secara manual <strong>
tidak secara otomatis akan menerima pembaruan OTA</strong> ke build
tahapan pencapaian Developer Preview terbaru. Pastikan lingkungan Anda selalu diperbarui dan lakukan flash
citra sistem yang baru di setiap tahapan pencapaian Developer Preview.
</p>
<p>
Jika Anda memutuskan ingin mendapatkan pembaruan OTA setelah mem-flash perangkat secara manual,
Anda tinggal mendaftarkan perangkat dalam <a href="https://g.co/androidbeta">
Android Beta Program</a>. Anda bisa mendaftarkan perangkat kapan saja untuk menerima pembaruan Preview
berikutnya lewat jaringan seluler.
</p>
<table>
<tr>
<th scope="col">Perangkat</th>
<th scope="col">Unduhan / Checksum</th>
</tr>
<tr id="bullhead">
<td>Nexus 5X <br>"bullhead"</td>
<td><a href="#top" onclick="onDownload(this)">bullhead-npc56p-preview-6c877a3d.tgz</a><br>
MD5: b5cf874021023b398f5b983b24913f5d<br>
SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a
</td>
</tr>
<tr id="shamu">
<td>Nexus 6 <br>"shamu"</td>
<td><a href="#top" onclick="onDownload(this)">shamu-npc56p-preview-54b13c67.tgz</a><br>
MD5: af183638cf34e0eb944a1957d7696f60<br>
SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973
</td>
</tr>
<tr id="angler">
<td>Nexus 6P <br>"angler"</td>
<td><a href="#top" onclick="onDownload(this)">angler-npc56p-preview-85ffc1b1.tgz</a><br>
MD5: bc4934ea7bd325753eee1606d3725a24<br>
SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588
</td>
</tr>
<tr id="volantis">
<td>Nexus 9 <br>"volantis"</td>
<td><a href="#top" onclick="onDownload(this)">volantis-npc56p-preview-0e8ec8ef.tgz</a><br>
MD5: c901334c6158351e945f188167ae56f4<br>
SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4
</td>
</tr>
<tr id="volantisg">
<td>Nexus 9G <br>"volantisg"</td>
<td><a href="#top" onclick="onDownload(this)">volantisg-npc56p-preview-1bafdbfb.tgz</a><br>
MD5: 7bb95bebc478d7257cccb4652899d1b4<br>
SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6
</td>
</tr>
<tr id="fugu">
<td>Nexus Player <br>"fugu"</td>
<td><a href="#top" onclick="onDownload(this)">fugu-npc56r-preview-7027d5b6.tgz</a><br>
MD5: f5d3d8f75836ccfe4c70e8162e498be4<br>
SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b
</td>
</tr>
<tr id="ryu">
<td>Pixel C <br>"ryu"</td>
<td><a href="#top" onclick="onDownload(this)">ryu-npc56p-preview-335a86a4.tgz</a><br>
MD5: 4e21fb183bbbf467bee91598d587fd2e<br>
SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92
</td>
</tr>
<tr id="seed">
<td>General Mobile 4G (Android One) <br>"seed"</td>
<td><a href="#top" onclick="onDownload(this)">seed_l8150-npc56p-preview-82472ebc.tgz</a><br>
MD5: 983e083bc7cd0c4a2d39d6ebaa20202a<br>
SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127
</td>
</tr>
</table>
<h3 id="revertDevice">Menghapus instalasi Preview dari perangkat</h3>
<p>
Jika Anda ingin menghapus instalasi Preview dari perangkat, Anda bisa melakukannya dengan salah satu cara
ini: </p>
<ul>
<li><strong>Dapatkan citra sistem sesuai spesifikasi pabrik</strong> kemudian flash
secara manual ke perangkat.
<ul>
<li>Untuk <strong>perangkat Nexus dan perangkat Pixel C</strong>, lihat
halaman <a href="http://developers.google.com/android/nexus/images">Citra Pabrik untuk
Perangkat Nexus</a> untuk mengunduhnya. </li>
<li>Untuk <strong>perangkat lain</strong>, hubungi produsen perangkat tersebut
secara langsung. Atau, jika perangkat didukung
dalam Android Beta Program, Anda bisa mendaftarkan perangkat dalam
program kemudian membatalkan pendaftarannya (lihat di bawah).</li>
</ul>
</li>
<li><strong>Batalkan pendaftaran perangkat dari Android Beta Program</strong>. Jika
perangkat terdaftar dalam <a href="https://g.co/androidbeta">Android Beta
Program</a>, apa pun perangkatnya, Anda cukup membatalkan pendaftarannya dari program tersebut.
<p>
Perangkat akan menerima pembaruan OTA ke versi
produksi terbaru Android yang tersedia untuk perangkat itu (misalnya, Android 6.0 Marshmallow).
Pembaruan mengharuskan pengaturan ulang perangkat secara penuh, jadi data pengguna pada perangkat itu
akan dihapus. Pastikan <strong>mencadangkan data penting</strong> sebelum
membatalkan pendaftaran perangkat.
</p>
</li>
</ul>
<p class="note"><strong>Catatan:</strong>
Menghapus instalasi citra sistem Developer Preview sebelum
program berakhir akan mengharuskan perangkat diatur ulang secara penuh dan menghapus semua data pengguna
pada perangkat.
</p>
<h2 id="setupAVD">Menyiapkan emulator</h2>
<p>Untuk menggunakan Android Emulator guna menjalankan Android N Preview, Anda perlu
mengunduh Android N Preview SDK dan membuat perangkat maya untuk
emulator.</p>
<p>Pertama, unduh Android N Preview SDK sebagai berikut (jika
Anda sudah memperolehnya saat <a href="{@docRoot}preview/setup-sdk.html">menyiapkan
pengembangan Android N</a>, Anda bisa melewatkan bagian ini):
<ol>
<li>Di Android Studio, buka dialog Settings
(<strong>File &gt; Settings</strong> pada Windows/Linux, atau
<strong>Android Studio &gt; Preferences</strong> pada Mac). Di panel kiri,
pilih <strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>.
<li>Klik tab <strong>SDK Platforms</strong>, kemudian pilih kotak cek
<strong>Android N Preview</strong>.</li>
<li>Klik tab <strong>SDK Tools</strong>, kemudian pilih
kotak cek <strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong>, dan <strong>Android SDK Tools</strong>.
</li>
<li>Klik <strong>OK</strong>, dan terima
perjanjian lisensi untuk setiap paket yang akan diinstal.
</li>
</ol>
<p>Sekarang Anda seharusnya telah memiliki <strong>Android SDK Built-Tools 24.0 0 rc1</strong>,
<strong>Platform-Tools 24.0.0 rc1</strong>, dan <strong>SDK Tools
25.0.9</strong>. Jika Anda tidak memperbarui SDK Tools ke 25.0.9, maka Anda tidak akan
dapat menjalankan citra sistem x86_64 untuk Android N.</p>
<p>Sekarang buatlah perangkat maya dengan citra sistem Android N:</p>
<ol>
<li>Buka AVD Manager dengan memilih <strong>Tools &gt; Android &gt;
AVD Manager</strong>.</li>
<li>Klik <strong>Create Virtual Device</strong>.</li>
<li>Pilih perangkat misalnya Nexus 5X, Nexus 6P, Nexus 9, atau Android TV,
kemudian klik <strong>Next</strong>.</li>
<li>Pilih citra sistem <strong>N</strong> (dengan
<strong>x86</strong> ABI), kemudian klik <strong>Next</strong>.
(Hanya citra sistem x86 yang saat ini didukung dengan Emulator
untuk Android N Preview.)
<li>Selesaikan konfigurasi AVD selanjutnya dan klik
<strong>Finish</strong>.</li>
</ol>
<p>Anda sekarang bisa meluncurkan Emulator Android dengan Android N Preview AVD.</p>
<p>
Untuk mendapatkan pengalaman terbaik di Android Emulator, instal
Android Studio 2.1 Preview, yang mendukung <a href="http://tools.android.com/tech-docs/emulator">Android Emulator 2.0 Beta</a>
dengan kinerja jauh lebih cepat dibandingkan Emulator di
Android Studio 1.5.</p>
<p class="note"><strong>Catatan:</strong>
Jika Anda saat ini menggunakan Android Studio 2.0 Beta, maka ada masalah yang telah diketahui
yang mencegah Anda membuat AVD dengan citra sistem N Preview, jadi
Anda saat ini perlu menggunakan preview Android Studio 2.1 untuk membuat AVD.
</p>
<p>Untuk informasi selengkapnya tentang membuat perangkat maya, lihat <a href="{@docRoot}tools/devices/index.html">Mengelola Perangkat Maya</a>.
</p>
</div><!-- landing -->
</div><!-- relative wrapper -->
<script>
var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
function onDownload(link) {
$("#downloadForRealz").html("Download " + $(link).text());
$("#downloadForRealz").attr('href', urlRoot + $(link).text());
$("#tos").fadeIn('fast');
$("#landing").fadeOut('fast');
return true;
}
function onAgreeChecked() {
/* verify that the TOS is agreed */
if ($("input#agree").is(":checked")) {
/* reveal the download button */
$("a#downloadForRealz").removeClass('disabled');
} else {
$("a#downloadForRealz").addClass('disabled');
}
}
function onDownloadForRealz(link) {
if ($("input#agree").is(':checked')) {
/*
$("#tos").fadeOut('fast');
$("#landing").fadeIn('fast');
*/
ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
/*
location.hash = "";
*/
return true;
} else {
return false;
}
}
$(window).hashchange( function(){
if (location.hash == "") {
location.reload();
}
});
</script>

View File

@@ -0,0 +1,388 @@
page.title=Optimisasi Latar Belakang
page.metaDescription=Pembatasan baru untuk siaran implisit.
page.keywords="android N", "implicit broadcasts", "job scheduler"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>
Dalam dokumen ini
</h2>
<ol>
<li>
<a href="#connectivity-action">Pembatasan pada CONNECTIVITY_ACTION</a>
</li>
<li>
<a href="#sched-jobs">Menjadwalkan Pekerjaan Jaringan pada Koneksi
Berbiaya Tetap</a>
</li>
<li>
<a href="#monitor-conn">Memantau Konektivitas Jaringan Saat Aplikasi
Dijalankan</a>
</li>
<li>
<a href="#media-broadcasts">Pembatasan pada NEW_PICTURE dan
NEW_VIDEO</a>
</li>
<li>
<a href="#new-jobinfo">Metode JobInfo Baru</a>
</li>
<li>
<a href="#new-jobparam">Metode JobParameter Baru</a>
</li>
<li>
<a href="#further-optimization">Mengoptimalkan Aplikasi Anda Lebih Jauh</a>
</li>
</ol>
</div>
</div>
<p>
Proses latar belakang bisa menguras memori dan baterai. Misalnya, sebuah
siaran implisit dapat memulai banyak proses latar belakang yang telah didaftarkan
untuk mendengarkannya, sekalipun proses-proses itu mungkin tidak melakukan banyak pekerjaan. Ini bisa
berdampak besar pada kinerja perangkat dan pengalaman pengguna.
</p>
<p>
Untuk meminimalkan masalah ini, N Developer Preview menerapkan pembatasan
berikut:
</p>
<ul>
<li>Aplikasi yang menargetkan Preview tidak menerima siaran {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} jika mereka
mendaftar untuk menerimanya dalam manifes mereka. Aplikasi yang berjalan di latar depan
tetap bisa mendengarkan {@code CONNECTIVITY_CHANGE} pada thread utama mereka dengan
mendaftarkan {@link android.content.BroadcastReceiver} pada {@link
android.content.Context#registerReceiver Context.registerReceiver()}.
</li>
<li>Aplikasi tidak bisa mengirim atau menerima siaran {@link
android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Optimisasi ini
memengaruhi semua aplikasi, bukan hanya aplikasi yang menargetkan Preview.
</li>
</ul>
<p>
Kerangka kerja Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan
siaran implisit ini. Misalnya, {@link android.app.job.JobScheduler}
dan<a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> menyediakan mekanisme yang tangguh untuk menjadwalkan operasi
jaringan bila kondisi yang ditetapkan, seperti koneksi ke jaringan
berbiaya tetap, terpenuhi. Anda sekarang juga bisa menggunakan {@link android.app.job.JobScheduler}
untuk bereaksi terhadap perubahan penyedia konten. Objek {@link android.app.job.JobInfo}
membungkus parameter yang digunakan {@link android.app.job.JobScheduler}
untuk menjadwalkan pekerjaan Anda. Bila syarat-syarat pekerjaan sudah terpenuhi, sistem
akan mengeksekusi pekerjaan ini pada {@link android.app.job.JobService} aplikasi Anda.
</p>
<p>
Dalam dokumen ini, kita akan mempelajari cara menggunakan metode alternatif, seperti
{@link android.app.job.JobScheduler}, untuk menyesuaikan aplikasi Anda dengan pembatasan
yang baru.
</p>
<h2 id="connectivity-action">
Pembatasan pada CONNECTIVITY_ACTION
</h2>
<p>
Aplikasi yang menargetkan N Developer Preview tidak menerima siaran {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} jika mereka
mendaftar untuk menerimanya dalam manifes mereka, dan proses yang bergantung pada siaran
ini tidak akan dimulai. Hal ini bisa menimbulkan masalah bagi aplikasi yang ingin
mendengarkan perubahan jaringan atau melakukan aktivitas jaringan dalam jumlah besar bila perangkat
menghubungkan ke jaringan berbiaya tetap. Beberapa solusi untuk menyiasati pembatasan
ini sudah ada dalam kerangka kerja Android, namun pemilihan solusi
yang tepat bergantung pada apa yang ingin dicapai oleh aplikasi Anda.
</p>
<p class="note">
<strong>Catatan:</strong> Sebuah {@link android.content.BroadcastReceiver} yang didaftarkan dengan
{@link android.content.Context#registerReceiver Context.registerReceiver()}
akan terus menerima siaran ini saat aplikasi berada di latar depan.
</p>
<h3 id="sched-jobs">
Menjadwalkan Pekerjaan Jaringan pada Koneksi Berbiaya Tetap
</h3>
<p>
Saat menggunakan kelas {@link android.app.job.JobInfo.Builder JobInfo.Builder}
untuk membuat objek {@link android.app.job.JobInfo} Anda, terapkan metode {@link
android.app.job.JobInfo.Builder#setRequiredNetworkType
setRequiredNetworkType()} dan teruskan {@link android.app.job.JobInfo
JobInfo.NETWORK_TYPE_UNMETERED} sebagai parameter pekerjaan. Contoh kode berikut
menjadwalkan layanan yang akan dijalankan bila perangkat menghubungkan ke jaringan
berbiaya tetap dan saat mengisi baterai:
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
js.schedule(job);
}
</pre>
<p>
Bila syarat untuk pekerjaan Anda terpenuhi, aplikasi Anda akan menerima callback untuk menjalankan
metode {@link android.app.job.JobService#onStartJob onStartJob()} dalam
{@code JobService.class} yang ditetapkan. Untuk melihat contoh selengkapnya mengenai implementasi {@link
android.app.job.JobScheduler}, lihat <a href="{@docRoot}samples/JobScheduler/index.html">aplikasi contoh JobScheduler</a>.
</p>
<p>
Aplikasi yang menggunakan layanan GMSCore, dan menargetkan Android 5.0 (API tingkat 21)
atau lebih rendah, bisa menggunakan <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> dan menetapkan {@code Task.NETWORK_STATE_UNMETERED}.
</p>
<h3 id="monitor-conn">
Memantau Konektivitas Jaringan Saat Aplikasi Dijalankan
</h3>
<p>
Aplikasi yang berjalan di latar depan tetap bisa mendengarkan {@code
CONNECTIVITY_CHANGE} dengan {@link
android.content.BroadcastReceiver} yang didaftarkan. Akan tetapi, {@link
android.net.ConnectivityManager} API menyediakan metode yang lebih tangguh untuk meminta
callback hanya bila syarat jaringan yang ditetapkan terpenuhi.
</p>
<p>
Objek {@link android.net.NetworkRequest} mendefinisikan parameter
callback jaringan dari segi {@link android.net.NetworkCapabilities}. Anda
membuat objek {@link android.net.NetworkRequest} dengan kelas {@link
android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link
android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
kemudian meneruskan objek {@link android.net.NetworkRequest} ke sistem. Bila
syarat jaringan terpenuhi, aplikasi akan menerima callback untuk mengeksekusi
metode {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
onAvailable()} yang didefinisikan dalam kelas {@link
android.net.ConnectivityManager.NetworkCallback}.
</p>
<p>
Aplikasi akan terus menerima callback hingga aplikasi keluar atau memanggil
{@link android.net.ConnectivityManager#unregisterNetworkCallback
unregisterNetworkCallback()}.
</p>
<h2 id="media-broadcasts">
Pembatasan pada NEW_PICTURE dan NEW_VIDEO
</h2>
<p>
Di N Developer Preview, aplikasi tidak dapat mengirim atau menerima siaran {@link
android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Pembatasan ini membantu
meminimalkan dampak negatif terhadap kinerja dan pengalaman pengguna bila beberapa aplikasi harus
aktif untuk memproses gambar atau video baru. N Developer Preview
menambahkan {@link android.app.job.JobInfo} dan {@link
android.app.job.JobParameters} untuk memberikan solusi alternatif.
</p>
<h3 id="new-jobinfo">
Metode JobInfo baru
</h3>
<p>
Untuk memicu pekerjaan saat perubahan URI konten, N Developer Preview menambahkan
{@link android.app.job.JobInfo} API dengan metode berikut:
</p>
<dl>
<dt>
{@code JobInfo.TriggerContentUri()}
</dt>
<dd>
Membungkus parameter yang diperlukan untuk memicu pekerjaan saat perubahan URI konten.
</dd>
<dt>
{@code JobInfo.Builder.addTriggerContentUri()}
</dt>
<dd>
Meneruskan objek {@code TriggerContentUri} ke {@link
android.app.job.JobInfo}. Sebuah {@link android.database.ContentObserver}
akan memantau URI konten yang dibungkus. Jika ada beberapa objek {@code
TriggerContentUri} yang dikaitkan dengan pekerjaan, sistem akan memberikan sebuah
callback sekalipun itu melaporkan perubahan di salah satu URI konten saja.
</dd>
<dd>
Tambahkan flag {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} untuk
memicu pekerjaan jika ada turunan dari perubahan URI yang diberikan. Flag ini
berkaitan dengan parameter {@code notifyForDescendants} yang diteruskan ke {@link
android.content.ContentResolver#registerContentObserver
registerContentObserver()}.
</dd>
</dl>
<p class="note">
<strong>Catatan:</strong> {@code TriggerContentUri()} tidak bisa digunakan
bersama-sama dengan {@link android.app.job.JobInfo.Builder#setPeriodic
setPeriodic()} atau {@link android.app.job.JobInfo.Builder#setPersisted
setPersisted()}. Untuk terus memantau perubahan konten, jadwalkan
{@link android.app.job.JobInfo} baru sebelum {@link
android.app.job.JobService} aplikasi selesai menangani callback terbaru.
</p>
<p>
Kode contoh berikut menjadwalkan pekerjaan yang akan dipicu bila sistem melaporkan
perubahan ke URI konten, {@code MEDIA_URI}:
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MediaContentJob.class));
builder.addTriggerContentUri(
new JobInfo.TriggerContentUri(MEDIA_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
js.schedule(builder.build());
}
</pre>
<p>
Bila sistem melaporkan perubahan dalam URI konten yang ditetapkan, aplikasi Anda
akan menerima callback dan objek {@link android.app.job.JobParameters}
akan diteruskan ke metode {@link android.app.job.JobService#onStartJob onStartJob()}
dalam {@code MediaContentJob.class}.
</p>
<h3 id="new-jobparam">
Metode JobParameter Baru
</h3>
<p>
N Developer Preview juga menambahkan {@link android.app.job.JobParameters} untuk
memungkinkan aplikasi Anda menerima informasi yang berguna tentang otoritas konten
dan URI yang memicu pekerjaan:
</p>
<dl>
<dt>
{@code Uri[] getTriggeredContentUris()}
</dt>
<dd>
Mengembalikan larik URL yang telah memicu pekerjaan. Ini akan berupa {@code
null} jika tidak ada URI yang memicu pekerjaan (misalnya, pekerjaan
dipicu karena batas waktu atau alasan lainnya), atau jumlah
URI yang berubah lebih dari 50.
</dd>
<dt>
{@code String[] getTriggeredContentAuthorities()}
</dt>
<dd>
Mengembalikan larik string otoritas konten yang telah memicu pekerjaan.
Jika larik yang dikembalikan bukan {@code null}, gunakan {@code getTriggeredContentUris()}
untuk mengambil detail URI yang telah berubah.
</dd>
</dl>
<p>
Kode contoh berikut mengesampingkan metode {@link
android.app.job.JobService#onStartJob JobService.onStartJob()} dan
mencatat otoritas konten serta URI yang telah memicu pekerjaan:
</p>
<pre>
&#64;Override
public boolean onStartJob(JobParameters params) {
StringBuilder sb = new StringBuilder();
sb.append("Media content has changed:\n");
if (params.getTriggeredContentAuthorities() != null) {
sb.append("Authorities: ");
boolean first = true;
for (String auth :
params.getTriggeredContentAuthorities()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(auth);
}
if (params.getTriggeredContentUris() != null) {
for (Uri uri : params.getTriggeredContentUris()) {
sb.append("\n");
sb.append(uri);
}
}
} else {
sb.append("(No content)");
}
Log.i(TAG, sb.toString());
return true;
}
</pre>
<h2 id="further-optimization">
Mengoptimalkan Aplikasi Anda Lebih Jauh
</h2>
<p>
Mengoptimalkan aplikasi Anda untuk berjalan pada perangkat minim memori, atau dalam kondisi
minim memori, bisa meningkatkan kinerja dan pengalaman pengguna. Menghilangkan
dependensi pada layanan latar belakang dan penerima siaran
implisit yang terdaftar secara statis bisa membantu aplikasi Anda berjalan lebih baik pada perangkat demikian. Meskipun
N Developer Preview telah mengambil langkah-langkah untuk mengurangi sebagian masalah ini, Anda disarankan
agar mengoptimalkan aplikasi untuk berjalan tanpa menggunakan
proses latar belakang ini seluruhnya.
</p>
<p>
N Developer Preview memperkenalkan beberapa tambahan perintah <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> yang
bisa Anda gunakan untuk menguji perilaku aplikasi dengan proses latar belakang dinonaktifkan:
</p>
<ul>
<li>Untuk mensimulasikan kondisi saat siaran implisit dan layanan latar belakang
tidak tersedia, masukkan perintah berikut:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
</pre>
</li>
<li>Untuk mengaktifkan kembali siaran implisit dan layanan latar belakang, masukkan
perintah berikut:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
</pre>
</li>
</ul>

View File

@@ -0,0 +1,180 @@
page.title=Direct Boot
page.keywords=preview,sdk,direct boot
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#run">Meminta Akses untuk Berjalan Selama Direct Boot</a></li>
<li><a href="#access">Mengakses Penyimpanan yang Dienkripsi dengan Perangkat</a></li>
<li><a href="#notification">Mendapatkan Pemberitahuan saat Pengguna Membuka Kunci</a></li>
<li><a href="#migrating">Migrasi Data yang Ada</a></li>
<li><a href="#testing">Menguji Aplikasi Peka Enkripsi Anda</a></li>
</ol>
</div>
</div>
<p>Android N berjalan dalam mode <i>Direct Boot</i> yang aman
bila perangkat telah dihidupkan namun pengguna tidak membuka
kunci perangkat. Untuk mendukung hal ini, sistem menyediakan dua lokasi penyimpanan untuk data:</p>
<ul>
<li><i>Penyimpanan yang dienkripsi dengan kredensial</i>, yang merupakan lokasi penyimpanan default
dan hanya tersedia setelah pengguna membuka kunci perangkat.</li>
<li><i>Penyimpanan yang dienkripsi dengan perangkat</i>, yang merupakan lokasi penyimpanan yang tersedia
selama mode Direct Boot dan setelah pengguna membuka kunci perangkat.</li>
</ul>
<p>Secara default, aplikasi tidak berjalan selama mode Direct Boot.
Jika aplikasi Anda perlu melakukan tindakan selama mode Direct Boot, Anda bisa mendaftarkan
komponen aplikasi yang harus dijalankan selama mode ini. Beberapa kasus penggunaan umum
untuk aplikasi yang perlu dijalankan selama mode Direct Boot antara lain:</p>
<ul>
<li>Aplikasi yang telah menjadwalkan pemberitahuan, seperti aplikasi
jam alarm.</li>
<li>Aplikasi yang menyediakan pemberitahuan pengguna yang penting, seperti aplikasi SMS.</li>
<li>Aplikasi yang menyediakan layanan aksesibilitas, seperti TalkBack.</li>
</ul>
<p>Jika aplikasi Anda perlu mengakses data saat dijalankan dalam mode Direct Boot, gunakan
penyimpanan yang dienkripsi dengan perangkat. Penyimpanan yang dienkripsi dengan perangkat berisi data
yang dienkripsi dengan kunci yang hanya tersedia setelah perangkat melakukan
boot yang berhasil diverifikasi.</p>
<p>Untuk data yang harus dienkripsi dengan kunci yang dikaitkan dengan kredensial
pengguna, seperti PIN atau kata sandi, gunakan penyimpanan yang dienkripsi dengan kredensial.
Penyimpanan yang dienkripsi dengan kredensial hanya tersedia setelah pengguna berhasil
membuka kunci perangkat, hingga saat pengguna menghidupkan ulang perangkat lagi. Jika
pengguna mengaktifkan layar kunci setelah membuka kunci perangkat, hal ini tidak akan mengunci
penyimpanan yang dienkripsi dengan kredensial.</p>
<h2 id="run">Meminta Akses untuk Berjalan Selama Direct Boot</h2>
<p>Aplikasi harus mendaftarkan komponennya pada sistem agar
bisa berjalan selama mode Direct Boot atau mengakses
penyimpanan yang dienkripsi dengan perangkat. Aplikasi mendaftar pada sistem dengan menandai komponen sebagai
<i>peka enkripsi</i>. Untuk menandai komponen Anda sebagai peka enkripsi, atur atribut
<code>android:encryptionAware</code> ke true dalam manifes Anda.<p>
<p>Komponen yang peka enkripsi bisa mendaftar untuk menerima pesan siaran
<code>LOCKED_BOOT_COMPLETED</code> dari
sistem bila perangkat telah dihidupkan ulang. Pada tahap ini
penyimpanan yang dienkripsi dengan perangkat akan tersedia, dan komponen Anda bisa mengeksekusi tugas-tugas yang perlu
dijalankan selama mode Direct Boot, seperti memicu alarm yang terjadwal.</p>
<p>Cuplikan kode berikut adalah contoh cara mendaftarkan
{@link android.content.BroadcastReceiver} sebagai peka enkripsi, dan menambahkan sebuah
filter intent untuk <code>LOCKED_BOOT_COMPLETED</code>, dalam manifes aplikasi:</p>
<pre>
&lt;receiever
android:encryptionAware="true" &gt;
...
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>Setelah pengguna membuka kunci perangkat, semua komponen bisa mengakses
penyimpanan yang dienkripsi dengan perangkat serta penyimpanan yang dienkripsi dengan kredensial.</p>
<h2 id="access">Mengakses Penyimpanan yang Dienkripsi dengan Perangkat</h2>
<p>Untuk mengakses penyimpanan yang dienkripsi dengan perangkat, buat instance
{@link android.content.Context} kedua dengan memanggil
<code>Context.createDeviceEncryptedStorageContext()</code>. Semua panggilan
API penyimpanan yang dibuat menggunakan konteks ini akan mengakses penyimpanan yang dienkripsi dengan perangkat. Contoh
berikut mengakses penyimpanan yang dienkripsi dengan perangkat dan membuka file data aplikasi
yang ada:</p>
<pre>
Context directBootContext = Context.createDeviceEncryptedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...
</pre>
<p>Gunakan penyimpanan yang dienkripsi dengan perangkat hanya untuk
informasi yang harus bisa diakses selama mode Direct Boot.
Jangan gunakan penyimpanan yang dienkripsi dengan perangkat sebagai penyimpanan terenkripsi serba guna.
Untuk informasi pengguna yang bersifat pribadi, atau data terenkripsi yang tidak diperlukan selama
mode Direct Boot, gunakan penyimpanan yang dienkripsi dengan kredensial.</p>
<h2 id="notification">Mendapatkan Pemberitahuan saat Pengguna Membuka Kunci</h2>
<p>Setelah pengguna membuka kunci perangkat setelah restart, aplikasi Anda bisa beralih untuk
mengakses penyimpanan yang dienkripsi dengan kredensial dan menggunakan layanan sistem biasa yang
bergantung pada kredensial pengguna.</p>
<p>Agar diberi tahu bila pengguna membuka kunci perangkat setelah reboot,
daftarkan {@link android.content.BroadcastReceiver} dari komponen yang berjalan
untuk mendengarkan pesan <code>ACTION_USER_UNLOCKED</code>. Atau, Anda bisa
menerima pesan {@link android.content.Intent#ACTION_BOOT_COMPLETED
ACTION_BOOT_COMPLETED} yang ada, yang sekarang menunjukkan bahwa perangkat telah dihidupkan dan
pengguna telah membuka kunci perangkat.</p>
<p>Anda bisa langsung melakukan query apakah pengguna telah membuka kunci perangkat dengan memanggil
<code>UserManager.isUserUnlocked()</code>.</p>
<h2 id="migrating">Migrasi Data yang Ada</h2>
<p>Jika pengguna memperbarui perangkat mereka untuk menggunakan mode Direct Boot,
data Anda yang ada mungkin perlu dipindahkan ke penyimpanan yang dienkripsi dengan perangkat. Gunakan
<code>Context.migrateSharedPreferencesFrom()</code> dan
<code>Context.migrateDatabaseFrom()</code> untuk memindahkan data preferensi dan
database antara penyimpanan yang dienkripsi dengan kredensial dan penyimpanan yang dienkripsi dengan perangkat.</p>
<p>Pertimbangkan dengan baik saat memutuskan data apa yang akan dipindahkan dari
penyimpanan yang dienkripsi dengan kredensial ke penyimpanan yang dienkripsi dengan perangkat. Anda sebaiknya tidak memindahkan
informasi pengguna yang bersifat rahasia, seperti kata sandi atau token otorisasi, ke
penyimpanan yang dienkripsi dengan perangkat. Dalam beberapa skenario, Anda mungkin perlu mengelola
set data terpisah pada dua tempat penyimpanan yang dienkripsi.</p>
<h2 id="testing">Menguji Aplikasi Peka Enkripsi Anda</h2>
<p>Uji aplikasi peka enkripsi Anda menggunakan mode Direct Boot baru. Ada
dua cara untuk mengaktifkan Direct Boot.</p>
<p class="caution"><strong>Perhatian:</strong> Mengaktifkan Direct Boot
akan menghapus semua data pengguna pada perangkat.</p>
<p>Pada perangkat yang didukung dengan Android N terinstal, aktifkan
Direct Boot dengan melakukan salah satu hal berikut:</p>
<ul>
<li>Pada perangkat, aktifkan <b>Developer options</b> jika Anda belum melakukannya dengan
masuk ke <b>Settings &gt; About phone</b>, dan menyentuh <b>Build number</b>
tujuh kali. Setelah layar Developer options terbuka, masuk ke
<b>Settings &gt; Developer options</b> dan pilih
<b>Convert to file encryption</b>.</li>
<li>Gunakan perintah shell adb berikut untuk mengaktifkan mode Direct Boot:
<pre class="no-pretty-print">
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
</pre>
</li>
</ul>
<p>Mode emulasi Direct Boot juga tersedia, jika Anda perlu mengganti
mode pada perangkat pengujian. Mode emulasi sebaiknya hanya digunakan selama
pengembangan dan bisa menyebabkan kehilangan data. Untuk mengaktifkan mode emulasi Direct Boot,
atur pola kunci pada perangkat, pilih "No thanks" jika ditanya mengenai
layar start-up aman saat menetapkan pola kunci, kemudian gunakan
perintah shell adb berikut:</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe true
</pre>
<p>Untuk menonaktifkan mode emulasi Direct Boot, gunakan perintah berikut:</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe false
</pre>
<p>Menggunakan perintah ini akan menyebabkan perangkat melakukan reboot.</p>

View File

@@ -0,0 +1,158 @@
page.title=ICU4J Android Framework API
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini:</h2>
<ol>
<li><a href="#relation">Hubungan dengan ICU4J</a></li>
<li><a href="#migration">Migrasi ke android.icu API dari ICU4J </a></li>
<li><a href="#licence">Lisensi</a></li>
</ol>
<h2>Lihat Juga</h2>
<ol>
<li>
<a class="external-link" href="http://userguide.icu-project.org">Dokumentasi untuk ICU4J</a>
</li>
<li>
<a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Standar terbaru yang didukung
oleh ICU4J</a>
</li>
</ol>
</div>
</div>
<p>
ICU4J merupakan serangkaian pustaka Java sumber terbuka yang banyak digunakan dan menyediakan Unicode
serta dukungan globalisasi untuk aplikasi perangkat lunak. Android N
mengekspos subset ICU4J API dalam kerangka kerja Android bagi pengembang aplikasi
untuk digunakan pada paket {@code android.icu}. API ini menggunakan
data pelokalan yang ada pada perangkat. Hasilnya, Anda bisa mengurangi footprint
APK dengan tidak mengompilasi pustaka ICU4J ke APK Anda; sebagai gantinya,
cukup memanggilnya dalam kerangka kerja. (Dalam hal ini, Anda mungkin perlu menyediakan
<a href="{@docRoot}google/play/publishing/multiple-apks.html">beberapa versi
APK Anda</a>, sehingga pengguna yang menjalankan versi Android lebih rendah dari Android N
bisa mengunduh versi aplikasi yang berisi pustaka ICU4J.)
</p>
<p>
Dokumen ini diawali dengan menyediakan beberapa informasi dasar tentang level API Android
minimum yang diperlukan untuk mendukung pustaka-pustaka ini. Kemudian dijelaskan tentang apa
yang perlu Anda ketahui tentang implementasi ICU4J spesifik Android. Terakhir,
Anda akan diberi tahu cara menggunakan ICU4J API dalam kerangka kerja Android.
</p>
<h2 id="relation">Hubungan dengan ICU4J</h2>
<p>
Android N mengekspos subset ICU4J API lewat
paket <code>android.icu</code>, bukannya <code>com.ibm.icu</code>. Kerangka kerja
Android dapat memilih untuk tidak
mengekspos ICU4J API karena berbagai alasan; misalnya, Android N tidak mengekspos
beberapa API yang tidak digunakan lagi atau yang dinyatakan belum
stabil oleh tim ICU. Karena tim ICU tidak lagi menggunakan API di masa mendatang, Android juga akan menandainya
sebagai tidak digunakan lagi namun akan terus menyertakannya.
</p>
<p class="table-caption"><strong>Tabel 1.</strong> Versi ICU dan CLDR yang digunakan
di Android N.</p>
<table>
<tr>
<th>Level API Android</th>
<th>Versi ICU</th>
<th>Versi CLDR</th>
</tr>
<tr>
<td>Android N</td>
<td>56</td>
<td>28</td>
</tr>
</table>
<p>Inilah beberapa hal penting yang harus diperhatikan:</p>
<ul>
<li>ICU4J Android Framework API tidak menyertakan semua ICU4J API.</li>
<li>Pengembang NDK harus mengetahui bahwa Android ICU4C tidak didukung.</li>
<li>API dalam kerangka kerja Android tidak menggantikan dukungan Android untuk
<a href="{@docRoot}guide/topics/resources/localization.html">melokalkan dengan
sumber daya</a>.</li>
</ul>
<h2 id="migration">Migrasi ke paket android.icu dari com.ibm.icu</h2>
<p>
Jika Anda sudah menggunakan ICU4J API dalam aplikasi, dan
<code>android.icu</code> API memenuhi persyaratan Anda, maka migrasi ke
API kerangka kerja mengharuskan Anda untuk mengubah impor Java
dari <code>com.ibm.icu</code> ke <code>android.icu</code>. Kemudian Anda bisa
menghapus salinan file ICU4J dari APK.
</p>
<p class="note">
<b>Catatan</b>: API kerangka kerja ICU4J menggunakan namespace {@code android.icu}
sebagai ganti {@code com.ibm.icu}. Hal ini untuk menghindari konflik
namespace di APK yang berisi pustaka {@code com.ibm.icu} sendiri.
</p>
<h3 id="migrate-from-android">
Migrasi ke API android.icu dari Android SDK API lainnya
</h3>
<p>
Beberapa kelas dalam paket <code>java</code> dan <code>android</code> memiliki
padanannya dengan yang ditemukan di ICU4J. Akan tetapi, ICU4J seringkali menyediakan dukungan
yang lebih luas untuk standar dan bahasa.
</p>
<p>Inilah beberapa contoh untuk membantu Anda memulai:</p>
<table>
<tr>
<th>Kelas</th>
<th>Alternatif</th>
</tr>
<tr>
<td><code>java.lang.Character</code> </td>
<td><code>android.icu.lang.UCharacter</code> </td>
</tr>
<tr>
<td><code>java.text.BreakIterator</code> </td>
<td><code>android.icu.text.BreakIterator</code> </td>
</tr>
<tr>
<td><code>java.text.DecimalFormat</code> </td>
<td><code>android.icu.text.DecimalFormat</code> </td>
</tr>
<tr>
<td><code>java.util.Calendar</code></td>
<td>
<code>android.icu.util.Calendar</code></td>
</tr>
<tr>
<td><code>android.text.BidiFormatter</code>
</td>
<td><code>android.icu.text.Bidi</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateFormat</code>
</td>
<td><code>android.icu.text.DateFormat</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateUtils</code> </td>
<td><code>android.icu.text.DateFormat</code>
<code>android.icu.text.RelativeDateTimeFormatter</code>
</td>
</tr>
</table>
<h2 id="licence">Lisensi</h2>
<p>
ICU4J dirilis dengan lisensi ICU. Untuk detailnya, lihat <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Panduan Pengguna
ICU.</a>
</p>

View File

@@ -0,0 +1,582 @@
page.title=Dukungan Multi-Jendela
page.metaDescription=Dukungan baru di Android N untuk menampilkan lebih dari satu aplikasi sekaligus.
page.keywords="multi-window", "android N", "split screen", "free-form"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#overview">Ikhtisar</a></li>
<li><a href="#lifecycle">Daur Hidup Multi-Jendela</a></li>
<li><a href="#configuring">Mengonfigurasi Aplikasi Anda untuk Mode
Multi-Jendela</a></li>
<li><a href="#running">Menjalankan Aplikasi Anda dalam Mode Multi-Jendela</a></li>
<li><a href="#testing">Menguji Dukungan Multi-Jendela Aplikasi Anda</a></li>
</ol>
<h2>Lihat Juga</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">Aplikasi contoh Multi-Window
Playground</a></li>
</ol>
</div>
</div>
<p>
Android N menambahkan dukungan untuk menampilkan lebih dari satu aplikasi
sekaligus. Pada perangkat genggam, dua aplikasi bisa berjalan berdampingan atau
atas-bawah dalam mode <em>layar terbagi</em>. Pada perangkat TV, aplikasi bisa
menggunakan mode <em>gambar-dalam-gambar</em> untuk melanjutkan pemutaran video selagi pengguna
berinteraksi dengan aplikasi lain.
</p>
<p>
Jika Anda membangun aplikasi Anda dengan N Preview SDK, Anda bisa mengonfigurasi cara aplikasi
menangani tampilan multi-jendela. Misalnya, Anda bisa menetapkan dimensi
minimum yang diizinkan aktivitas Anda. Anda juga bisa menonaktifkan tampilan multi-jendela untuk
aplikasi, sehingga memastikan sistem hanya menampilkan aplikasi Anda dalam mode
layar penuh.
</p>
<h2 id="overview">Ikhtisar</h2>
<p>
Android N memungkinkan beberapa aplikasi berbagi layar sekaligus. Misalnya,
pengguna bisa membagi layar, melihat halaman web di sisi kiri
sambil menulis email di sisi kanan. Pengalaman pengguna bergantung pada
perangkat:
</p>
<ul>
<li>Perangkat genggam yang menjalankan Android N menawarkan mode
layar terbagi. Di mode ini, sistem mengisi layar dengan dua aplikasi, menampilkannya secara
berdampingan atau atas-bawah. Pengguna bisa menyeret garis pembagi
yang memisahkan keduanya untuk membuat satu aplikasi lebih besar dan yang lainnya lebih kecil.
</li>
<li>Pada Nexus Player yang menjalankan Android N, aplikasi bisa menempatkan diri
dalam <a href="picture-in-picture.html">mode gambar-dalam-gambar</a>, yang memungkinkannya
untuk terus menampilkan konten selagi pengguna melihat-lihat atau berinteraksi dengan
aplikasi lain.
</li>
<li>Produsen perangkat berukuran lebih besar bisa memilih untuk mengaktifkan mode
bentuk bebas, di mana pengguna bisa bebas mengubah ukuran setiap aktivitas. Jika
produsen mengaktifkan fitur ini, perangkat akan menawarkan mode bentuk bebas sebagai tambahan
untuk mode layar terbagi.
</li>
</ul>
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
{@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong>Gambar 1.</strong> Dua aplikasi berjalan berdampingan dalam mode layar terbagi.
</p>
<p>
Pengguna bisa beralih ke mode multi-jendela dengan cara berikut:
</p>
<ul>
<li>Jika pengguna membuka <a href="{@docRoot}guide/components/recents.html">layar
Overview</a> dan menekan lama pada
judul aktivitas, mereka bisa menyeret aktivitas itu ke bagian yang disorot pada layar
untuk menempatkan aktivitas dalam mode multi-jendela.
</li>
<li>Jika pengguna menekan lama pada tombol Overview, perangkat akan menempatkan
aktivitas saat ini dalam mode multi-jendela, dan membuka layar Overview guna
memungkinkan pengguna memilih aktivitas lain untuk berbagi layar.
</li>
</ul>
<p>
Pengguna bisa <a href="{@docRoot}guide/topics/ui/drag-drop.html">menyeret dan
meletakkan</a> data dari aktivitas satu ke aktivitas lain sewaktu aktivitas berbagi
layar. (Sebelumnya, pengguna hanya bisa menyeret dan meletakkan data dalam aktivitas
tunggal.)
</p>
<h2 id="lifecycle">Daur Hidup Multi-Jendela</h2>
<p>
Mode multi-jendela tidak mengubah <a href="{@docRoot}training/basics/activity-lifecycle/index.html">daur hidup
aktivitas</a>.
</p>
<p>
Dalam mode multi-jendela, hanya aktivitas yang paling sering digunakan pengguna
yang akan aktif pada waktu tertentu. Aktivitas ini dianggap <em>teratas</em>.
Semua aktivitas lainnya dalam keadaan berhenti sementara, sekalipun terlihat.
Akan tetapi, sistem memberikan aktivitas, yang berhenti-sementara-namun-terlihat ini, prioritas lebih tinggi
daripada aktivitas yang tidak terlihat. Jika pengguna berinteraksi dengan salah satu
aktivitas yang berhenti sementara, aktivitas tersebut akan dilanjutkan kembali, dan aktivitas
teratas sebelumnya akan dihentikan sementara.
</p>
<p class="note">
<strong>Catatan:</strong> Dalam mode multi-jendela, aplikasi bisa berada dalam keadaan berhenti sementara
dan masih terlihat oleh pengguna. Sebuah aplikasi mungkin perlu melanjutkan aktivitasnya
bahkan saat berhenti sementara. Misalnya, aplikasi pemutar video yang ada dalam
mode berhenti sementara namun terlihat harus tetap menampilkan videonya. Karena alasan
ini, kami menyarankan aktivitas yang memutar video<em>tidak</em> menghentikan sementara video
dalam handler {@link android.app.Activity#onPause onPause()} mereka.
Sebagai gantinya, aktivitas itu harus menghentikan sementara video di {@link android.app.Activity#onStop
onStop()}, dan melanjutkan pemutaran di {@link android.app.Activity#onStart
onStart()}.
</p>
<p>
Bila pengguna menempatkan aplikasi dalam mode multi-jendela, sistem akan memberi tahu
aktivitas tersebut mengenai perubahan konfigurasi, sebagaimana ditetapkan dalam <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani Perubahan
Runtime</a>. Pada dasarnya, perubahan ini memiliki implikasi siklus hidup aktivitas yang sama
seperti saat sistem memberi tahu aplikasi bahwa perangkat telah beralih
dari mode potret ke mode lanskap, kecuali dimensi perangkat
telah berubah sebagai ganti bertukar posisi. Seperti yang dibahas di <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Menangani Perubahan
Runtime</a>, aktivitas Anda bisa menangani perubahan konfigurasi itu sendiri, atau
mengizinkan sistem memusnahkan aktivitas dan membuatnya kembali dengan dimensi
baru.
</p>
<p>
Jika pengguna mengubah ukuran jendela dan membuat dimensinya jadi lebih besar, sistem
akan mengubah ukuran aktivitas untuk menyesuaikan dengan tindakan pengguna dan mengeluarkan <a href="{@docRoot}guide/topics/resources/runtime-changes.html">perubahan runtime</a>
sebagaimana diperlukan. Jika aplikasi tertinggal dari gambar di bidang yang baru saja diekspos,
sistem untuk sementara akan mengisi bidang tersebut dengan warna yang ditetapkan oleh atribut {@link
android.R.attr#windowBackground windowBackground} atau dengan atribut gaya
<code>windowBackgroundFallback</code> secara default.
</p>
<h2 id="configuring">Mengonfigurasi Aplikasi Anda untuk Mode Multi-Jendela</h2>
<p>
Jika aplikasi Anda menargetkan Android N, Anda bisa mengonfigurasi bagaimana dan
apakah aktivitas aplikasi Anda mendukung tampilan multi-jendela. Anda bisa mengatur
atribut dalam manifes untuk mengontrol ukuran dan layoutnya.
Pengaturan atribut aktivitas root berlaku untuk semua aktivitas
dalam tumpukan tugasnya.
</p>
<p class="note">
<strong>Catatan:</strong> Jika Anda membangun aplikasi multi-orientasi dengan versi
SDK lebih rendah dari Android N, dan pengguna menggunakan aplikasi
dalam mode multi-jendela, sistem akan mengubah ukuran aplikasi secara paksa. Sistem akan menampilkan kotak
dialog yang memperingatkan pengguna bahwa aplikasi mungkin berperilaku tidak terduga. Sistem
<em>tidak</em> mengubah ukuran aplikasi yang berorientasi tetap; jika
pengguna berusaha membuka aplikasi berorientasi tetap saat mode multi-jendela,
aplikasi akan menggunakan seluruh layar.
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
Atur atribut ini dalam manifes <code>&lt;activity&gt;</code> Anda atau simpul
<code>&lt;application&gt;</code> untuk mengaktifkan atau menonaktifkan tampilan
multi-jendela:
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
Jika atribut ini diatur ke true, aktivitas bisa dijalankan di
mode layar terbagi dan mode bentuk bebas. Jika atribut ini diatur ke false, aktivitas
tidak akan mendukung mode multi-jendela. Jika nilai ini false, dan pengguna
berusaha memulai aktivitas dalam mode multi-jendela, aktivitas akan menggunakan
layar penuh.
</p>
<p>
Jika aplikasi Anda menargetkan Android N, namun Anda tidak menetapkan nilai
untuk atribut ini, nilai atribut default adalah true.
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
Atur atribut ini dalam simpul <code>&lt;activity&gt;</code> manifes Anda untuk
menunjukkan apakah aktivitas mendukung tampilan gambar-dalam-gambar. Atribut ini
diabaikan jika <code>android:resizeableActivity</code> bernilai false.
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">Atribut layout</h3>
<p>
Dengan Android N, elemen manifes <code>&lt;layout&gt;</code>
mendukung beberapa atribut yang memengaruhi cara aktivitas berperilaku dalam
mode multi-jendela:
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
Lebar default aktivitas saat dijalankan dalam mode bentuk bebas.
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
Tinggi default aktivitas saat dijalankan dalam mode bentuk bebas.
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
Penempatan awal dari aktivitas saat dibuka dalam mode bentuk bebas. Lihat referensi
{@link android.view.Gravity} untuk mengetahui nilai yang cocok.
</dd>
<dt>
<code>android:minimalSize</code>
</dt>
<dd>
Tinggi dan lebar minimum untuk aktivitas dalam mode layar terbagi
dan mode bentuk bebas. Jika pengguna memindahkan pembagi dalam mode layar terbagi
untuk membuat aktivitas lebih kecil dari minimum yang ditetapkan, sistem akan memangkas
aktivitas sesuai dengan ukuran yang diminta pengguna.
</dd>
</dl>
<p>
Misalnya, kode berikut menampilkan cara menetapkan ukuran dan lokasi default
aktivitas, dan ukuran minimumnya, bila aktivitas ditampilkan dalam
mode bentuk bebas:
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalSize="450dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">Menjalankan Aplikasi Anda dalam Mode Multi-Jendela</h2>
<p>
Android N menawarkan fungsionalitas baru untuk mendukung aplikasi yang bisa berjalan
dalam mode multi-jendela.
</p>
<h3 id="disabled-features">Fitur yang dinonaktifkan dalam mode multi-jendela</h3>
<p>
Fitur tertentu akan dinonaktifkan atau diabaikan bila perangkat berada dalam mode
multi-jendela, karena dianggap tidak logis bagi suatu aktivitas yang mungkin berbagi
layar perangkat dengan aktivitas atau aplikasi lainnya. Fitur tersebut meliputi:
<ul>
<li>Beberapa opsi penyesuaian di <a href="{@docRoot}training/system-ui/index.html">System UI</a>
dinonaktifkan; misalnya, aplikasi tidak bisa menyembunyikan baris status
jika tidak berjalan dalam mode layar penuh.
</li>
<li>Sistem akan mengabaikan perubahan pada atribut <code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code>.
</li>
</ul>
<h3 id="change-notification">Pemberitahuan perubahan multi-jendela dan melakukan query</h3>
<p>
Metode baru berikut telah ditambahkan ke kelas {@link android.app.Activity}
untuk mendukung tampilan multi-jendela. Untuk mengetahui detail tentang setiap metode, lihat
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi N Preview SDK</a>.
</p>
<dl>
<dt>
<code>Activity.inMultiWindow()</code>
</dt>
<dd>
Panggil untuk mengetahui apakah aktivitas berada dalam mode multi-jendela.
</dd>
<dt>
<code>Activity.inPictureInPicture()</code>
</dt>
<dd>
Panggil untuk mengetahui apakah aktivitas berada dalam mode gambar-dalam-gambar.
<p class="note">
<strong>Catatan:</strong> Mode gambar-dalam-gambar adalah kasus khusus pada
mode multi-jendela. Jika <code>myActivity.inPictureInPicture()</code>
mengembalikan nilai true, maka <code>myActivity.inMultiWindow()</code> juga mengembalikan nilai
true.
</p>
</dd>
<dt>
<code>Activity.onMultiWindowChanged()</code>
</dt>
<dd>
Sistem akan memanggil metode ini bila aktivitas masuk atau keluar dari
mode multi-jendela. Sistem akan meneruskan metode sebuah nilai true jika
aktivitas tersebut memasuki mode multi-jendela, dan nilai false jika aktivitas
tersebut meninggalkan mode multi-jendela.
</dd>
<dt>
<code>Activity.onPictureInPictureChanged()</code>
</dt>
<dd>
Sistem akan memanggil metode ini bila aktivitas masuk atau keluar dari
mode gambar-dalam-gambar. Sistem akan meneruskan metode sebuah nilai true jika
aktivitas tersebut memasuki mode gambar-dalam-gambar, dan nilai false jika aktivitas
tersebut meninggalkan mode gambar-dalam-gambar.
</dd>
</dl>
<p>
Ada juga versi {@link android.app.Fragment} untuk setiap
metode ini, misalnya <code>Fragment.inMultiWindow()</code>.
</p>
<h3 id="entering-pip">Memasuki mode gambar-dalam-gambar</h3>
<p>
Untuk menempatkan aktivitas dalam mode gambar-dalam-gambar, panggil metode baru
<code>Activity.enterPictureInPicture()</code>. Metode ini tidak berpengaruh jika
perangkat tidak mendukung mode gambar-dalam-gambar. Untuk informasi selengkapnya,
lihat dokumentasi <a href="picture-in-picture.html">Gambar-dalam-Gambar</a>.
</p>
<h3 id="launch">Meluncurkan Aktivitas Baru dalam Mode Multi-Jendela</h3>
<p>
Bila meluncurkan aktivitas baru, Anda bisa memberi petunjuk pada sistem bahwa aktivitas
baru harus ditampilkan bersebelahan dengan aktivitas yang sedang aktif, jika memungkinkan. Caranya,
gunakan flag
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>. Meneruskan
flag ini akan meminta perilaku berikut:
</p>
<ul>
<li>Jika perangkat berada dalam mode layar terbagi, sistem akan berupaya membuat
aktivitas baru di sebelah aktivitas yang meluncurkannya, sehingga kedua aktivitas tersebut
berbagi layar. Tidak ada jaminan sistem mampu melakukannya, namun sistem akan
membuat aktivitas bersebelahan jika memungkinkan.
</li>
<li>Jika perangkat tidak berada dalam mode layar terbagi, flag ini tidak akan berpengaruh.
</li>
</ul>
<p>
Jika perangkat berada dalam mode bentuk bebas dan Anda meluncurkan aktivitas baru, Anda bisa
menetapkan dimensi dan lokasi layar aktivitas baru dengan memanggil
<code>ActivityOptions.setLaunchBounds()</code>. Metode ini tidak berpengaruh jika
perangkat tidak berada dalam mode multi-jendela.
</p>
<p class="note">
<strong>Catatan:</strong> Jika Anda meluncurkan aktivitas dalam tumpukan tugas, aktivitas
tersebut akan menggantikan aktivitas pada layar, dengan mewarisi semua
properti multi-jendelanya. Jika Anda ingin meluncurkan aktivitas baru sebagai jendela
terpisah dalam mode multi-jendela, Anda harus meluncurkannya dalam tumpukan tugas baru.
</p>
<h3 id="dnd">Mendukung seret dan letakkan</h3>
<p>
Pengguna bisa <a href="{@docRoot}guide/topics/ui/drag-drop.html">menyeret dan
meletakkan</a> data dari satu aktivitas ke aktivitas yang lain selagi kedua aktivitas
berbagi layar. (Sebelumnya, pengguna hanya bisa menyeret dan meletakkan data dalam
aktivitas tunggal.) Karena alasan ini, Anda mungkin perlu menambahkan fungsionalitas
seret dan letakkan ke aplikasi Anda jika aplikasi Anda saat ini belum mendukungnya.
</p>
<p>
N Preview SDK menambahkan paket <a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a>
untuk mendukung seret dan letakkan lintas-aplikasi. Untuk mengetahui detail tentang kelas dan metode
berikut, lihat <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi N
Preview SDK</a>.
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
Objek token bertanggung jawab menetapkan izin yang diberikan kepada aplikasi
yang menerima peletakan tersebut.
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
Alias baru untuk {@link android.view.View#startDrag View.startDrag()}. Untuk
mengaktifkan seret dan letakkan lintas-aktivitas, teruskan flag baru
<code>View.DRAG_FLAG_GLOBAL</code>. Jika Anda perlu memberikan izin URI ke
aktivitas penerima, teruskan flag baru,
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> atau
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code>, sebagaimana mestinya.
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
Membatalkan operasi seret yang sedang berlangsung. Hanya bisa dipanggil oleh
aplikasi yang menghasilkan operasi seret.
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
Menggantikan bayangan penyeretan untuk operasi seret yang sedang berlangsung. Hanya
bisa dipanggil oleh aplikasi yang menghasilkan operasi seret.
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
Meminta izin untuk URI konten yang diteruskan dengan {@link
android.content.ClipData} yang terdapat dalam {@link android.view.DragEvent}.
</dd>
</dl>
<h2 id="testing">Menguji Dukungan Multi-Jendela Aplikasi Anda</h2>
<p>
Baik Anda memperbarui aplikasi untuk Android N maupun tidak, Anda harus
memverifikasi caranya bertindak dalam mode multi-jendela jika pengguna mencoba meluncurkannya
dalam mode multi-jendela pada perangkat yang menjalankan Android N.
</p>
<h3 id="configuring">Mengonfigurasi Perangkat Pengujian</h3>
<p>
Jika Anda menginstal Android N pada perangkat, mode
layar terbagi secara otomatis didukung.
</p>
<h3 id="test-non-n">Jika aplikasi Anda tidak dibangun dengan N Preview SDK</h3>
<p>
Jika Anda tidak membangun aplikasi dengan N Preview SDK dan pengguna berupaya menggunakan
aplikasi dalam mode multi-jendela, sistem secara paksa akan mengubah ukuran aplikasi kecuali jika aplikasi
mendeklarasikan orientasi tetap.
</p>
<p>
Jika aplikasi Anda tidak mendeklarasikan orientasi tetap, Anda harus meluncurkan aplikasi
pada perangkat yang menjalankan Android N dan berupaya menempatkan aplikasi tersebut dalam
mode layar terbagi. Pastikan pengalaman pengguna
bisa diterima bila aplikasi secara paksa diubah ukurannya.
</p>
<p>
Jika aplikasi mendeklarasikan orientasi tetap, Anda harus berupaya menempatkan aplikasi dalam
mode multi-jendela. Periksa apakah Anda melakukannya, aplikasi tetap berada dalam
mode layar penuh.
</p>
<h3 id="test-mw">Jika Anda mendukung mode multi-jendela</h3>
<p>
Jika Anda membuat aplikasi Anda dengan N Preview SDK dan belum menonaktifkan
dukungan multi-jendela, periksa perilaku berikut dalam mode layar terbagi
dan mode bentuk bebas.
</p>
<ul>
<li>Luncurkan aplikasi dalam mode layar penuh, kemudian beralih ke mode multi-jendela dengan
menekan lama pada tombol Overview. Periksa apakah aplikasi berpindah dengan benar.
</li>
<li>Jalankan aplikasi secara langsung dalam mode multi-jendela, dan pastikan aplikasi
diluncurkan dengan benar. Anda bisa meluncurkan aplikasi dalam mode multi-jendela dengan menekan
tombol Overview, kemudian menekan lama baris judul pada aplikasi Anda dan menyeretnya
ke salah satu area yang disorot di layar.
</li>
<li>Ubah ukuran aplikasi Anda dalam mode layar terbagi dengan menyeret garis pembagi.
Periksa apakah aplikasi mengubah ukuran tanpa crash, dan apakah elemen UI yang diperlukan
terlihat.
</li>
<li>Jika Anda telah menetapkan dimensi minimum aplikasi, cobalah untuk mengubah ukuran
aplikasi di bawah dimensi tersebut. Periksa apakah Anda tidak bisa mengubah ukuran aplikasi menjadi
lebih kecil dari minimum yang ditetapkan.
</li>
<li>Melalui semua tes, periksa apakah kinerja aplikasi Anda bisa diterima. Misalnya,
periksa apakah tidak ada jeda yang terlalu lama untuk memperbarui UI setelah
aplikasi diubah ukurannya.
</li>
</ul>
<h4 id="test-checklist">Daftar periksa pengujian</h4>
<p>
Untuk memeriksa kinerja aplikasi Anda dalam mode multi-jendela, cobalah operasi
berikut. Anda harus mencoba semua operasi ini dalam mode layar terbagi dan
dan mode multi-jendela, kecuali jika dinyatakan berbeda.
</p>
<ul>
<li>Masuki dan tinggalkan mode multi-jendela.
</li>
<li>Beralih dari aplikasi Anda ke aplikasi lain, dan periksa apakah aplikasi berperilaku
sebagaimana mestinya saat terlihat namun tidak aktif. Misalnya, jika aplikasi Anda
sedang memutar video, periksa apakah video terus diputar selagi pengguna
berinteraksi dengan aplikasi lain.
</li>
<li>Dalam mode layar terbagi, cobalah menggeser garis pembagi untuk membuat aplikasi
Anda menjadi lebih besar dan lebih kecil. Coba operasi ini dalam konfigurasi berdampingan dan
atas-bawah. Periksa apakah aplikasi tidak crash,
fungsionalitas penting bisa terlihat, dan operasi mengubah ukuran tidak memakan waktu terlalu
lama.
</li>
<li>Lakukan beberapa operasi ubah ukuran berturut-turut dalam waktu cepat. Periksa apakah
aplikasi Anda tidak crash atau mengalami kebocoran memori. Untuk informasi tentang memeriksa penggunaan memori
aplikasi Anda, lihat <a href="{@docRoot}tools/debugging/debugging-memory.html">
Menyelidiki Penggunaan RAM Anda</a>.
</li>
<li>Gunakan aplikasi secara normal di sejumlah konfigurasi jendela yang berbeda, dan
periksa apakah aplikasi berperilaku sebagaimana mestinya. Periksa apakah teks terbaca, dan apakah
elemen UI tidak terlalu kecil untuk interaksi.
</li>
</ul>
<h3 id="test-disabled-mw">Jika Anda telah menonaktifkan dukungan multi-jendela</h3>
<p>
Jika Anda menonaktifkan dukungan multi-jendela dengan mengatur
<code>android:resizableActivity="false"</code>, Anda harus menjalankan aplikasi pada
perangkat yang menjalankan Android N dan berusaha menempatkan aplikasi dalam
mode bentuk bebas dan mode layar terbagi. Periksa apakah Anda melakukannya, aplikasi tetap berada dalam
mode layar penuh.
</p>

View File

@@ -0,0 +1,214 @@
page.title=Bahasa dan Lokal
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini:</h2>
<ol>
<li><a href="#preN">Tantangan dalam Mengatasi Masalah Sumber Daya Bahasa</a></li>
<li><a href="#postN">Peningkatan pada Strategi Resolusi Sumber Daya</a></li>
<li><a href="#design">Mendesain Aplikasi Anda untuk Mendukung Lokal
Tambahan</a></li>
</ol>
</div>
</div>
<p>Android N memberikan dukungan yang disempurnakan untuk pengguna multibahasa,
yang memungkinkan mereka memilih beberapa lokal dalam pengaturan. Android N
menyediakan kemampuan ini dengan memperbanyak jumlah lokal yang didukung
dan mengubah cara sistem mengatasi masalah sumber daya. Metode baru mengatasi
masalah sumber daya ini lebih tangguh dan didesain agar kompatibel dengan APK yang ada, namun
Anda harus ekstra hati-hati terhadap perilaku tak terduga. Misalnya, Anda
harus menguji untuk memastikan aplikasi Anda secara default diatur ke bahasa yang diinginkan. Juga,
jika aplikasi Anda mendukung beberapa bahasa, Anda harus memastikan dukungan ini berfungsi
sebagaimana diinginkan. Terakhir, Anda harus mencoba memastikan aplikasi Anda dengan lancar menangani
bahasa yang tidak secara eksplisit Anda dukung dalam desain.</p>
<p>Dokumen ini diawali dengan menjelaskan strategi resolusi sumber daya sebelum
Android N. Berikutnya, akan dijelaskan strategi
resolusi sumber daya Android N yang telah ditingkatkan. Terakhir, akan djelaskan cara memanfaatkan
jumlah lokal yang telah diperbanyak untuk mendukung lebih banyak pengguna multibahasa.</p>
<h2 id="preN">Tantangan dalam Mengatasi Masalah Sumber Daya Bahasa</h2>
<p>Sebelum Android N, Android tidak selalu
berhasil mencocokkan lokal aplikasi dan lokal sistem. Misalnya, anggaplah bahasa default aplikasi Anda
adalah US English, namun aplikasi itu juga berisi string bahasa Spanyol yang dilokalkan di file sumber daya {@code es_ES}.
.</p>
<p>Bila kode Java Anda mengacu ke string, itu akan mengatasi masalah bahasa string sebagai
berikut:</p>
<ul>
<li>Jika perangkat diatur ke {@code es_MX} (Spanish-Mexico), Android akan memuat
string dari file sumber daya {@code es_ES}.</li>
<li>Jika perangkat diatur ke {@code en_AU}, Android akan kembali pada {@code
en_US}. Sistem juga akan default ke {@code en_US} jika pengguna memilih
bahasa yang sama sekali tidak didukung oleh aplikasi, seperti bahasa Prancis.</li>
</ul>
<p>Masalah resolusi ini muncul karena sistem menghilangkan kode negara
dari lokal jika tidak bisa menemukan yang sama persis. Misalnya:</p>
<p class="table-caption" id="t-resource-res">
<strong>Tabel 1.</strong> Resolusi sumber daya tanpa lokal yang persis sama.
</p>
<table>
<tbody>
<tr>
<th>Pengaturan Pengguna</th>
<th>Sumber Daya Aplikasi</th>
<th>Resolusi Sumber Daya</th>
</tr>
<tr>
<td>fr_CH</td>
<td>
default (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Coba fr_CH =&gt; Gagal<br>
Coba fr =&gt; Gagal<br>
Gunakan default (en)
</td>
</tr>
</tbody>
</table>
<p>Dalam contoh ini, sistem menampilkan string bahasa Inggris
tanpa mengetahui apakah pengguna memahami bahasa Inggris. Perilaku ini sudah sangat umum
sekarang. Android N harus mengurangi frekuensi
hasil seperti ini secara substansial.</p>
<h2 id="postN">Peningkatan pada Strategi Resolusi Sumber Daya</h2>
<p>Android N menghadirkan resolusi sumber daya yang lebih handal, dan
secara otomatis menemukan solusi yang lebih baik. Akan tetapi, untuk mempercepat resolusi dan meningkatkan
kemudahan pemeliharaan, Anda harus menyimpan sumber daya dalam dialek induk yang paling umum.
Misalnya, jika sebelumnya Anda telah menyimpan sumber daya bahasa Spanyol di direktori {@code es-US}
, pindahkan ke direktori {@code es-419}, yang berisi bahasa Spanyol Amerika Latin.
Demikian pula, jika Anda memiliki string sumber daya dalam folder bernama {@code en-GB}, ganti nama
folder itu menjadi {@code en-001} (bahasa Inggris internasional), karena induk yang paling umum
untuk string <code>en-GB</code> adalah {@code en-001}.
Contoh berikut menjelaskan mengapa praktik-praktik ini meningkatkan kinerja dan
reliabilitas resolusi sumber daya.</p>
<h3>Contoh resolusi sumber daya</h3>
<p>Dengan Android N, kasus yang dijelaskan dalam <strong>Tabel 1</strong> diatasi
secara berbeda:</p>
<p class="table-caption" id="t-improved-res">
<strong>Tabel 2.</strong> Strategi resolusi yang ditingkatkan bila tidak ada
lokal yang sama persis.</p>
<table>
<tr>
<th>Pengaturan Pengguna</th>
<th>Sumber Daya Aplikasi</th>
<th>Resolusi Sumber Daya</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
default (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Coba fr_CH =&gt; Gagal<br>
Coba fr =&gt; Gagal<br>
Coba anak dari fr =&gt; fr_FR<br>
Gunakan fr_FR
</td>
</tr>
</table>
<p>Sekarang pengguna mendapatkan sumber daya bahasa Prancis sebagai ganti bahasa Inggris. Contoh ini juga menunjukkan
mengapa Anda harus menyimpan string bahasa Prancis dalam {@code fr} bukan dalam {@code fr_FR}
untuk Android N. Tindakan di sini adalah untuk mencocokkan dengan induk dialek terdekat,
yang membuat resolusi menjadi lebih cepat dan lebih bisa diprediksi.</p>
<p>Selain logika resolusi yang diperbaiki ini, Android sekarang menawarkan lebih banyak
pilihan bahasa untuk pengguna. Mari kita coba lagi contoh di atas dengan menetapkan bahasa Italia
sebagai bahasa pengguna tambahan, tetapi tanpa dukungan aplikasi untuk bahasa Prancis. </p>
<p class="table-caption" id="t-2d-choice">
<strong>Tabel 3.</strong> Resolusi sumber daya bila aplikasi hanya mencocokkan
pengaturan lokal yang disukai kedua oleh pengguna.</p>
<table>
<tr>
<th>Pengaturan Pengguna</th>
<th>Sumber Daya Aplikasi</th>
<th>Resolusi Sumber Daya</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
<li> it_CH</li>
</ol>
</td>
<td>
default (en)<br>
de_DE<br>
es_ES<br>
it_IT<br>
</td>
<td>
Coba fr_CH =&gt; Gagal<br>
Coba fr =&gt; Gagal<br>
Coba anak dari fr =&gt; Gagal<br>
Coba it_CH =&gt; Gagal<br>
Coba it =&gt; Gagal<br>
Coba anak dari it =&gt; it_IT<br>
Gunakan it_IT
</td>
</tr>
</table>
<p>Pengguna tetap mendapatkan bahasa yang mereka pahami, meskipun aplikasi tidak
mendukung bahasa Prancis.</p>
<h2 id="design">Mendesain Aplikasi Anda untuk Mendukung Lokal Tambahan</h2>
<h3>LocaleList API</h3>
<p>Android N menambahkan API baru {@code LocaleList.GetDefault()}
yang memungkinkan aplikasi langsung melakukan query daftar bahasa yang telah ditetapkan pengguna. API ini
memungkinkan Anda untuk membuat
perilaku aplikasi yang lebih canggih dan tampilan konten yang lebih optimal. Misalnya, Pencarian
bisa menampilkan hasil dalam beberapa bahasa berdasarkan pengaturan pengguna. Aplikasi browser
bisa menghindari penawaran menerjemahkan halaman dalam bahasa yang sudah diketahui pengguna,
dan aplikasi keyboard bisa mengaktifkan otomatis semua layout yang sesuai. </p>
<h3>Formatter</h3>
<p>Hingga Android 6.0 (API level 23), Android hanya mendukung satu atau dua lokal
untuk banyak bahasa umum
(en, es, ar, fr, ru). Karena hanya ada beberapa varian dari setiap bahasa,
aplikasi bisa menghindar dengan menyimpan beberapa nomor dan tanggal sebagai string hard-code
dalam file sumber daya. Akan tetapi, dengan perluasan set lokal yang didukung Android,
maka akan ada
perbedaan format yang signifikan untuk tanggal, waktu, mata uang, dan informasi
serupa bahkan dalam lokal tunggal. Menjadikan format Anda sebagai hard-code bisa menghasilkan
pengalaman yang membingungkan bagi pengguna akhir. Karena itu, saat mengembangkan untuk Android N
pastikan menggunakan formatter sebagai ganti menjadikan string angka dan tanggal sebagai hard-code.</p>
<p>Contoh terbaik adalah bahasa Arab, yang mendukung Android N berkembang dari
satu {@code ar_EG} menjadi 27 lokal bahasa Arab. Bahasa lokal ini bisa berbagi hampir semua sumber daya,
namun sebagian lebih memilih digit ASCII, sementara yang lain memilih digit asli. Misalnya,
bila Anda ingin membuat kalimat dengan variabel digit, seperti
"Pilih PIN 4 digit", gunakan formatter seperti yang ditampilkan di bawah ini:</p>
<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>

View File

@@ -0,0 +1,328 @@
page.title=Pemberitahuan
page.tags=notifications
helpoutsWidget=true
page.image=/preview/images/notifications-card.png
trainingnavtop=true
@jd:body
<div id="qv-wrapper">
<div id="qv">
<!-- table of contents -->
<h2>Dokumen ini berisi</h2>
<ol>
<li><a href="#direct">Balasan Langsung</a></li>
<li><a href="#bundle">Bundel Pemberitahuan</a></li>
<li><a href="#custom">Tampilan Custom</a></li>
</ol>
</div>
</div>
<p>Android N memperkenalkan beberapa API baru yang memungkinkan aplikasi memposting
pemberitahuan yang sangat terlihat dan interaktif.</p>
<p>Android N menambahkan API pemberitahuan{@link android.support.v4.app.RemoteInput}
yang ada untuk mendukung balasan inline pada handset. Fitur ini memungkinkan pengguna
merespons dengan cepat dari bayangan pemberitahuan tanpa mengunjungi aplikasi Anda.</p>
<p>
Android N juga memungkinkan Anda menggabungkan pemberitahuan yang serupa agar
muncul sebagai satu pemberitahuan. Untuk memungkinkan hal ini, Android N menggunakan metode {@link
android.support.v4.app.NotificationCompat.Builder#setGroup
NotificationCompat.Builder.setGroup()} yang sudah ada. Pengguna bisa memperluas setiap
pemberitahuan, dan melakukan tindakan seperti membalas dan menutup setiap
pemberitahuan, satu per satu dari bayangan pemberitahuan.
</p>
<p>Terakhir, Android N juga menambahkan API baru yang memungkinkan Anda untuk memanfaatkan dekorasi
sistem dalam tampilan pemberitahuan yang disesuaikan untuk aplikasi Anda. API ini membantu
memastikan semua tampilan pemberitahuan sama-sama menggunakan penyajian yang konsisten dengan
template standar.</p>
<p>Dokumen ini menyoroti beberapa perubahan penting yang harus Anda
perhitungkan saat menggunakan fitur pemberitahuan baru dalam aplikasi Anda.</p>
<h2 id="direct">Balasan Langsung</h2>
<p>Dengan fitur Balasan Langsung di Android N, pengguna bisa dengan cepat
merespons pesan teks atau memperbarui daftar tugas secara langsung dalam antarmuka
pemberitahuan. Pada perangkat genggam, tindakan balasan inline muncul sebagai tombol tambahan
yang dilampirkan pada pemberitahuan. Bila pengguna membalas lewat keyboard, sistem akan melampirkan
respons teks ke intent
yang telah Anda tetapkan untuk tindakan pemberitahuan dan mengirimkan intent ke
aplikasi perangkat genggam Anda.
<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
{@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
<p class="img-caption">
<strong>Gambar 1.</strong> Android N menambahkan tombol tindakan <strong>Reply</strong>
.
</p>
<h3>Menambahkan tindakan balasan inline</h3>
<p>Untuk membuat tindakan pemberitahuan yang mendukung balasan langsung:
</p>
<ol>
<li>Buat instance {@link android.support.v4.app.RemoteInput.Builder}
yang bisa Anda tambahkan ke tindakan
pemberitahuan. Konstruktor kelas ini akan menerima string bahwa sistem menggunakannya sebagai kunci
untuk input teks. Kemudian, aplikasi perangkat genggam Anda akan menggunakan kunci itu untuk mengambil teks
input tersebut.
<pre>
// Key for the string that's delivered in the action's intent
private static final String KEY_TEXT_REPLY = "key_text_reply";
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
</pre>
</li>
<li>Lampirkan objek {@link android.support.v4.app.RemoteInput}
pada tindakan dengan menggunakan <code>addRemoteInput()</code>.
<pre>
// Create the reply action and add the remote input
Notification.Action action =
new Notification.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
.build();
</pre>
</li>
<li>Terapkan tindakan pada pemberitahuan dan keluarkan pemberitahuan.
<pre>
// Build the notification and add the action
Notification notification =
new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.content))
.addAction(action))
.build();
// Issue the notification
NotificationManager notificationManager =
NotificationManager.from(mContext);
notificationManager.notify(notificationId, notification);
</pre>
</li>
</ol>
<p> Sistem akan meminta pengguna memasukkan respons bila mereka memicu
tindakan pemberitahuan. </p>
<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
{@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
<p class="img-caption">
<strong>Gambar 2.</strong> Pengguna memasukkan teks dari bayangan pemberitahuan.
</p>
<h3>Mengambil input pengguna dari balasan inline</h3>
<p>Untuk menerima input pengguna dari antarmuka pemberitahuan untuk aktivitas yang Anda
deklarasikan dalam intent tindakan balasan:</p>
<ol>
<li> Panggil {@link android.support.v4.app.RemoteInput#getResultsFromIntent
getResultsFromIntent()} dengan meneruskan intent tindakan pemberitahuan sebagai
parameter input. Metode ini mengembalikan {@link android.os.Bundle} yang
berisi respons teks.
</li>
<pre>
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
</pre>
<li>Lakukan query pada bundel menggunakan kunci hasil (diberikan ke konstruktor {@link
android.support.v4.app.RemoteInput.Builder}).
</li>
</ol>
<p>Cuplikan kode berikut mengilustrasikan cara metode mengambil teks input
dari bundel:</p>
<pre>
// Obtain the intent that started this activity by calling
// Activity.getIntent() and pass it into this method to
// get the associated string.
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
return null;
}
</pre>
<p>Aplikasi bisa menerapkan logika untuk memutuskan tindakan apa yang harus diambil pada teks
yang telah diambil.
Untuk aplikasi interaktif (seperti chat), memberikan lebih banyak konteks dalam pemberitahuan itu sendiri
(misalnya, beberapa baris riwayat obrolan, termasuk pesan pengguna pribadi)
sehingga pengguna bisa merespons dengan tepat.
Bila pengguna merespons melalui{@link android.support.v4.app.RemoteInput},
sertakan teks dalam riwayat balasan dengan metode {@code setRemoteInputHistory()}
.</p>
<h2 id="bundle">Bundel Pemberitahuan</h2>
<p>Android N membekali pengembang dengan sebuah cara baru untuk menyatakan
antrean pemberitahuan: <i>bundel pemberitahuan</i>. Ini mirip dengan fitur
<a href="{@docRoot}training/wearables/notifications/stacks.html">Tumpukan
Pemberitahuan</a> dalam Android Wear. Misalnya, jika aplikasi Anda membuat pemberitahuan
untuk pesan yang diterima, bila lebih dari satu pesan diterima, pemberitahuan tersebut akan
dibundel sebagai satu grup. Anda bisa
menggunakan metode {@link android.support.v4.app.NotificationCompat.Builder#setGroup
Builder.setGroup()} yang ada untuk membundel pemberitahuan yang sama.</p>
<p>
Grup pemberitahuan menerapkan hierarki pada pemberitahuan yang ada di dalamnya.
Di bagian teratas hierarki adalah pemberitahuan induk yang menampilkan informasi
rangkuman untuk grup tersebut. Pengguna secara bertahap bisa
memperbesar grup pemberitahuan, dan sistem akan menampilkan informasi lebih banyak saat
pengguna menggali lebih dalam. Bila pengguna memperbesar bundel, sistem akan memperlihatkan informasi lebih
banyak untuk semua pemberitahuan anak; bila pengguna
memperbesar salah satu pemberitahuan tersebut, sistem akan memperlihatkan seluruh isinya.
</p>
<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
{@docRoot}preview/images/bundles_2x.png 2x" width="300">
<p class="img-caption">
<strong>Gambar 3.</strong> Pengguna secara bertahap bisa memperluas grup
pemberitahuan.
</p>
<p>Untuk mengetahui cara menambahkan pemberitahuan ke grup, lihat
<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Menambahkan
Setiap Pemberitahuan ke Grup</a>.</p>
<h3 id="best-practices">Praktik terbaik untuk bundel pemberitahuan</h3>
<p>Bagian ini memberikan panduan tentang kapan menggunakan grup pemberitahuan sebagai ganti
pemberitahuan {@link android.app.Notification.InboxStyle InboxStyle}
yang telah tersedia di
platform Android versi sebelumnya.</p>
<h3>Kapan menggunakan bundel pemberitahuan</h3>
<p>Anda harus menggunakan grup pemberitahuan hanya jika semua kondisi berikut ini
bernilai benar untuk kasus penggunaan Anda:</p>
<ul>
<li>Pemberitahuan anak adalah pemberitahuan lengkap dan bisa ditampilkan
masing-masing tanpa perlu rangkuman grup.</li>
<li>Ada untungnya memunculkan pemberitahuan anak satu per satu. Misalnya:
</li>
<ul>
<li>Bisa diaplikasikan, dengan tindakan yang spesifik untuk setiap anak.</li>
<li>Ada lebih banyak informasi pada anak yang ingin dibaca oleh pengguna.</li>
</ul>
</ul>
<p>Contoh kasus penggunaan yang baik untuk grup pemberitahuan antara lain: aplikasi pertukaran pesan
yang menampilkan daftar pesan yang masuk, atau aplikasi email yang menampilkan daftar email
yang diterima.</p>
<p>
Contoh kasus di mana pemberitahuan tunggal lebih disukai
antara lain pesan individual dari satu orang, atau representasi daftar
item teks satu-baris. Anda bisa menggunakan
({@link android.app.Notification.InboxStyle InboxStyle} atau
{@link android.app.Notification.BigTextStyle BigTextStyle}) untuk mencapai
hal ini.
</p>
<h3 id ="post">Menampilkan bundel pemberitahuan</h3>
<p>
Aplikasi ini harus selalu memposting rangkuman grup, sekalipun grup hanya berisi
satu anak. Sistem akan menyembunyikan rangkuman dan langsung menampilkan
pemberitahuan anak jika hanya berisi pemberitahuan tunggal. Hal ini akan memastikan
sistem bisa memberikan pengalaman yang konsisten saat pengguna menggeser
anak grup.
</p>
<p class="note">
<strong>Catatan:</strong> Versi Android N ini tidak menyembunyikan
rangkuman untuk grup pemberitahuan yang berisi satu anak. Fungsionalitas
ini akan ditambahkan dalam Android N versi berikutnya.
</p>
<h3>Mengintip pemberitahuan</h3>
<p>Walaupun sistem biasanya menampilkan pemberitahuan anak sebagai sebuah grup, Anda bisa mengaturnya
agar muncul untuk sementara muncul sebagai
<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">
pemberitahuan pendahuluan</a>. Fitur ini khususnya berguna karena memungkinkan
akses langsung ke pemberitahuan anak terbaru dan tindakan yang dikaitkan dengannya.
</p>
<h3>Kompatibilitas mundur</h3>
<p>
Baik grup pemberitahuan maupun input jauh telah menjadi bagian dari {@link
android.app.Notification} API sejak Android 5.0 (API level 21) untuk mendukung
perangkat Android Wear. Jika Anda sudah membuat pemberitahuan dengan API ini,
satu-satunya tindakan yang harus Anda ambil adalah memeriksa apakah perilaku aplikasi sesuai dengan panduan yang
dijelaskan di atas, dan mempertimbangkan implementasi {@code
setRemoteInputHistory()}.
</p>
<p>
Untuk mendukung kompatibilitas mundur, tersedia API yang sama bersama
kelas {@link android.support.v4.app.NotificationCompat}
pustaka dukungan, yang memungkinkan Anda untuk membuat pemberitahuan yang bekerja pada versi Android
sebelumnya. Pada perangkat genggam dan tablet, pengguna hanya melihat pemberitahuan rangkuman,
sehingga aplikasi tetap memiliki gaya kotak masuk atau representasi pemberitahuan yang sama
untuk seluruh konten informasi grup. Karena perangkat Android
Wear memungkinkan pengguna melihat semua pemberitahuan anak bahkan pada level platform
yang lebih lama, maka Anda harus membuat pemberitahuan anak dengan mengabaikan level
API.
</p>
<h2 id="custom"> Tampilan Custom</h2>
<p>Mulai dari Android N, Anda bisa menyesuaikan tampilan pemberitahuan dan
tetap mendapatkan dekorasi sistem seperti header pemberitahuan, tindakan, dan
layout yang bisa diperluas.</p>
<p>Untuk mengaktifkan kemampuan ini, Android N menambahkan API berikut untuk menata gaya
tampilan custom Anda:</p>
<dl>
<dt>
{@code DecoratedCustomViewStyle()}</dt>
<dd> Menata gaya pemberitahuan selain pemberitahuan
media.</dd>
<dt>
{@code DecoratedMediaCustomViewStyle()}</dt>
<dd> Menata gaya pemberitahuan media.</dd>
</dl>
<p>Untuk menggunakan API baru ini, panggil metode {@code setStyle()}, dengan meneruskan
gaya tampilan custom yang diinginkan padanya.</p>
<p>Cuplikan ini menampilkan cara membuat objek pemberitahuan custom dengan metode
{@code DecoratedCustomViewStyle()}.</p>
<pre>
Notification noti = new Notification.Builder()
.setSmallIcon(R.drawable.ic_stat_player)
.setLargeIcon(albumArtBitmap))
.setCustomContentView(contentView);
.setStyle(new Notification.DecoratedCustomViewStyle())
.build();
</pre>

View File

@@ -0,0 +1,186 @@
page.title=Gambar-dalam-gambar
page.keywords=preview,sdk,PIP,Picture-in-picture
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#declaring">Mendeklarasikan Bahwa Aktivitas Anda Mendukung
Gambar-dalam-gambar</a></li>
<li><a href="#pip_button">Mengalihkan Aktivitas Anda ke Gambar-dalam-gambar</a>
</li>
<li><a href="#handling_ui">Menangani UI Selama Gambar-dalam-gambar</a>
</li>
<li><a href="#continuing_playback">Melanjutkan Pemutaran Video Saat dalam
Gambar-dalam-gambar</a></li>
<li><a href="#best">Praktik Terbaik</a></li>
</ol>
<h2>Lihat Juga</h2>
<ol>
<li><a href="{@docRoot}preview/features/multi-window.html">Dukungan
Multi-Jendela</a></li>
</ol>
</div>
</div>
<p>Di Android N, pengguna Android TV sekarang bisa menonton video
dalam jendela yang disematkan di sudut layar saat menyusuri
aplikasi. Mode gambar-dalam-gambar (PIP) memungkinkan aplikasi menjalankan aktivitas
video dalam jendela yang disematkan selagi aktivitas lain tetap berjalan di
latar belakang. Jendela PIP memungkinkan pengguna melakukan multitasking saat menggunakan aplikasi Anda, yang
membantu pengguna menjadi lebih produktif.</p>
<p>Aplikasi Anda bisa memutuskan kapan memicu mode PIP. Inilah beberapa contoh
kapan memasuki mode PIP:</p>
<ul>
<li>Aplikasi Anda bisa memindahkan video ke dalam mode PIP bila pengguna mengarah
mundur dari video untuk melihat-lihat konten lainnya.</li>
<li>Aplikasi Anda bisa mengalihkan video ke dalam mode PIP selagi pengguna menonton akhir episode
dari konten. Layar utama menampilkan informasi
promosi atau rangkuman tentang episode berikutnya dalam seri tersebut.</li>
<li>Aplikasi Anda bisa menyediakan suatu cara bagi pengguna untuk mengantre konten tambahan selagi
mereka menonton video. Video terus dimainkan dalam mode PIP selagi layar
utama menampilkan aktivitas pemilihan konten.</li>
</ul>
<p>Jendela PIP memiliki luas 240x135 dp dan ditampilkan di layer paling atas pada salah satu
dari empat sudut layar, yang dipilih oleh sistem. Pengguna bisa memunculkan
menu PIP yang memungkinkan mereka untuk beralih mode dari jendela PIP ke layar penuh, atau menutup jendela
PIP, dengan menekan dan menahan tombol <b>Beranda</b> pada remote. Jika video
lain mulai diputar pada layar utama, jendela PIP secara otomatis
ditutup. Pengguna juga bisa menutup jendela PIP melalui Recents.</p>
<img src="{@docRoot}preview/images/pip-active.png" />
<p class="img-caption"><strong>Gambar 1.</strong> Video
Gambar-dalam-gambar terlihat di sudut layar selagi pengguna melihat-lihat konten pada layar
utama.</p>
<p>PIP memanfaatkan API multi-jendela yang tersedia di Android N untuk
menyediakan jendela overlay video yang disematkan. Untuk menambahkan PIP ke aplikasi, Anda harus
mendaftarkan aktivitas yang mendukung PIP, mengalihkan aktivitas Anda ke mode PIP bila
diperlukan, serta memastikan elemen UI disembunyikan dan pemutaran video berlanjut bila
aktivitas dalam mode PIP.</p>
<h2 id="declaring">Mendeklarasikan Bahwa Aktivitas Anda Mendukung Gambar-dalam-gambar</h2>
<p>Secara default, sistem tidak secara otomatis mendukung PIP untuk aplikasi.
Jika Anda ingin mendukung PIP dalam aplikasi, daftarkan aktivitas
video Anda dalam manifes dengan mengatur
<code>android:supportsPictureInPicture</code> dan
<code>android:resizeableActivity</code> ke <code>true</code>. Juga, tetapkan
bahwa aktivitas Anda menangani perubahan konfigurasi layout sehingga aktivitas
Anda tidak diluncurkan ulang saat terjadi perubahan layout selama transisi mode PIP.</p>
<pre>
&lt;activity android:name="VideoActivity"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
</pre>
<p>Saat mendaftarkan aktivitas Anda, ingatlah bahwa dalam mode PIP aktivitas
Anda akan ditampilkan pada jendela overlay kecil pada layar TV. Aktivitas
pemutaran video dengan UI minimal akan memberikan pengalaman pengguna terbaik. Aktivitas yang
berisi elemen UI kecil mungkin tidak memberikan pengalaman pengguna yang baik
bila beralih ke mode PIP, karena pengguna tidak bisa melihat elemen UI secara detail
di jendela PIP.</p>
<h2 id="pip_button">Mengalihkan Aktivitas Anda ke Gambar-dalam-gambar</h2>
Bila Anda perlu untuk mengalihkan aktivitas Anda ke mode PIP, panggil
<code>Activity.enterPictureInPicture()</code>. Contoh berikut mengalihkan
ke mode PIP bila pengguna memilih tombol PIP khusus pada baris
kontrol media:</p>
<pre>
&#64;Override
public void onActionClicked(Action action) {
if (action.getId() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPicture();
return;
}
...
</pre>
<p>Menambahkan tombol PIP ke baris kontrol media Anda akan memungkinkan pengguna dengan mudah beralih
ke mode PIP selagi mengontrol pemutaran video.</p>
<img src="{@docRoot}preview/images/pip-button.png" />
<p class="img-caption"><strong>Gambar 1.</strong> Tombol
gambar-dalam-gambar pada baris kontrol media.</p>
<p>Android N menyertakan kelas
<code>PlaybackControlsRow.PictureInPictureAction</code> baru yang mendefinisikan
tindakan PIP baris kontrol dan menggunakan ikon PIP.</p>
<h2 id="handling_ui">Menangani UI Selama Gambar-dalam-gambar</h2>
<p>Bila aktivitas Anda memasuki mode PIP, aktivitas Anda seharusnya hanya menampilkan pemutaran
video. Hilangkan elemen UI sebelum aktivitas Anda memasuki PIP,
dan pulihkan elemen ini bila aktivitas Anda beralih ke layar penuh lagi.
Kesampingkan <code>Activity.onPictureInPictureChanged()</code> atau
<code>Fragment.onPictureInPictureChanged()</code> dan aktifkan atau
nonaktifkan elemen UI saat diperlukan, misalnya:</p>
<pre>
&#64;Override
public void onPictureInPictureChanged(boolean inPictureInPicture) {
if (inPictureInPicture) {
// Hide the controls in picture-in-picture mode.
...
} else {
// Restore the playback UI based on the playback status.
...
}
}
</pre>
<h2 id="continuing_playback">Melanjutkan Pemutaran Video Saat dalam
Gambar-dalam-gambar</h2>
<p>Bila aktivitas Anda beralih ke PIP, sistem akan menganggap aktivitas tersebut berada dalam
keadaan berhenti sementara, dan akan memanggil metode <code>onPause()</code> aktivitas Anda. Pemutaran
video tidak boleh berhenti sementara dan harus terus diputar jika aktivitas tersebut
berhenti sementara karena mode PIP. Periksa PIP dalam metode
<code>onPause()</code> aktivitas Anda dan tangani pemutaran dengan tepat,
misalnya:</p>
<pre>
&#64;Override
public void onPause() {
// If called due to PIP, do not pause playback
if (inPictureInPicture()) {
// Continue playback
...
}
// If paused but not in PIP, pause playback if necessary
...
}
</pre>
<p>Bila aktivitas Anda meninggalkan mode PIP dan kembali ke mode layar penuh, sistem
akan melanjutkan aktivitas Anda dan memanggil metode <code>onResume()</code> Anda.</p>
<h2 id="best">Praktik Terbaik</h2>
<p>PIP ditujukan untuk aktivitas yang memutar video layar penuh. Saat mengalihkan
aktivitas Anda ke mode PIP, hindari menampilkan apa pun selain konten video.
Pantau saat aktivitas Anda memasuki mode PIP dan sembunyikan elemen UI, seperti dijelaskan
dalam <a href="#handling_ui">Menangani UI Selama Gambar-dalam-gambar</a>.</p>
<p>Karena jendela PIP ditampilkan sebagai jendela mengambang di sudut
layar, Anda harus menghindari menampilkan informasi penting di layar utama
di area mana saja yang bisa terhalang oleh jendela PIP.</p>
<p>Bila aktivitas ada berada dalam mode PIP, secara default aktivitas itu tidak mendapatkan fokus input. Untuk
menerima kejadian input saat dalam mode PIP, gunakan
<code>MediaSession.setMediaButtonReceiver()</code>.</p>

View File

@@ -0,0 +1,124 @@
page.title=Scoped Directory Access
page.keywords=preview,sdk,scoped directory access
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#accessing">Mengakses Direktori Penyimpanan Eksternal</a></li>
<li><a href="#removable">Mengakses Direktori pada Media Lepas-Pasang</a></li>
<li><a href="#best">Praktik Terbaik</a></li>
</ol>
</div>
</div>
<p>Aplikasi seperti aplikasi foto biasanya hanya memerlukan akses ke direktori tertentu dalam
penyimpanan eksternal, seperti direktori <code>Pictures</code>. Pendekatan
yang ada untuk mengakses penyimpanan eksternal tidak didesain untuk memberikan
akses direktori target dengan mudah untuk tipe aplikasi ini. Misalnya:</p>
<ul>
<li>Meminta {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
atau {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} dalam manifes Anda
akan memungkinkan akses ke semua direktori publik pada penyimpanan eksternal, yang mungkin
lebih banyak akses dari yang dibutuhkan aplikasi Anda.</li>
<li>Penggunaan
<a href="{@docRoot}guide/topics/providers/document-provider.html">Storage
Access Framework</a> biasanya membuat pengguna Anda memilih direktori
melalui UI sistem, yang tidak diperlukan jika aplikasi Anda selalu mengakses
direktori eksternal yang sama.</li>
</ul>
<p>Android N menyediakan API baru yang disederhanakan untuk mengakses
direktori penyimpanan eksternal umum. </p>
<h2 id="accessing">Mengakses Direktori Penyimpanan Eksternal</h2>
<p>Gunakan kelas <code>StorageManager</code> untuk mendapatkan instance
<code>StorageVolume</code> yang tepat. Kemudian, buat intent dengan memanggil metode
<code>StorageVolume.createAccessIntent()</code> dari instance itu.
Gunakan intent ini untuk mengakses direktori penyimpanan eksternal. Untuk mendapatkan daftar
semua isi yang tersedia, termasuk isi media lepas-pasang, gunakan
<code>StorageManager.getVolumesList()</code>.</p>
<p>Cuplikan kode berikut adalah contoh cara membuka direktori
<code>Pictures</code> dalam penyimpanan bersama utama:</p>
<pre>
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<p>Sistem ini mencoba untuk memberikan akses ke direktori eksternal, dan jika
diperlukan mengonfirmasi akses dengan pengguna menggunakan UI yang disederhanakan:</p>
<img src="{@docRoot}preview/images/scoped-folder-access-framed.png" srcset="{@docRoot}preview/images/scoped-folder-access-framed.png 1x,
{@docRoot}preview/images/scoped-folder-access-framed_2x.png 2x" />
<p class="img-caption"><strong>Gambar 1.</strong> Sebuah aplikasi yang meminta
akses ke direktori Pictures.</p>
<p>Jika pengguna memberi akses, sistem akan memanggil pengesampingan
<code>onActivityResult()</code> Anda dengan kode hasil
<code>Activity.RESULT_OK</code>, dan data intent yang berisi URI. Gunakan
URI yang disediakan untuk mengakses informasi direktori, serupa dengan menggunakan URI
yang dikembalikan oleh
<a href="{@docRoot}guide/topics/providers/document-provider.html">Storage
Access Framework</a>.</p>
<p>Jika pengguna tidak memberi akses, sistem akan memanggil pengesampingan
<code>onActivityResult()</code> Anda dengan kode hasil
<code>Activity.RESULT_CANCELED</code>, dan data intent nol.</p>
<p class="note"><b>Catatan</b>: Mendapatkan akses ke direktori eksternal tertentu
juga akan memperoleh akses ke subdirektori dalam direktori tersebut.</p>
<h2 id="removable">Mengakses Direktori pada Media Lepas-Pasang</h2>
<p>Untuk menggunakan Scoped Directory Access guna mengakses direktori pada media lepas-pasang,
pertama tambahkan {@link android.content.BroadcastReceiver} yang akan mendengarkan pemberitahuan
{@link android.os.Environment#MEDIA_MOUNTED}, misalnya:</p>
<pre>
&lt;receiver
android:name=".MediaMountedReceiver"
android:enabled="true"
android:exported="true" &gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MEDIA_MOUNTED" /&gt;
&lt;data android:scheme="file" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>Bila pengguna memasang media lepas-pasang, seperti kartu SD, sistem akan mengirimkan pemberitahuan
{@link android.os.Environment#MEDIA_MOUNTED}. Pemberitahuan ini
memberikan sebuah objek <code>StorageVolume</code> dalam data intent yang bisa
Anda gunakan untuk mengakses direktori pada media lepas-pasang. Contoh berikut
mengakses direktori <code>Pictures</code> pada media lepas-pasang:</p>
<pre>
// BroadcastReceiver has already cached the MEDIA_MOUNTED
// notification Intent in mediaMountedIntent
StorageVolume volume = (StorageVolume)
mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<h2 id="best">Praktik Terbaik</h2>
<p>Bila memungkinkan, pertahankan URI akses direktori eksternal sehingga Anda tidak perlu
berulang kali meminta akses ke pengguna. Setelah pengguna memberikan akses, panggil
<code>getContentResolver().takePersistableUriPermssion()</code> bersama
URI akses direktori. Sistem akan mempertahankan URI dan permintaan
akses berikutnya akan mengembalikan <code>RESULT_OK</code> dan tidak menampilkan UI konfirmasi kepada
pengguna.</p>
<p>Jika pengguna menolak akses ke direktori eksternal, jangan langsung
meminta akses lagi. Berulang kali meminta akses akan menghasilkan pengalaman
pengguna yang buruk.</p>

View File

@@ -0,0 +1,744 @@
page.title=Network Security Configuration
page.keywords=preview,security,network
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#manifest">Menambahkan File Konfigurasi Keamanan</a></li>
<li><a href="#CustomTrust">Menyesuaikan CA Tepercaya</a>
<ol>
<li><a href="#ConfigCustom">Mengonfigurasi CA Tepercaya Custom</a></li>
<li><a href="#LimitingCas">Membatasi Set CA Tepercaya</a></li>
<li><a href="#TrustingAdditionalCas">Mempercayai CA Tambahan</a></li>
</ol>
</li>
<li><a href="#TrustingDebugCa">Merunut CA Saja</a></li>
<li><a href="#UsesCleartextTraffic">Berhenti dari Lalu Lintas Cleartext</a></li>
<li><a href="#CertificatePinning">Menyematkan Sertifikat</a></li>
<li><a href="#ConfigInheritance">Perilaku Pewarisan Konfigurasi</a></li>
<li><a href="#FileFormat">Format File Konfigurasi</a></li>
</ol>
</div>
</div>
<p>
Android N menyertakan fitur
Network Security Configuration yang memungkinkan aplikasi menyesuaikan pengaturan keamanan jaringan mereka dalam
file konfigurasi deklaratif yang aman tanpa memodifikasi kode aplikasi. Pengaturan ini bisa
dikonfigurasi untuk domain dan aplikasi tertentu. Kemampuan
utama fitur ini adalah sebagai berikut:
</p>
<ul>
<li>
<b>Trust-anchor custom:</b> Menyesuaikan Certificate Authorities (CA) mana
yang dipercaya untuk koneksi aman aplikasi. Misalnya,
mempercayai sertifikat tertentu yang ditandatangani sendiri atau membatasi
set CA umum yang dipercaya aplikasi.
</li>
<li>
<b>Pengesampingan hanya-runut:</b> Merunut secara aman koneksi aman dalam aplikasi
tanpa menambahkan risiko pada basis yang telah diinstal.
</li>
<li>
<b>Berhenti dari lalu lintas cleartext:</b> Melindungi aplikasi dari
penggunaan lalu lintas cleartext secara tidak sengaja.
</li>
<li>
<b>Penyematan sertifikat:</b> Membatasi koneksi aman aplikasi ke
sertifikat tertentu.
</li>
</ul>
<h2 id="manifest">Menambahkan File Konfigurasi Keamanan</h2>
<p>
Fitur Network Security Configuration menggunakan file XML tempat Anda menetapkan
pengaturan untuk aplikasi. Anda harus menyertakan sebuah entri dalam manifes aplikasi
untuk menunjuk ke file ini. Kutipan kode berikut dari sebuah manifes
yang memperagakan cara membuat entri ini:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
...
&lt;app ...&gt;
&lt;meta-data android:name="android.security.net.config"
android:resource="@xml/network_security_config" /&gt;
...
&lt;/app&gt;
</pre>
<h2 id="CustomTrust">Menyesuaikan CA Tepercaya</h2>
<p>
Aplikasi mungkin perlu mempercayai set CA custom sebagai ganti default
platform. Alasannya yang paling umum adalah:
</p>
<ul>
<li>Menghubungkan ke host dengan otoritas sertifikat custom (ditandatangani sendiri,
dikeluarkan oleh CA internal, dll).
</li>
<li>Membatasi set CA hanya untuk CA yang Anda percaya sebagai ganti setiap CA
yang sudah terinstal.
</li>
<li>Mempercayai CA tambahan yang tidak disertakan dalam sistem.
</li>
</ul>
<p>
Secara default koneksi (misalnya TLS, HTTPS) aman dari semua aplikasi mempercayai
CA yang telah diinstal oleh sistem, dan aplikasi yang menargetkan API level 23
(Android M) ke bawah, juga mempercayai penyimpanan CA yang ditambahkan pengguna secara default. Aplikasi
bisa menyesuaikan koneksinya sendiri menggunakan {@code base-config} (untuk
penyesuaian di tingkat aplikasi) atau {@code domain-config} (untuk penyesuaian
per-domain).
</p>
<h3 id="ConfigCustom">Mengonfigurasi CA Custom</h3>
<p>
Anggaplah Anda ingin menghubungkan ke host Anda yang menggunakan sertifikat
SSL yang ditandatangani sendiri atau ke host yang sertifikat SSL-nya dikeluarkan oleh CA non-publik
yang Anda percaya, seperti CA internal perusahaan Anda.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
Menambahkan sertifikat CA yang ditandatangani sendiri atau sertifikat CA non-publik, dalam format PEM atau DER, ke
{@code res/raw/my_ca}.
</p>
<h3 id="LimitingCas">Membatasi Set CA Tepercaya</h3>
<p>
Aplikasi yang tidak ingin mempercayai semua CA yang dipercaya oleh sistem
sebagai gantinya bisa menetapkan set CA sendiri yang telah dikurangi untuk dipercaya. Ini akan melindungi
aplikasi dari sertifikat palsu yang dikeluarkan oleh selain CA.
</p>
<p>
Konfigurasi untuk membatasi set CA tepercaya mirip dengan <a href="#TrustingACustomCa">mempercayai CA custom</a> untuk domain tertentu selain
beberapa CA disediakan dalam sumber daya.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;domain includeSubdomains="true"&gt;cdn.example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/trusted_roots"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
Menambahkan CA tepercaya, dalam format PEM atau DER, ke {@code res/raw/trusted_roots}.
Perhatikan, jika menggunakan format PEM, file <em>hanya</em> boleh berisi data PEM
dan tidak ada teks tambahan. Anda juga bisa menyediakan beberapa elemen
<a href="#certificates"><code>&lt;certificates&gt;</code></a>
sebagai ganti satu elemen.
</p>
<h3 id="TrustingAdditionalCas">
Mempercayai CA Tambahan
</h3>
<p>
Sebuah aplikasi mungkin perlu mempercayai CA tambahan yang tidak dipercaya oleh sistem,
hal ini bisa disebabkan karena sistem belum menyertakan CA atau CA tidak
memenuhi persyaratan untuk memasukkan ke dalam sistem Android. Aplikasi
bisa melakukannya dengan menetapkan beberapa sumber sertifikat untuk
konfigurasi.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/extracas"/&gt;
&lt;certificates src="system"/&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="TrustingDebugCa">Mengonfigurasi CA untuk Perunutan</h2>
<p>
Saat merunut aplikasi yang terhubung melalui HTTPS, Anda mungkin perlu
menghubungkan ke server pengembangan lokal, yang tidak memiliki sertifikat
SSL untuk server produksi Anda. Untuk mendukungnya tanpa
memodifikasi kode aplikasi, Anda bisa menetapkan CA hanya-runut
yang <i>hanya</i> dipercaya bila <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">
android:debuggable</a>
adalah {@code true} dengan menggunakan {@code debug-overrides}. Biasanya IDE dan alat
build mengatur flag ini secara otomatis untuk build non-rilis.
</p>
<p>
Ini lebih aman daripada kode kondisional biasa karena, sebagai tindakan
pencegahan keamanan, toko aplikasi tidak menerima aplikasi yang ditandai
bisa-dirunut.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/debug_cas"/&gt;
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="UsesCleartextTraffic">Berhenti dari Lalu Lintas Cleartext</h2>
<p>
Aplikasi yang bermaksud menghubungkan ke tujuan dengan hanya menggunakan koneksi
aman bisa berhenti mendukung cleartext (menggunakan protokol
HTTP yang tidak dienkripsi sebagai ganti HTTPS) ke tujuan tersebut. Opsi ini akan membantu mencegah
regresi tidak disengaja dalam aplikasi karena perubahan dalam URL yang disediakan oleh sumber-sumber
eksternal seperti server backend.
Lihat {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted
NetworkSecurityPolicy.isCleartextTrafficPermitted()} untuk detail selengkapnya.
</p>
<p>
Misalnya, aplikasi mungkin ingin memastikan semua koneksi ke {@code
secure.example.com} selalu dilakukan melalui HTTPS untuk melindungi lalu lintas sensitif
dari jaringan yang berbahaya.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config usesCleartextTraffic="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="CertificatePinning">Menyematkan Sertifikat</h2>
<p>
Biasanya aplikasi mempercayai semua CA yang telah terinstal. Jika salah satu dari CA ini
mengeluarkan sertifikat palsu, aplikasi akan berisiko terkena serangan
MiTM. Beberapa aplikasi memilih untuk membatasi set sertifikat yang mereka terima
baik dengan membatasi set CA yang mereka percaya atau dengan menyematkan sertifikat.
</p>
<p>
Penyematan sertifikat dilakukan dengan memberikan seperangkat sertifikat dengan hash
kunci publik (SubjectPublicKeyInfo pada sertifikat X.509). Rantai
sertifikat nanti hanya berlaku jika rantai sertifikat berisi setidaknya salah satu
dari kunci publik yang disematkan.
</p>
<p>
Perhatikan, saat menggunakan penyematan sertifikat, Anda harus selalu menyertakan kunci
cadangan sehingga jika Anda terpaksa beralih ke kunci baru, atau mengubah CA (saat
menyematkan ke sertifikat CA atau perantara CA tersebut), konektivitas
aplikasi Anda tidak terpengaruh. Jika tidak, Anda harus mendorong
pembaruan ke aplikasi tersebut untuk memulihkan konektivitas.
</p>
<p>
Selain itu bisa juga mengatur waktu kedaluwarsa untuk pin yang setelah
itu penyematan tidak dilakukan. Hal ini membantu mencegah masalah konektivitas dalam
aplikasi yang belum diperbarui. Akan tetapi, mengatur waktu kedaluwarsa
pada pin mungkin akan membuat penyematan bisa diabaikan.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;pin-set expiration="2018-01-01"&gt;
&lt;pin digest="SHA-256"&gt;7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=&lt;/pin&gt;
&lt;!-- backup pin --&gt
&lt;pin digest="SHA-256"&gt;fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=&lt;/pin&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="ConfigInheritance">Perilaku Pewarisan Konfigurasi</h2>
<p>
Nilai yang tidak diatur dalam konfigurasi tertentu akan diwariskan. Perilaku ini memungkinkan konfigurasi
yang lebih kompleks sambil menjaga file konfigurasi tetap terbaca.
</p>
<p>
Jika nilai tidak diatur dalam entri tertentu maka nilai dari entri berikutnya yang lebih
umum akan digunakan. Nilai yang tidak diatur dalam {@code domain-config} akan
diambil dari {@code domain-config} induk, jika tersarang, atau dari {@code
base-config} jika tidak. Nilai yang tidak diatur dalam {@code base-config} akan menggunakan
nilai default platform.
</p>
<p>
Misalnya pertimbangkan, bila semua koneksi ke subdomain {@code
example.com} harus menggunakan set CA custom. Selain itu, lalu lintas cleartext ke
domain ini diizinkan <em>kecuali</em> saat menghubungkan ke {@code
secure.example.com}. Dengan menyarangkan konfigurasi untuk {@code
secure.example.com} dalam konfigurasi untuk {@code example.com},
{@code trust-anchors} tidak perlu digandakan.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;domain-config cleartextTrafficPermitted="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="FileFormat">Format File Konfigurasi</h2>
<p>
Fitur Network Security Configuration menggunakan format file XML.
Struktur keseluruhan file ditampilkan dalam contoh kode berikut:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;domain-config&gt;
&lt;domain&gt;android.com&lt;/domain&gt;
...
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;pin-set&gt;
&lt;pin digest="..."&gt;...&lt;/pin&gt;
...
&lt;/pin-set&gt;
&lt;/domain-config&gt;
...
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
<p>
Bagian berikut menjelaskan sintaks dan detail lainnya dari format
file.
</p>
<h3 id="network-security-config">
&lt;network-security-config&gt;
</h3>
<dl class="xml">
<dt>
bisa berisi:
</dt>
<dd>
0 atau 1 <code><a href="#base-config">&lt;base-config&gt;</a></code><br>
Sejumlah <code><a href=
"#domain-config">&lt;domain-config&gt;</a></code><br>
0 atau 1 <code><a href="#debug-overrides">&lt;debug-overrides&gt;</a></code>
</dd>
</dl>
<h3 id="base-config">
&lt;base-config&gt;
</h3>
<dl class="xml">
<dt>
sintaks:
</dt>
</dl>
<pre class="stx">
&lt;base-config <a href=
"#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/base-config&gt;
</pre>
<dl class="xml">
<dt>
bisa berisi:
</dt>
<dd>
<code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
keterangan:
</dt>
<dd>
Konfigurasi default yang digunakan oleh semua koneksi yang tujuannya tidak
tercakup oleh <a href="#domain-config"><code>domain-config</code></a>.
<p>
Nilai yang tidak diatur akan menggunakan nilai default platform. Konfigurasi
default untuk aplikasi yang menargetkan API level 24 ke atas:
</p>
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
Konfigurasi default untuk aplikasi yang menargetkan API level 23 ke bawah:
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;certificates src="user" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
</dd>
</dl>
<h3 id="domain-config">&lt;domain-config&gt;</h3>
<dl class="xml">
<dt>sintaks:</dt>
<dd>
<pre class="stx">&lt;domain-config <a href="#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/domain-config&gt;</pre>
</dd>
<dt>Bisa Berisi:</dt>
<dd>
1 atau beberapa <code><a href="#domain">&lt;domain&gt;</a></code>
<br/>0 atau 1 <code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
<br/>0 atau 1 <code><a href="#pin-set">&lt;pin-set&gt;</code></a>
<br/>Sejumlah <code>&lt;domain-config&gt;</code> tersarang</dd>
<dt>Keterangan</dt>
<dd>Konfigurasi yang digunakan untuk koneksi ke tujuan tertentu seperti didefinisikan oleh elemen {@code domain}.
<p>Perhatikan, jika beberapa elemen {@code domain-config} mencakup suatu tujuan, konfigurasi dengan aturan domain paling spesifik (terpanjang) yang cocok
akan digunakan.</p></dd>
</dl>
<h3 id="domain">&lt;domain&gt;</h3>
<dl class="xml">
<dt>
sintaks:
</dt>
<dd>
<pre class="stx">
&lt;domain includeSubdomains=["true" | "false"]&gt;example.com&lt;/domain&gt;
</pre>
</dd>
<dt>
Atribut:
</dt>
<dd>
<dl class="attr">
<dt>
{@code includeSubdomains}
</dt>
<dd>
Jika {@code "true"} maka aturan domain ini akan dicocokkan dengan domain dan semua
subdomain, termasuk subdomain dari subdomain, jika tidak peraturan hanya
diterapkan pada kecocokan yang persis tepat.
</dd>
</dl>
</dd>
<dt>
Keterangan:
</dt>
</dl>
<h3 id="debug-overrides">&lt;debug-overrides&gt;</h3>
<dl class="xml">
<dt>
sintaks:
</dt>
<dd>
<pre class="stx">
&lt;debug-overrides&gt;
...
&lt;/debug-overrides&gt;
</pre>
</dd>
<dt>
Bisa Berisi:
</dt>
<dd>
0 atau 1 <code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
Keterangan:
</dt>
<dd>
Pengesampingan yang akan diterapkan bila <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
adalah {@code "true"} yang biasanya terjadi untuk build non-rilis
yang dihasilkan oleh alat IDE dan build. Trust-anchor yang ditetapkan dalam {@code
debug-overrides} akan ditambahkan ke semua konfigurasi lainnya dan penyematan
sertifikat tidak dilakukan bila rantai sertifikat server menggunakan satu dari
trust-anchor hanya-runut ini. Jika <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
adalah {@code "false"} maka bagian ini akan diabaikan sepenuhnya.
</dd>
</dl>
<h3 id="trust-anchors">&lt;trust-anchors&gt;</h3>
<dl class="xml">
<dt>
sintaks:
</dt>
<dd>
<pre class="stx">
&lt;trust-anchors&gt;
...
&lt;/trust-anchors&gt;
</pre>
</dd>
<dt>
Bisa Berisi:
</dt>
<dd>
Sejumlah <code><a href="#certificates">&lt;certificates&gt;</a></code>
</dd>
<dt>
Keterangan:
</dt>
<dd>
Set trust-anchor untuk koneksi aman.
</dd>
</dl>
<h3 id="certificates">&lt;certificates&gt;</h3>
<dl class="xml">
<dt>sintaks:</dt>
<dd><pre class="stx">&lt;certificates src=["system" | "user" | "<i>raw resource</i>"]
overridePins=["true" | "false"] /&gt;
</pre></dd>
<dt>keterangan:</dt>
<dd>Set sertifikat X.509 untuk elemen {@code trust-anchors}.</dd>
<dt>atribut:</dt>
<dd><dl class="attr">
<dt>{@code src}</dt>
<dd>
Sumber sertifikat CA, bisa salah satu dari
<ul>
<li>ID sumber daya mentah yang menunjuk ke file berisi sertifikat X.509.
Sertifikat harus dikodekan dalam format DER atau PEM. Dalam hal sertifikat
PEM, file <em>tidak boleh</em> berisi data tambahan non-PEM seperti
komentar.
</li>
<li>{@code "system"} untuk sertifikat CA sistem yang telah terinstal.
</li>
<li>{@code "user"} untuk sertifikat CA yang ditambahkan pengguna.
</li>
</ul>
</dd>
<dt>{@code overridePins}</dt>
<dd>
<p>
Menetapkan apakah CA dari sumber akan mengabaikan penyematan sertifikat. Jika {@code
"true"} maka rantai sertifikat yang rantainya melalui salah satu CA dari
sumber ini tidak akan disematkan. Hal ini bisa berguna untuk CA
perunutan atau untuk mendukung dengan memungkinkan pengguna melakukan MiTM atas lalu lintas aman aplikasi Anda.
</p>
<p>
Default-nya adalah {@code "false"} kecuali jika ditetapkan dalam elemen {@code debug-overrides},
dalam hal demikian default-nya adalah {@code "true"}.
</p>
</dd>
</dl>
</dd>
<h3 id="pin-set">&lt;pin-set&gt;</h3>
<dl class="xml">
<dt>
sintaks:
</dt>
<dd>
<pre class="stx">
&lt;pin-set expiration="date"&gt;
...
&lt;/pin-set&gt;
</pre>
</dd>
<dt>
Bisa Berisi:
</dt>
<dd>
Sejumlah <code><a href="#pin">&lt;pin&gt;</a></code>
</dd>
<dt>
Keterangan:
</dt>
<dd>
Satu set pin kunci publik. Agar koneksi aman bisa dipercaya, salah satu
kunci publik dalam rantai kepercayaan harus berada dalam set pin. Lihat
<code><a href="#pin">&lt;pin&gt;</a></code> untuk mengetahui format pin.
</dd>
<dt>
Atribut:
</dt>
<dd>
<dl class="attr">
<dt>
{@code expiration}
</dt>
<dd>
Tanggal, dalam format {@code yyyy-MM-dd}, pada saat dan setelah pin
kedaluwarsa, sehingga menonaktifkan penyematan. Jika atribut tidak diatur maka
pin tidak kedaluwarsa.
<p>
Tanggal kedaluwarsa membantu mencegah masalah konektivitas di aplikasi yang
tidak mendapatkan pembaruan untuk set pin mereka, misalnya karena pengguna
menonaktifkan pembaruan aplikasi.
</p>
</dd>
</dl>
</dd>
</dl>
<h3 id="pin">&lt;pin&gt;</h3>
<dl class="xml">
<dt>
sintaks:
</dt>
<dd>
<pre class="stx">
&lt;pin digest=["SHA-256"]&gt;base64 encoded digest of X.509
SubjectPublicKeyInfo (SPKI)&lt;/pin&gt;
</pre>
</dd>
<dt>
Atribut:
</dt>
<dd>
<dl class="attr">
<dt>
{@code digest}
</dt>
<dd>
Algoritma intisari yang digunakan untuk menghasilkan pin. Saat ini, hanya
{@code "SHA-256"} yang didukung.
</dd>
</dl>
</dd>
</dl>

View File

@@ -0,0 +1,120 @@
page.title=Perekaman TV
page.keywords=preview,sdk,tv,recording
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Dalam dokumen ini</h2>
<ol>
<li><a href="#supporting">Menunjukkan Dukungan untuk Perekaman</a></li>
<li><a href="#recording">Merekam Sesi</a></li>
<li><a href="#errors">Menangani Kesalahan Perekaman</a></li>
<li><a href="#sessions">Mengelola Sesi yang Direkam</a></li>
<li><a href="#best">Praktik Terbaik</a></li>
</ol>
</div>
</div>
<p>Layanan input TV memungkinkan pengguna menghentikan sementara dan melanjutkan pemutaran saluran melalui
API perekaman atau time-shifting. Android N telah berkembang hingga ke perekaman
dengan memungkinkan pengguna menyimpan beberapa sesi rekaman.</p>
<p>Pengguna bisa menjadwalkan rekaman terlebih dahulu, atau memulai rekaman sambil menonton
suatu acara. Setelah sistem menyimpan rekaman, pengguna bisa melihat-lihat, menata,
dan memutar kembali rekaman tersebut menggunakan aplikasi TV di sistem.</p>
<p>Jika Anda ingin menyediakan fungsionalitas perekaman untuk layanan input TV,
Anda harus menunjukkan pada sistem bahwa aplikasi Anda mendukung perekaman, mengimplementasikan
kemampuan untuk merekam acara, menangani dan memberitahukan setiap kesalahan yang terjadi
selama perekaman, serta mengelola sesi yang telah Anda rekam.</p>
<h2 id="supporting">Menunjukkan Dukungan untuk Perekaman</h2>
<p>Untuk memberi tahu sistem bahwa layanan input TV Anda mendukung perekaman, ikuti
langkah-langkah ini:</p>
<ol>
<li>Dalam metode<code>TvInputService.onCreate()</code> Anda, buat objek
<code>TvInputInfo</code> baru menggunakan kelas <code>TvInputInfo.Builder</code>.
</li>
<li>Saat membuat objek <code>TvInputInfo</code> baru, panggil
<code>setCanRecord(true)</code> sebelum memanggil <code>build()</code> untuk
menunjukkan bahwa layanan Anda mendukung perekaman.</li>
<li>Daftarkan objek <code>TvInputInfo</code> Anda pada sistem dengan memanggil
<code>TvInputService.updateTvInputInfo()</code>.</li>
</ol>
<h2 id="recording">Merekam Sesi</h2>
<p>Setelah layanan input TV Anda didaftarkan bahwa ia mendukung fungsionalitas
perekaman, sistem akan memanggil
<code>TvInputService.onCreateRecordingSession()</code> Anda bila perlu mengakses
implementasi perekaman aplikasi Anda. Implementasikan subkelas
<code>TvInputService.RecordingSession</code> Anda sendiri dan kembalikan
bila callback <code>onCreateRecordingSession()</code> dipicu.
Subkelas ini bertanggung jawab mengalihkan ke saluran data yang benar,
merekam data yang diminta, dan memberitahukan status perekaman serta kesalahan ke
sistem.</p>
<p>Bila sistem memanggil <code>RecordingSession.onTune()</code>, dengan meneruskan
URI saluran, setel ke saluran yang ditetapkan URI. Beri tahu sistem bahwa
aplikasi Anda telah disetel ke saluran yang diinginkan dengan memanggil <code>notifyTuned()</code>,
atau, jika aplikasi Anda tidak bisa disetel ke saluran yang tepat, panggil
<code>notifyError()</code>.</p>
<p>Sistem berikutnya akan memanggil callback <code>RecordingSession.onStartRecording()</code>.
Aplikasi Anda harus segera mulai merekam. Bila sistem memanggil
callback ini, sistem mungkin akan memberikan URI yang berisi informasi tentang program
yang akan direkam. Bila perekaman selesai, Anda perlu menyalin data
ini ke tabel data <code>RecordedPrograms</code>.</p>
<p>Terakhir, sistem akan memanggil <code>RecordingSession.onStopRecording()</code>.
Pada tahap ini, aplikasi Anda harus segera berhenti merekam. Anda juga perlu
membuat entri dalam tabel <code>RecordedPrograms</code>. Entri ini harus
menyertakan URI data sesi yang direkam dalam kolom
<code>RecordedPrograms.COLUMN_RECORDING_DATA_URI</code>, dan informasi
program yang diberikan sistem dalam panggilan awal ke
<code>onStartRecording()</code>.</p>
<p>Untuk detail selengkapnya tentang cara mengakses tabel <code>RecordedPrograms</code>
lihat <a href="#sessions">Mengelola Sesi yang Direkam</a>.</p>
<h2 id="errors">Menangani Kesalahan Perekaman</h2>
<p>Jika terjadi kesalahan selama perekaman, rendering data yang terekam menjadi tidak bisa digunakan,
beri tahu sistem dengan memanggil <code>RecordingSession.notifyError()</code>.
Begitu pula, Anda bisa memanggil <code>notifyError()</code> setelah sesi perekaman dibuat
agar sistem mengetahui bahwa aplikasi Anda tidak bisa lagi merekam sesi.</p>
<p>Jika terjadi kesalahan selama perekaman, namun Anda ingin menyediakan rekaman parsial
yang bisa digunakan pengguna untuk pemutaran, panggil
<code>RecordingSession.notifyRecordingStopped()</code> untuk memungkinkan sistem
menggunakan sesi parsial.</p>
<h2 id="sessions">Mengelola Sesi yang Direkam</h2>
<p>Sistem menyimpan informasi untuk semua sesi yang direkam dari semua
aplikasi saluran yang mampu merekam dalam tabel penyedia konten <code>TvContract.RecordedPrograms</code>.
Informasi ini bisa diakses lewat URI konten
<code>RecordedPrograms.Uri</code>. Gunakan API konten penyedia untuk
membaca, menambah, dan menghapus entri dari tabel ini.</p>
<p>Untuk informasi selengkapnya tentang menangani data penyedia konten, lihat
<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
Dasar-Dasar Penyedia Konten</a>.</p>
<h2 id="best">Praktik Terbaik</h2>
<p>Perangkat TV mungkin memiliki penyimpanan terbatas, jadi pertimbangkan sebaik mungkin saat
mengalokasikan penyimpanan untuk menyimpan sesi rekaman. Gunakan
<code>RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)</code> bila
tidak cukup ruang untuk menyimpan sesi rekaman.</p>
<p>Bila pengguna memulai perekaman, Anda harus memulai perekaman data
secepatnya. Untuk memfasilitasinya, selesaikan setiap tugas yang memakan waktu di awal,
seperti mengakses dan mengalokasikan ruang penyimpanan, saat sistem memanggil callback
<code>onCreateRecordingSession()</code>. Hal ini akan memungkinkan Anda memulai
perekaman dengan segera bila callback <code>onStartRecording()</code>
dipicu.</p>

View File

@@ -0,0 +1,120 @@
page.title=Android N Developer Preview
page.tags="preview","developer"
meta.tags="preview", "android"
fullpage=true
forcelocalnav=true
header.hide=1
footer.hide=1
@jd:body
<script>
$(document).ready(function() {
if (useUpdatedTemplates) {
$("#useUpdatedTemplates").css("display","block");
} else {
$("#useOldTemplates").css("display","block");
}
})
</script>
<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
<div class="wrap" style="max-width:1100px;margin-top:0">
<div class="cols dac-hero-content" style="padding-bottom:1em;">
<div class="col-7of16 col-push-9of16" style="padding-left:2em">
<h1 class="dac-hero-title">Android N Developer Preview</h1>
<p class="dac-hero-description">
Bersiaplah menyambut Android N!
<strong>Uji aplikasi Anda</strong> pada perangkat Nexus dan perangkat lainnya. Dukunglah
perilaku sistem baru untuk <strong>menghemat daya dan memori</strong>.
Tambah aplikasi Anda dengan <strong>UI multijendela</strong>,
<strong>pemberitahuan balasan langsung</strong> dan lainnya.
</p>
<a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
<span class="dac-sprite dac-auto-chevron"></span>
Memulai
</a><!--<br>
<a class="dac-hero-cta" href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron"></span>
Update to Android N (final SDK)
</a><br>-->
</div>
<div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
<img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
{@docRoot}images/home/n-preview-hero_2x.png 2x">
</div>
</div>
<div class="dac-section dac-small">
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/resources"
data-cardSizes="6x2"
data-maxResults="6"></div>
</div>
</div>
</section>
<div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
<div class="wrap dac-offset-parent">
<a class="dac-fab dac-scroll-button" data-scroll-button="" href="#build-apps">
<i class="dac-sprite dac-arrow-down-gray"></i>
</a>
<ul class="dac-actions">
<li class="dac-action">
<a class="dac-action-link" href="https://developer.android.com/preview/bug">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Laporkan masalah
</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/support.html">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Lihat catatan rilis
</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/dev-community">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Bergabunglah dengan komunitas pengembang
</a>
</li>
</ul>
</div><!-- end .wrap -->
</div><!-- end .dac-actions -->
<div id="useOldTemplates" style="display:none;color:black" class="actions-bar dac-expand dac-invert">
<div class="wrap dac-offset-parent">
<div class="actions">
<div><a href="https://developer.android.com/preview/bug">
<span class="dac-sprite dac-auto-chevron-large"></span>
Laporkan masalah
</a></div>
<div><a href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron-large"></span>
Lihat catatan rilis
</a></div>
<div><a href="{@docRoot}preview/dev-community">
<span class="dac-sprite dac-auto-chevron-large"></span>
Bergabunglah dengan komunitas pengembang
</a></div>
</div><!-- end .actions -->
</div><!-- end .wrap -->
</div>
<section class="dac-section dac-light"><div class="wrap">
<h1 class="dac-section-title">Sumber Daya</h1>
<div class="dac-section-subtitle">
Informasi penting guna membantu mempersiapkan aplikasi untuk Android N.
</div>
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
data-items-per-page="6"
data-maxResults="15"
data-initial-results="6"></div>
</div>
</section>

View File

@@ -0,0 +1,183 @@
page.title=Fitur Bahasa Java 8
page.keywords="android N", "Java 8", "Jack"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li>
<a href="#supported-features">API dan Fitur Bahasa Java 8 yang didukung</a>
</li>
<li>
<a href="#configuration">Mengaktifkan Fitur Java 8 dan Jack Toolchain</a>
</li>
</ol>
</div>
</div>
<p>Android N memperkenalkan dukungan untuk fitur bahasa Java 8
yang bisa Anda gunakan saat mengembangkan aplikasi yang menargetkan Android N.
Halaman ini menjelaskan fitur bahasa baru yang didukung dalam Android N
Preview, cara menyiapkan proyek Anda dengan benar untuk menggunakannya, dan setiap masalah
yang diketahui yang mungkin Anda temui.
</p>
<p>Untuk mulai menggunakan fitur-fitur ini, Anda perlu mengunduh dan menyiapkan Android
Studio 2.1 (preview) dan Android N Preview SDK, yang menyertakan
Jack toolchain yang diperlukan dan Plugin Android untuk Gradle yang telah diperbarui. Jika Anda belum menginstal
Android N Preview SDK, lihat <a href="{@docRoot}preview/setup-sdk.html">Menyiapkan Pengembangan untuk Android N</a>.</p>
<p class="note">
<strong>Catatan:</strong> Menggunakan fitur bahasa Java 8 yang baru bukanlah
persyaratan untuk mengembangkan aplikasi yang menargetkan platform Android N. Jika Anda
tidak ingin menulis kode dengan fitur bahasa Java 8, Anda bisa membiarkan nilai kompatibilitas
sumber dan target proyek Anda diatur ke Java 7, namun Anda tetap harus
mengompilasi dengan JDK 8 untuk membangun pada platform Android N.
</p>
<h2 id="supported-features">
API dan Fitur Bahasa Java 8 yang Didukung
</h2>
<p>
Saat ini tidak semua fitur bahasa Java 8 didukung Android. Akan tetapi,
fitur berikut sekarang tersedia saat mengembangkan aplikasi yang menargetkan
Android N Preview:
</p>
<ul>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html">Metode-metode
antarmuka default dan statis</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html">
Ekspresi Lambda</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html">Anotasi
yang bisa diulang</a>
</li>
</ul>
<p>
Selain itu, API fitur bahasa Java 8 berikut ini sekarang tersedia:
</p>
<ul>
<li>Reflection API dan API terkait bahasa:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.lang.FunctionalInterface}
</li>
<li>{@code java.lang.annotation.Repeatable}
</li>
<li>{@code java.lang.reflect.Method.isDefault()}
</li>
<li>dan Reflection API yang terkait dengan anotasi yang bisa diulang, seperti
{@code AnnotatedElement.getAnnotationsByType(Class)}
</li>
</ul>
</li>
<li>Utility API:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.util.function}
</li>
</ul>
</li>
</ul>
<p class="note">
<strong>Catatan:</strong> Android N mendasarkan implementasi ekspresi
lambda pada kelas anonim. Pendekatan ini memungkinkannya kompatibel
mundur dan bisa dieksekusi pada versi Android sebelumnya. Untuk menguji ekspresi
lambda pada versi sebelumnya, jangan lupa masuk ke file {@code
build.gradle} Anda, serta mengatur {@code compileSdkVersion} dan {@code
targetSdkVersion} ke 23 atau yang lebih rendah.
</p>
<h2 id="configuration">
Mengaktifkan Fitur Java 8 dan Jack Toolchain
</h2>
<p>
Agar bisa menggunakan fitur bahasa Java 8 yang baru, Anda juga perlu menggunakan
<a class="external-link" href="https://source.android.com/source/jack.html">Jack toolchain</a>
yang baru. Android Toolchain yang baru ini mengompilasi sumber bahasa Java menjadi dex
bytecode yang bisa dibaca Android, memiliki format pustaka {@code .jack} sendiri, dan menyediakan sebagian besar fitur
toolchain sebagai bagian dari alat tunggal: pengemasan ulang, penciutan, pengaburan dan
multidex.
</p>
<p>Inilah perbandingan dua toolchain yang digunakan untuk membangun file Android DEX:</p>
<ul>
<li>Toolchain javac lama:<br>
<b>javac</b> ({@code .java} --&gt; {@code .class}) --&gt; <b>dx</b> ({@code
.class} --&gt; {@code .dex})
</li>
<li>Jack Toolchain baru:<br>
<b>Jack</b> ({@code .java} --&gt; {@code .jack} --&gt; {@code .dex})
</li>
</ul>
<h3>
Mengonfigurasi Gradle
</h3>
<p>
Untuk mengaktifkan fitur bahasa Java 8 dan Jack untuk proyek Anda, masukkan
yang berikut dalam file {@code build.gradle} yang spesifik untuk modul:
</p>
<pre>
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
</pre>
<h3>
Masalah yang Diketahui
</h3>
<p>
Instant Run, yang diperkenalkan dalam Android Studio 2.0 (Beta), saat ini tidak berfungsi
dengan Jack dan akan dinonaktifkan saat menggunakan toolchain baru.
</p>
<p>Karena Jack tidak menghasilkan file kelas antara saat mengompilasi sebuah
aplikasi, alat yang bergantung pada file-file ini sekarang tidak berfungsi pada Jack. Beberapa
contoh alat-alat ini adalah:</p>
<ul>
<li>Pendeteksi lint yang beroperasi pada file kelas
</li>
<li>Alat dan pustaka yang mewajibkan file kelas aplikasi (misalnya JaCoCo
dan Mockito)</li>
</ul>
<p>Jika Anda menemukan masalah lain saat menggunakan Jack, <a href="http://tools.android.com/filing-bugs">laporkan bug</a>.</p>

View File

@@ -0,0 +1,440 @@
page.title=Ikhtisar Program
page.metaDescription=Persiapkan aplikasi Anda untuk versi Android berikutnya.
page.image=images/cards/card-n-overview_2x.png
meta.tags="preview", "pengembang", "android"
page.tags="preview", "developer", "android"
@jd:body
<!--
<div class="cols" style=
"background-color:#f2daf5; padding: 5px 0;margin-bottom:1em; text-align:center;">
<h3>
Developer Preview 3 is now available
</h3>
<p>Includes final SDK and near-final system images</p>
<div style="margin:auto 1em">
<ul class="dac-section-links">
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-notes">
<span class="dac-sprite dac-auto-chevron"></span>
Read the Notes</a>
</li>
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-get">
<span class="dac-sprite dac-auto-chevron"></span>
Get the Update</a>
</li>
<li class="dac-section-link">
<a href="https://code.google.com/p/android-developer-preview/">
<span class="dac-sprite dac-auto-chevron"></span>
Report Issues</a>
</li>
</ul>
</div>
</div>
-->
<p>
Selamat datang di <strong>Android N Developer Preview</strong>, program yang
akan memberi apa saja yang Anda butuhkan untuk menguji dan mengoptimalkan aplikasi untuk versi
Android berikutnya. Program ini tersedia gratis, dan Anda bisa langsung memulai hanya dengan
mengunduh alat bantu N Developer Preview.
</p>
<div style="background-color:#eceff1;padding:1em;">
<div class="wrap">
<div class="cols">
<div class="col-4of12">
<h5>
Gambar perangkat keras dan emulator
</h5>
<p>
Jalankan dan uji aplikasi Anda pada berbagai perangkat atau pada emulator.
</p>
</div>
<div class="col-4of12">
<h5>
Kode platform terbaru
</h5>
<p>
Kami akan menyediakan pembaruan setiap bulan selama Preview, agar Anda bisa menguji perubahan platform terbaru.
</p>
</div>
<div class="col-4of12">
<h5>
Prioritas untuk masalah pengembang
</h5>
<p>
Selama beberapa minggu pertama, kami akan memberikan prioritas pada masalah-masalah
yang dilaporkan pengembang, jadi ujilah dan berikan umpan balik sesegera mungkin.
</p>
</div>
</div>
<div class="cols">
<div class="col-4of12">
<h5>
Kemampuan dan perilaku baru
</h5>
<p>
Mulailah pekerjaan lebih awal untuk mendukung perilaku platform baru dan kembangkan dengan fitur-fitur baru.
</p>
</div>
<div class="col-4of12">
<h5>
Pembaruan dikirim melalui OTA
</h5>
<p>
Pembaruan lewat jaringan seluler tanpa kendala untuk setiap perangkat yang didukung melalui
Android Beta Program. Flashing tidak diperlukan.
</p>
</div>
<div class="col-4of12">
<h5>
Umpan balik dan dukungan
</h5>
<p>
Laporkan masalah dan berikan umpan balik kepada kami dengan menggunakan
<a href="{@docRoot}preview/bug">Issue Tracker</a> kami. Hubungkan dengan
pengembang lain di
<a href="{@docRoot}preview/dev-community">N&nbsp;Developer Community</a>.
</p>
</div>
</div>
</div>
</div>
<!--
<p>New in the Android N Developer Preview: </p>
<ul>
<li> Accompanying Android Beta Program for consumers, starting later in the preview</li>
<li> More supported devices, including devices from OEM partners</li>
<li> Seamless OTAs for your devices, from initial release to final N release without flashing</li>
</ul>
-->
<h2 id="timeline">Kronologi dan pembaruan</h2>
<img src="{@docRoot}images/n-preview-updates_2x.png">
<p>
N Developer Preview berjalan dari 9 Maret 2016 hingga rilis publik Android N
final dirilis ke AOSP dan OEM, yang direncanakan selama Kuartal 3 2016.
</p>
<p>
Pada tahapan pencapaian pengembangan utama kami akan mengirimkan pembaruan untuk lingkungan pengujian dan
pengembangan Anda. Umumnya Anda boleh berharap mendapatkan pembaruan setiap bulan (dengan interval 4 hingga 6
minggu). Tahapan pencapaian tercantum di bawah ini.
</p>
<ul>
<li><strong><a href="{@docRoot}preview/support.html">Preview 1</a></strong> (rilis pertama, alfa)</li>
<li><strong>Preview 2</strong> (pembaruan bertahap, beta)</li>
<li><strong>Preview 3</strong> (pembaruan bertahap, beta)</li>
<li><strong>Preview 4</strong> (API final dan SDK resmi, publikasi di Play)</li>
<li><strong>Preview 5</strong> (citra sistem hampir final untuk pengujian akhir)</li>
<li><strong>Rilis Final</strong> ke AOSP dan ekosistem</li>
</ul>
<p>
Setiap pembaruan menyertakan SDK Tools, citra sistem preview, emulator, dokumentasi
referensi, dan diff API.
</p>
<p>
<strong>Tiga tahapan pencapaian preview pertama</strong> memberikan <strong>pengujian
awal dan lingkungan pengembangan</strong> yang membantu Anda mengidentifikasi
masalah kompatibilitas dalam aplikasi Anda saat ini dan merencanakan migrasi atau menampilkan pekerjaan
yang diperlukan untuk menargetkan platform baru. Ini adalah periode prioritas yang akan
memberi kami umpan balik dari Anda tentang fitur dan API serta masalah kompatibilitas file
&mdash; untuk semua ini, harap gunakan <a href="{@docRoot}preview/bug">Issue
Tracker</a>. Anda boleh mengharapkan beberapa perubahan API selama pembaruan ini.
</p>
<p>
Pada <strong>preview 4 dan 5</strong> Anda akan memiliki akses ke <strong>API
dan SDK N final</strong> untuk dikembangkan, serta citra sistem yang hampir final
untuk menguji perilaku dan fitur sistem. Android N akan memberikan level API
standar pada saat ini. Anda bisa mulai melakukan pengujian kompatibilitas akhir atas aplikasi
lama dan menyempurnakan kembali setiap kode baru yang menggunakan API atau fitur N.
</p>
<p>
Juga, mulai preview 4, Anda akan bisa <strong>mempublikasikan aplikasi ke
perangkat</strong> yang menjalankan Android N pada level API resmi, seperti
perangkat konsumen yang telah memilih mengikuti program Android Beta. Anda bisa
mempublikasikan ke saluran alfa dan beta Google Play terlebih dahulu, sehingga Anda bisa menguji
aplikasi pada konsumen Android Beta sebelum mendistribusikan secara luas di
toko.
</p>
<p>
Saat Anda menguji dan mengembangkan di Android N, kami sangat menyarankan<strong>terus memperbarui
lingkungan pengembangan</strong> saat pembaruan preview
dirilis. Untuk mempermudah prosesnya, Anda bisa mendaftarkan perangkat pengujian di program
Android Beta dan mengambil <strong>pembaruan lewat jaringan seluler (OTA)</strong> pada
setiap tahapan pencapaian. Atau, citra preview yang diperbarui
tersedia bila Anda mengunduh dan mem-flash secara manual.
</p>
<p>
Kami akan memberi tahu Anda bila pembaruan preview telah tersedia lewat <a href="http://android-developers.blogspot.com/">Android Developers Blog</a> serta
situs ini dan <a href="{@docRoot}preview/dev-community">Android
N Developer Community</a>.
</p>
<h2 id="preview_tools">Apa yang ada di N Developer Preview?</h2>
<p>
N Developer Preview menyertakan apa saja yang Anda perlukan untuk menguji aplikasi
yang ada pada berbagai ukuran layar, teknologi jaringan, chipset CPU/GPU,
dan arsitektur perangkat keras.
</p>
<h3 id="sdk_tools">SDK Tools</h3>
<p>Anda bisa mengunduh komponen-komponen ini melalui SDK Manager di <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a>:</p>
<ul>
<li> <strong>SDK dan alat</strong> N Developer Preview
<li> <strong>Citra sistem emulator</strong> N Developer Preview (32-bit &amp; 64-bit)
<li> <strong>Citra sistem emulator</strong> N Developer Preview untuk Android TV (32-bit)
<li> N Developer Preview mendukung pustaka (untuk template aplikasi baru)
</ul>
<p>
Kami akan menyediakan pembaruan untuk alat pengembangan ini di setiap tahapan pencapaian jika diperlukan.
</p>
<h3 id="hardware_system_images">Citra sistem perangkat keras</h3>
<p>
N Developer Preview menyertakan citra sistem Nexus dan perangkat keras lainnya yang bisa Anda gunakan saat
menguji dan mengembangkan pada perangkat fisik. Lihat halaman <a href="{@docRoot}preview/download.html">Citra Perangkat</a> untuk melihat daftar lengkap
citra perangkat keras.
</p>
<p>
Kami akan menyediakan citra sistem yang diperbarui untuk perangkat ini di setiap tahapan pencapaian. Anda
bisa mengunduh dan mem-flash citra sistem yang diperbarui ke perangkat pengujian
secara manual, sesering yang Anda perlukan. Ini terutama berguna untuk lingkungan pengujian
otomatis bila Anda mungkin perlu mem-flash ulang perangkat beberapa
kali.
</p>
<p class="note"><strong>Catatan</strong>:
<strong>Perangkat yang di-flash secara manual tidak akan mendapatkan pembaruan OTA</strong> seperti di
preview tahun lalu. Tahun ini, Anda bisa memperoleh OTA dengan mendaftarkan perangkat dalam
Android Beta Program &mdash; lihat detailnya di bagian berikutnya.
</p>
<h3 id="android_beta">Pembaruan OTA melalui Android Beta Program</h3>
<p>
Yang baru untuk Android N adalah program pembaruan lewat jaringan seluler (OTA) yang secara otomatis
mengirim pembaruan preview terbaru Android N secara langsung ke perangkat yang telah mendaftar
di program ini. Program ini gratis dan terbuka bagi siapa saja yang memiliki
perangkat yang didukung dan telah didaftarkan ke akun Google mereka.
</p>
<p>
Untuk mendaftarkan dalam program ini, kunjungi situs <a href="https://g.co/androidbeta">Android
Beta Program</a>. Anda akan
melihat semua perangkat yang telah didaftarkan ke akun Anda yang memenuhi syarat untuk mendaftar
dalam Android Beta.
</p>
<ol>
<li> Pilih perangkat yang Anda inginkan untuk menerima pembaruan Android N
<li> Klik Enroll, baca dan setujui ketentuan layanan, kemudian klik OK
</ol>
<p>
Setelah terdaftar, perangkat Anda akan segera menerima pembaruan. Umumnya
Anda tidak perlu pengaturan ulang penuh atas data untuk beralih ke Android N, namun
Anda disarankan mencadangkan setiap data yang tidak ingin hilang sebelum
mendaftarkan perangkat.
</p>
<p>
Saat pembaruan dikirim ke perangkat Anda, kami menyarankan Anda untuk segera mengunduh dan
menginstalnya sesegera mungkin. Anda perlu memantau perubahan terbaru
di UI sistem, perilaku, API, dan fitur.
</p>
<p>
Di akhir periode Developer Preview, perangkat Anda yang telah didaftarkan akan
menerima pembaruan ke rilis resmi Android N.
</p>
<p>
Anda bisa membatalkan pendaftaran perangkat dari program Android Beta kapan saja dari
situs Android Beta. Sebelum membatalkan pendaftaran, pastikan Anda telah mencadangkan data pada
perangkat.
</p>
<p class="note"><strong>Catatan</strong>:
Bila Anda membatalkan pendaftaran, <strong>perangkat Anda akan diatur ulang</strong>
ke versi terbaru
Android 6.0 Marshmallow (tidak mesti ke versi yang telah Anda
instal sebelum mendaftarkan perangkat). Untuk memastikan instalasi yang bersih,
data Anda akan dihapus dari perangkat, termasuk kontak, pesan,
foto, dan seterusnya.
</p>
<h3 id="documentation_and_sample_code">Dokumentasi dan kode contoh</h3>
<p>
Sumber daya dokumentasi ini tersedia pada situs Developer Preview untuk
membantu Anda mempelajari tentang Android&nbsp;N:
</p>
<ul>
<li> <a href="{@docRoot}preview/setup-sdk.html">Menyiapkan Pengembangan untuk
Android N</a> memiliki
instruksi langkah demi langkah untuk memulai.</li>
<li> <a href="{@docRoot}preview/behavior-changes.html">Perubahan
Perilaku</a> akan menunjukkan kepada Anda bidang-bidang utama untuk diuji.</li>
<li> Dokumentasi API baru, termasuk <a href="{@docRoot}preview/api-overview.html">Ikhtisar API</a>,
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi
API</a> yang bisa diunduh, dan panduan pengembang detail mengenai fitur-fitur utama seperti
menambahkan dukungan multi-jendela, bundel pemberitahuan, dukungan multilokal, dan lainnya.
<li> <a href="{@docRoot}preview/samples.html">Kode contoh</a> yang
memperagakan cara mendukung izin dan fitur baru lainnya.
<li> <a href="{@docRoot}preview/support.html#release-notes">Catatan rilis</a>
untuk versi N Developer Preview saat ini, termasuk catatan perubahan dan
laporan diff.
</ul>
<h4 id="reference">Referensi API yang Bisa Diunduh</h4>
<p>
Selama pembaruan preview awal, Anda bisa mengunduh
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi API
untuk platform Android N</a> sebagai arsip zip terpisah. Unduhan
referensi juga menyertakan laporan diff yang akan membantu Anda mengenali perubahan API dari
API 23 dan pembaruan sebelumnya.
</p>
<p>
Bila API Android N sudah final dan API Level resmi telah ditetapkan,
kami akan menyediakan referensi API kepada Anda secara online di <a href="https://developer.android.com">https://developer.android.com</a>.
</p>
<h3 id="support_resources">
Sumber daya dukungan
</h3>
<p>
Saat Anda menguji dan mengembangkan N Developer Preview, gunakan saluran
ini untuk melaporkan masalah dan memberikan umpan balik.
</p>
<ul>
<li> <a href="https://code.google.com/p/android-developer-preview/">N Developer Preview Issue
Tracker</a> adalah <strong>saluran umpan balik utama.</strong> Anda bisa melaporkan bug, masalah
kinerja, dan umpan balik umum melalui Issue Tracker. Anda juga bisa memeriksa
<a href="{@docRoot}preview/bug">masalah yang telah diketahui</a> dan
menemukan langkah-langkah solusinya. Kami akan terus mengabari mengenai masalah Anda saat masalah tersebut bila telah dipilah dan dikirimkan ke
tim teknis Android untuk ditinjau. </li>
<li> <a href="{@docRoot}preview/dev-community">Android N Developer Community</a> adalah
sebuah komunitas Google+ tempat Anda bisa <strong>terhubung dengan pengembang lain</strong> yang menggunakan
Android N. Anda bisa menyampaikan pengamatan atau ide atau menemukan jawaban atas
pertanyaan-pertanyaan mengenai Android N. Kami akan memoderasi komunitas ini dan memberikan jawaban serta
panduan jika diperlukan.</li>
</ul>
<h3 id="targeting">Menargetkan, API preview, dan mempublikasikan</h3>
<p>
N Developer Preview menyediakan sistem pengembangan semata dan pustaka Android
yang <strong>tidak memiliki API level standar</strong>. Jika Anda tidak ingin
mengikuti perilaku kompatibilitas untuk menguji aplikasi Anda (sangat
disarankan), Anda bisa menargetkan versi preview Android N dengan mengatur
<code><a href=
"{@docRoot}preview/setup-sdk.html#create-update">targetSdkVersion</a></code>
aplikasi Anda ke <code>“N”</code>.
</p>
<p>
Android N Developer Preview menghasilkan <strong>API preview</strong>
&mdash; API ini tidak akan resmi hingga SDK final dirilis,
yang saat ini direncanakan pada kuartal ketiga 2016. Ini berarti Anda boleh
<strong>berharap adanya perubahan kecil pada API </strong> selama waktu ini, terutama selama
minggu-minggu pertama program ini. Kami akan menyediakan rangkuman perubahan pada Anda bersama
setiap pembaruan Android N Developer Preview.
</p>
<p class="note">
<strong>Catatan</strong>: Meskipun API preview mungkin berubah, perilaku dasar
sistem stabil dan siap diuji.
</p>
<p>
Google Play <strong>akan mencegah publikasi aplikasi yang menargetkan N Developer
Preview</strong>. Bila SDK final Android N telah tersedia, Anda akan dapat
menargetkan Android N API level resmi dan mempublikasikan aplikasi ke Google
Play lewat saluran rilis alfa dan beta. Sementara itu, jika Anda ingin
mendistribusikan aplikasi yang menargetkan Android N kepada penguji, Anda bisa melakukannya lewat email atau
melalui pengunduhan langsung dari situs Anda.
</p>
<p>
Pada saat rilis penuh Android N ke AOSP dan OEM, yang direncanakan selama Kuartal 3 2016,
Anda akan dapat mempublikasikan aplikasi yang menargetkan Android N ke saluran
rilis publik di Google Play.
</p>
<h2 id="how_to_get_started">Cara memulai</h2>
<p>
Untuk memulai pengujian aplikasi Anda dengan Android N:
</p>
<ol>
<li> Tinjau <a href="{@docRoot}preview/api-overview.html">Ikhtisar API</a>
dan <a href="{@docRoot}preview/behavior-changes.html">Perubahan Perilaku</a> untuk
mendapatkan gambaran mengenai apa saja yang baru dan bagaimana pengaruhnya pada aplikasi Anda. Khususnya,
pelajari tentang fitur baru <a href="{@docRoot}preview/features/notification-updates.html">pemberitahuan</a> dan
<a href="{@docRoot}preview/features/multi-window.html">dukungan multi-jendela</a>.</li>
<li> Siapkan lingkungan Anda dengan mengikuti instruksi berikut untuk <a href="{@docRoot}preview/setup-sdk.html">Menyiapkan SDK Preview</a>
dan mengonfigurasi perangkat pengujian.</li>
<li> Ikuti <a href="https://developers.google.com/android/nexus/images">instruksi
flashing</a> untuk mem-flash citra sistem Android N terbaru ke perangkat Anda. </li>
<li> Tinjau <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referensi API</a>
dan <a href="{@docRoot}preview/samples.html">contoh Android N</a> untuk mendapatkan wawasan
lebih luas mengenai fitur-futur API yang baru dan cara menggunakannya dalam aplikasi Anda.
<li> Bergabunglah dengan <a href="{@docRoot}preview/dev-community">Android N
Developer Community</a> untuk mendapatkan berita terbaru dan terhubung dengan pengembang
lainnya yang menggunakan platform baru ini.</li>
</ol>
<p>
Terima kasih atas partisipasi Anda dalam program Android N Developer Preview!
</p>

View File

@@ -0,0 +1,85 @@
page.title=Contoh
page.tags="preview", "samples", "android"
page.image=images/cards/card-n-samples_2x.png
@jd:body
<p>
Contoh kode berikut disediakan untuk Android N. Untuk
mengunduh contoh di Android Studio, pilih opsi menu <b>File &gt; Import
Samples</b>.
</p>
<p class="note">
<strong>Catatan:</strong> Proyek yang bisa diunduh ini didesain
untuk digunakan bersama Gradle dan Android Studio.
</p>
<h3 id="mw">Multi-Window Playground</h3>
<img src="{@docRoot}preview/images/sample-multiwindow.png" style="float: left; padding-right: 0.5em" height="250" width="156" />
<p>
Contoh ini memperagakan cara memanfaatkan antarmuka pengguna
multijendela bersama aplikasi Anda.
</p>
<p>
<a href="https://github.com/googlesamples/android-MultiWindowPlayground">
Dapatkan di GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="an">Active Notifications</h3>
<img src="{@docRoot}preview/images/sample-activenotifications.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
Ini adalah contoh yang telah ada sebelumnya yang menampilkan layanan sederhana yang mengirimkan
pemberitahuan menggunakan NotificationCompat. Setiap percakapan yang belum dibaca dari pengguna
akan dikirim sebagai pemberitahuan tersendiri.
</p>
<p>
Contoh ini telah diperbarui untuk memanfaatkan fitur pemberitahuan baru
yang tersedia di Android N.
</p>
<p>
<a href="https://github.com/googlesamples/android-ActiveNotifications">
Dapatkan di GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="ms">Messaging Service</h3>
<img src="{@docRoot}preview/images/sample-messagingservice.png" style="float: left; padding-right: 0.5em" height="250" width="150" />
<p>
Ini adalah contoh yang telah ada sebelumnya yang memperagakan cara menggunakan
NotificationManager untuk memberi tahu jumlah pemberitahuan yang saat ini ditampilkan
oleh aplikasi.
</p>
<p>
Contoh ini telah diperbarui untuk memanfaatkan fitur pemberitahuan baru
yang tersedia di Android N.
</p>
<p>
<a href="https://github.com/googlesamples/android-MessagingService">
Dapatkan di GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="fbe">Direct Boot</h3>
<img src="{@docRoot}preview/images/sample-directboot.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
Contoh ini memperagakan cara menyimpan dan mengakses data dalam penyimpanan yang dienkripsi
dengan perangkat yang selalu tersedia saat perangkat booting.
</p>
<p>
<a href="https://github.com/googlesamples/android-DirectBoot">
Dapatkan di GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="sda">Scoped Directory Access</h3>
<img src="{@docRoot}preview/images/sample-scopeddirectoryaccess.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
Contoh ini memperagakan cara membaca dan menulis data dari direktori
spesifik, sekaligus meminta izin lebih sedikit.
</p>
<p>
<a href="https://github.com/googlesamples/android-ScopedDirectoryAccess">
Dapatkan di GitHub</a>
</p>

View File

@@ -0,0 +1,226 @@
page.title=Menyiapkan Preview
meta.keywords="preview", "android"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-sdk_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li><a href="#get-as13">Dapatkan Android Studio 2.1</a></li>
<li><a href="#get-sdk">Dapatkan Android N SDK</a>
<ol>
<li><a href="#docs-dl">Dokumentasi referensi</a>
</ol>
</li>
<li><a href="#java8">Dapatkan Java 8 JDK dan JRE</a></li>
<li><a href="#create-update">Perbarui atau Buat sebuah Proyek</a></li>
<li><a href="#next">Langkah Berikutnya</a></li>
</ol>
</div>
</div>
<p>Untuk mengembangkan aplikasi bagi Android N Preview, Anda perlu membuat beberapa pembaruan
pada lingkungan pengembang, seperti dijelaskan pada halaman ini.</p>
<p>Untuk sekedar menguji kompatibilitas aplikasi Anda pada
citra sistem Android N, ikuti panduan untuk <a href="{@docRoot}preview/download.html">Menguji pada Perangkat Android N</a>.</p>
<img src="{@docRoot}preview/images/n-preview-setup.png" width="700" alt="" />
<h2 id="get-as13">Dapatkan Android Studio 2.1 (preview)</h2>
<p>Platform Android N menambahkan dukungan untuk <a href="{@docRoot}preview/j8-jack.html">fitur bahasa Java 8</a>,
yang memerlukan compiler baru yang disebut Jack. Versi terbaru Jack
saat ini hanya didukung di Android Studio 2.1. Jadi jika ingin
menggunakan fitur bahasa Java 8, Anda perlu menggunakan Android Studio 2.1 untuk
membangun aplikasi. Jika tidak, Anda tidak perlu menggunakan compiler Jack, namun Anda
tetap perlu memperbarui ke JDK 8 untuk mengompilasi pada platform Android N,
seperti dijelaskan di bawah ini.
</p>
<iframe width="400" height="225" src="//www.youtube.com/embed/SBbWGxXCMqQ?autohide=1&amp;showinfo=0" frameborder="0" allowfullscreen="" style="float: right; margin: 0 0 20px 20px;"></iframe>
<p>Android Studio 2.1 saat ini tersedia sebagai preview di
Canary Release Channel. Jika Anda sudah
memiliki Android Studio dan tidak ingin memperbarui ke Canary Channel, Anda bisa
mengunduh Android Studio 2.1 sebagai instalasi terpisah dan menggunakannya
untuk pengembangan dengan Android N, sehingga membuat lingkungan Android Studio
utama Anda tidak terpengaruh.</p>
<p>Untuk mengunduh Android Studio 2.1 sebagai instalasi terpisah, ikuti langkah-langkah
ini (atau jika Anda ingin menerima Android Studio 2.1 sebagai pembaruan pada
instalasi yang ada, lompat ke langkah 4):</p>
<ol>
<li>Edit nama
instalasi Android Studio yang ada dan tambahkan nomor versinya. Dengan cara ini,
bila Anda menginstal versi baru, versi yang ada tidak akan ditimpa.</li>
<li>Unduh file ZIP yang sesuai untuk sistem operasi Anda dari
<a href="http://tools.android.com/download/studio/canary/latest">halaman pengunduhan Canary Channel</a>.
</li>
<li>Unzip paket tersebut kemudian pindahkan konten Android Studio 2.1 ke
lokasi yang sesuai untuk aplikasi pada sistem Anda, kemudian jalankan.</li>
<li>Buka dialog Settings
(<strong>File &gt; Settings</strong> pada Windows/Linux, atau
<strong>Android Studio &gt; Preferences</strong> pada Mac). Di panel
kiri, pilih <strong>Appearance &amp; Behavior &gt; System Settings &gt;
Updates</strong>.
</li>
<li>Pada panel Updates, pilih kotak cek <strong>Automatically
check updates for</strong> dan pilih
<strong>Canary Channel</strong> dari daftar tarik-turun.
</li>
</ol>
<p>Biarkan jendela pengaturan ini tetap terbuka untuk langkah berikutnya.</p>
<h2 id="get-sdk">Dapatkan N Preview SDK</h2>
<p>Untuk mulai mengembangkan dengan Android N API, Anda perlu menginstal
Android N Preview SDK di Android Studio sebagai berikut:</p>
<ol>
<li>Saat panel Updates masih ditampilkan (langkah 4 dari di atas),
pilih kotak cek <strong>Automatically
check updates for Android SDK</strong> dan pilih
<strong>Preview Channel</strong> dari daftar tarik-turun.
</li>
<li>Klik <strong>Check Now</strong>.</li>
<li>Di panel kiri, pilih <strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>.
<li>Klik tab <strong>SDK Platforms</strong>, kemudian pilih kotak cek
<strong>Android N Preview</strong>.</li>
<li>Klik tab <strong>SDK Tools</strong>, kemudian pilih
kotak cek <strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong>, dan <strong>Android SDK Tools</strong>.
</li>
<li>Klik <strong>OK</strong>, kemudian terima
perjanjian lisensi untuk setiap paket yang perlu diinstal.
</li>
</ol>
<h3 id="docs-dl">Dapatkan dokumentasi referensi N Preview</h3>
<p>
Informasi detail tentang Android N API tersedia dalam dokumentasi referensi N Preview,
yang bisa Anda unduh dari tabel berikut.
Paket ini berisi versi offline untuk situs web pengembang Android yang disederhanakan,
dan termasuk referensi API yang diperbarui untuk Android N API dan
laporan perbedaan API.
</p>
<table>
<tr>
<th scope="col">Dokumentasi</th>
<th scope="col">Checksum</th>
</tr>
<tr>
<td style="white-space: nowrap">
<a href="{@docRoot}shareables/preview/n-preview-1-docs.zip">n-preview-1-docs.zip</a></td>
<td width="100%">
MD5: 4ab33ccbe698f46f125cc5b807cf9c2f<br>
SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5
</td>
</tr>
<table>
<h2 id="java8">Dapatkan Java 8 JDK dan JRE</h2>
<p>Untuk mengompilasi aplikasi Anda sesuai platform Android N, Anda perlu menggunakan
Java 8 Developer Kit (JDK 8), dan untuk menggunakan beberapa alat bersama Android
Studio 2.1, Anda perlu menginstal Java 8 Runtime Environment (JRE 8). Jadi, jika
Anda belum versi terbarunya, unduhlah JDK 8 dan JRE 8
sekarang.</p>
<p>Kemudian atur versi JDK di Android Studio sebagai berikut:</p>
<ol>
<li>Buka proyek Android di Android Studio, kemudian buka
dialog Project Structure dengan memilih <strong>File &gt;
Project Structure</strong>. (Atau, Anda bisa mengatur default
untuk semua proyek dengan memilih <strong>File &gt; Other Settings &gt;
Default Project Structure</strong>.)
</li>
<li>Di panel kiri dialog, klik <strong>SDK Location</strong>.
</li>
<li>Dalam bidang <strong>JDK Location</strong>, masukkan lokasi
Java 8 JDK (klik tombol di sebelah kanan
untuk menjelajahi file Anda), kemudian klik <strong>OK</strong>.
</li>
</ol>
<img src="{@docRoot}preview/images/studio-jdk-location.jpg" width="700" alt="" />
<h2 id="create-update">Perbarui atau Buat sebuah Proyek</h2>
<p>
Untuk menggunakan Android N API, proyek Anda harus dikonfigurasi dengan benar.
</p>
<p>Jika Anda berencana menggunakan fitur bahasa Java 8, Anda juga harus membaca
<a href="{@docRoot}preview/j8-jack.html">Fitur Bahasa Java 8</a>
untuk informasi tentang fitur Java 8 yang didukung dan
cara mengonfigurasi proyek Anda dengan Jack compiler.</p>
<h3 id="update">Perbarui proyek yang ada</h3>
<p>Buka file
<code>build.gradle</code> untuk modul Anda dan perbarui nilainya sebagai
berikut:
</p>
<pre>
android {
compileSdkVersion <strong>'android-N'</strong>
buildToolsVersion <strong>'24.0.0-rc1'</strong>
...
defaultConfig {
minSdkVersion <strong>'N'</strong>
targetSdkVersion <strong>'N'</strong>
...
}
...
}</pre>
<h3 id="create">Buat proyek baru</h3>
<p>Untuk membuat proyek baru bagi pengembangan dengan Android N Preview SDK:</p>
<ol>
<li>Klik <strong>File &gt; New Project</strong>, dan ikuti langkah-langkahnya hingga
Anda tiba di halaman Target Android Devices.
</li>
<li>Pada halaman ini, pilih opsi <strong>Phone and Tablet</strong>.</li>
<li>Pada opsi <strong>Phone and Tablet</strong>, dalam daftar opsi <strong>Minimum
SDK</strong>, pilih
<strong>N: Android API 23, N Preview (Preview)</strong>.</li>
</ol>
<h2 id="next">Langkah Berikutnya</h2>
<ul>
<li>Ikuti panduan untuk <a href="{@docRoot}preview/download.html">Menguji pada Perangkat Android N</a>.</li>
<li>Ketahui selengkapnya tentang platform Android N dengan
<a href="{@docRoot}preview/behavior-changes.html">Perubahan Perilaku</a>
dan <a href="{@docRoot}preview/api-overview.html">Android N API
dan Fiturnya</a>.</li>
</ul>

View File

@@ -0,0 +1,676 @@
page.title=デベロッパー向け Android N
meta.tags="プレビュー"、"androidn"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-apis_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>主なデベロッパー機能</h2>
<ol>
<ul style="list-style-type:none;">
<li><a href="#multi-window_support">マルチ ウィンドウのサポート</a></li>
<li><a href="#notification_enhancements">通知</a></li>
<li><a href="#jit_aot">JIT/AOT コンパイル</a></li>
<li><a href="#quick_path_to_app_install">アプリの高速インストール</a></li>
<li><a href="#doze_on_the_go">どこでも機能する Doze</a></li>
<li><a href="#background_optimizations">バックグラウンド処理の最適化</a></li>
<li><a href="#data_saver">データセーバー</a></li>
<li><a href="#tile_api">クイック設定タイル API</a></li>
<li><a href="#number-blocking">迷惑電話のブロック</a></li>
<li><a href="#call_screening">通話スクリーニング</a></li>
<li><a href="#multi-locale_languages">ロケールと言語</a></li>
<li><a href="#icu4">Android の ICU4J API</a></li>
<li><a href="#gles_32">OpenGL ES 3.2 API</a></li>
<li><a href="#android_tv_recording">Android TV の録画機能</a></li>
<li><a href="#android_for_work">Android for Work</a></li>
<li><a href="#accessibility_enhancements">アクセシビリティ</a></li>
<li><a href="#direct_boot">ダイレクト ブート</a></li>
<li><a href="#key_attestation">キーの構成証明</a></li>
<li><a href="#network_security_config">ネットワーク セキュリティ構成</a></li>
<li><a href="#default_trusted_ca">デフォルトで信頼される証明機関</a></li>
<li><a href="apk_signature_v2">APK 署名スキーム v2</a></li>
<li><a href="#scoped_directory_access">特定のディレクトリへのアクセス</a></li>
</ol>
</div>
</div>
<p>Android N は現在も開発中ですが、N Developer Preview の一部として Android N を試用できます。以下のセクションでは、デベロッパー向けの新しい機能の一部を紹介しています。
</p>
<p>
<a href="{@docRoot}preview/behavior-changes.html">動作の変更点</a>を確認して、プラットフォームの変更がアプリに影響を及ぼす可能性のある領域について把握してください。また、デベロッパー ガイドを参照して主な機能について詳しく学習し、<a href="{@docRoot}preview/setup-sdk.html#docs-dl">API リファレンス</a>をダウンロードして、新しい API の詳細を理解してください。
</p>
<h2 id="multi-window_support">マルチ ウィンドウのサポート</h2>
<p>Android N では、多くのユーザーから求められていたマルチタスク機能がプラットフォームに新しく導入され、マルチ ウィンドウがサポートされています。
</p>
<p>これにより、ユーザーは画面に 2 つのアプリを同時に開くことができるようになりました。 </p>
<ul>
<li>Android N が動作している携帯端末やタブレットでは、分割画面モードで 2 つのアプリを左右や上下に並べて実行できます。また、2 つのアプリの間にある分割線をドラッグしてアプリのサイズを変更することもできます。
</li>
<li>Android TV デバイスでは、アプリを<a href="{@docRoot}preview/features/picture-in-picture.html">ピクチャ イン ピクチャ モード</a>にすると、アプリにコンテンツを表示したまま、他のアプリをブラウジングまたは操作することができます。詳細は以下をご覧ください。
</li>
</ul>
<div class="col-4of10">
<img src="{@docRoot}preview/images/mw-portrait.png" alt="" style="height:460px;padding-left:1em;" id="img-split-screen" />
<p class="img-caption">
<strong>図 1.</strong> 分割画面モードで実行されているアプリ
</p>
</div>
<p>特にタブレットや大画面のデバイスでは、マルチ ウィンドウのサポートにより、ユーザーを引き付ける新しい方法が提供されます。アプリでドラッグ アンド ドロップを有効にすると、ユーザーはアプリとの間でコンテンツを簡単にドラッグすることができるので、快適な使い心地が実現することができます。
</p>
<p>マルチ ウィンドウのサポートをアプリに追加して、どのようにマルチ ウィンドウを処理するかを設定するのは簡単です。たとえば、アクティビティの最小許容寸法を指定すると、ユーザーはアクティビティをそのサイズ以下に変更できなくなります。また、アプリに対してマルチ ウィンドウ表示を無効にすると、アプリが全画面モードでのみ表示されます。
</p>
<p>
詳細については、<a href="{@docRoot}preview/features/multi-window.html">マルチ ウィンドウのサポート</a>に関するデベロッパー向けドキュメントをご覧ください。
</p>
<h2 id="notification_enhancements">通知の機能強化</h2>
<p>Android N では、通知が再設計されており、さらに使いやすくなっています。加えられている変更は、次のような点です。
</p>
<ul>
<li>
<strong>テンプレートのアップデート</strong>: 通知テンプレートは、ヒーロー イメージやアバターを中心としたデザインにアップデートされています。デベロッパーは、コードに最小限の変更を加えるだけで、この新しいテンプレートを活用できます。
</li>
<li>
<strong>バンドル通知</strong>: メッセージをグループ化します。たとえば、メッセージをトピックごとにグループ化して、各グループを表示できます。ユーザーは、各グループに対して、消去やアーカイブといったアクションを実行できます。Android Wear 向けの通知を実装したことがある場合は、このモデルはおなじみでしょう。
</li>
<li>
<strong>ダイレクト リプライ</strong>: Android システムでは、インライン リプライがサポートされています。リアルタイム通信アプリを使用しているユーザーは、通知インターフェース内で直接 SMS やテキスト メッセージにすばやく応答できます。
</li>
<li>
<strong>カスタムビュー</strong>: 2 つの新しい API を使用すると、通知でカスタムビューを使用するときに、通知ヘッダーやアクションなどのシステム デコレーションを活用できます。
</li>
</ul>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-1.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-3.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-2.png" alt="" style="padding:.5em;max-width:226px">
</div>
<p class="img-caption">
<strong>図 2.</strong> バンドル通知とダイレクト リプライ
</p>
<p>以上の新しい機能を実装する方法の詳細については、<a href="{@docRoot}preview/features/notification-updates.html">通知</a>に関するガイドをご覧ください。
</p>
<h2 id="jit_aot">プロファイルに基づいた JIT/AOT コンパイル</h2>
<p>Android N では、コード プロファイリングにも対応した Just in TimeJITコンパイラーが ART に追加されており、Android アプリの実行時のパフォーマンスが向上しています。JIT コンパイラーは、ART で現在使用されている Ahead of TimeAOTコンパイラーを補完するものであり、実行時パフォーマンスの向上、記憶領域の削減、アプリとシステムのアップデートの高速化に貢献します。
</p>
<p>プロファイルに基づいたコンパイルを使用すると、アプリの実際の使用方法やデバイス上での状態に応じて、ART が各アプリの AOT/JIT コンパイルを管理します。たとえば、ART は各アプリのホット メソッドのプロファイルを維持し、メソッドをプリコンパイルしてキャッシュすることにより、パフォーマンスを最適化します。また、アプリの他の部分は、実際に使用されるときまでコンパイルされません。
</p>
<p>プロファイルに基づいたコンパイルは、アプリの主要部分のパフォーマンスを向上させ、関連するバイナリなど、アプリの全体的な RAM 使用量を削減します。この機能は、メモリが少ないデバイスで特に重要です。
</p>
<p>ART は、デバイスのバッテリーへの影響が最小限になるようにプロファイルに基づいたコンパイルを管理します。デバイスがアイドル状態および充電中のときにのみ、プリコンパイルが事前に実行されるため、時間とバッテリーが節約できます。
</p>
<h2 id="quick_path_to_app_install">アプリの高速インストール</h2>
<p>ART の JIT コンパイラーの最も明確な利点の 1 つは、アプリのインストールとシステム アップデートの速度です。Android 6.0 では最適化とインストールの実行に数分かかっていたサイズの大きいアプリでも、数秒でインストールできるようになりました。最適化のステップが不要なったため、システム アップデートも高速化されています。
</p>
<h2 id="doze_on_the_go">どこでも機能する Doze</h2>
<p>Android 6.0 では Doze システム モードが導入されています。これにより、デバイスが机に置かれているときや引き出しに収められているときなどのアイドル時にアプリの CPU とネットワーク通信の実行を保留し、バッテリーを節約します。
</p>
<p>Android N では Doze が改良され、外出中でもバッテリーを節約できるようになっています。画面をしばらくオフにしたりデバイスを電源から抜いたりすると、Doze により、通常の CPU およびネットワーク制限の一部がアプリに適用されます。つまり、デバイスをポケットに入れて持ち歩いてるときでもバッテリーを節約できます。
</p>
<img src="/preview/images/doze-diagram-1.png" alt="" id="figure1" />
<p class="img-caption">
<strong>図 3.</strong> Doze により、デバイスが静止していないときでも制限が適用され、バッテリーの寿命が延長される
</p>
<p>デバイスがバッテリーで動作しているときに画面をしばらくオフにすると、Doze はネットワーク アクセスを制限し、ジョブと同期を保留します。アプリはメンテナンス ウィンドウと呼ばれる短い時間にネットワークにアクセスしたり、保留中のジョブや同期を実行します。画面をオンにするか、デバイスを電源に接続すると、デバイスの Doze モードは解除されます。
</p>
<p>バッテリーで動作しているデバイスが再び静止状態になり、画面がしばらくオフになると、Doze は完全な CPU およびネットワーク制限を {@link
android.os.PowerManager.WakeLock}、{@link android.app.AlarmManager} アラーム、GPS / Wi-Fi スキャンに適用します。
</p>
<p>アプリを Doze に対応させるためのベストプラクティスはデバイスを持ち歩いているかどうかには関係ありません。そのため、Doze が適切に処理されるようにアプリを既にアップデートしている場合は、追加の対応は必要ありません。そうでない場合は、<a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">アプリの Doze 対応</a>を行ってください。
</p>
<h2 id="background_optimizations">Project Svelte: バックグラウンド処理の最適化</h2>
<p>Project Svelte は、Android エコシステムのさまざまなデバイスでシステムやアプリによる RAM の使用を最小限にする取り組みです。Android N 向けの Project Svelte は、アプリをバックグラウンドで実行する方法を最適化することに重点を置いています。
</p>
<p>ほとんどのアプリでは、バックグラウンド処理が非常に重要になります。バックグラウンド処理を適切に実行すると、ユーザー エクスペリエンスが大幅に向上し、状況に応じてアプリより高速に実行できるようになります。バックグラウンド処理が不適切な場合は、RAMとバッテリーが必要以上に消費され、他のアプリのシステム パフォーマンスに影響を及ぼす可能性があります。
</p>
<p>Android 5.0 以降では、ユーザーに適した方法でバックグラウンド処理を実行する {@link android.app.job.JobScheduler} が推奨されています。これによって、メモリ、電源、接続の状態に基づいてシステムを最適化しながら、アプリでジョブをスケジュールできます。JobScheduler はシンプルな制御を提供するため、すべてのアプリで JobScheduler を使用することが効果的です。
</p>
<p>
もう 1 つの適切な選択肢は、Google Play サービスの一部である <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager"><code>GCMNetworkManager</code></a> です。この機能も同様のジョブ スケジュール機能を提供しますが、こちらはレガシー バージョンの Android とも互換性があります。
</p>
<p>さらに多くのユースケースに対応するために、<code>JobScheduler</code> と <code>GCMNetworkManager</code> の拡張は継続されています。たとえば、Android N では、コンテンツ プロバイダの変更に基づいてバックグラウンド処理をスケジュールできるようになります。また、特にメモリの少ないデバイスでシステム パフォーマンスを低下させる可能性のある一部の古いパターンの廃止も開始されています。
</p>
<p>一般的に使用される暗黙的なブロードキャストである
{@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}、{@link
android.hardware.Camera#ACTION_NEW_PICTURE}、{@link
android.hardware.Camera#ACTION_NEW_VIDEO} は複数のアプリのバックグラウンド処理を同時に起動するので、メモリとバッテリーに負荷をかける可能性があります。そのため、Android N では、この 3 つのブロードキャストが削除されています。アプリがこれらのブロードキャストを受信する場合は、N Developer Preview を使用して、<code>JobScheduler</code> とそれに関連する API に移行してください。
</p>
<p>
詳細については、<a href="{@docRoot}preview/features/background-optimization.html">バックグラウンド処理の最適化</a>に関するドキュメントをご覧ください。
</p>
<h2 id="data_saver">データセーバー</h2>
<div class="col-5of12" style="margin-right:1.5em;">
<img src="{@docRoot}preview/images/datasaver.png" style="border:2px solid #ddd">
<p class="img-caption" style="padding-right:2em;">
<strong>図 4.</strong> [Settings] でのデータセーバー
</p>
</div>
<p>一般的に、モバイル端末のライフサイクル全体では、携帯データ通信プランのコストがデバイス自体のコストを上回ります。多くのユーザーにとって、携帯データ通信は、節約する必要のある高価なリソースです。
</p>
<p>Android N では、ローミング、課金サイクルの終了近く、または短期間のデータパックであるかどうかに関係なく、アプリによる携帯データ通信の使用を削減する新しいシステム サービスであるデータセーバー モードが導入されています。データセーバーを使用すると、アプリによる携帯データ通信の使用方法をユーザーが制御できます。また、デベロッパーは、データセーバーがオンのときに、より効率よく通信するサービスを提供できるようになります。
</p>
<p>ユーザーが [<strong>Settings</strong>] でデータセーバーを有効にし、デバイスが従量制課金ネットワークに接続されている場合、システムは、ストリーミングのビットレートを制限したり、画質を低下させたり、オプティミスティックなプレキャッシングを保留したりすることにより、バックグラウンドでのデータ使用をブロックし、フォアグラウンドでデータの使用を抑えるようにアプリに指示します。ユーザーは特定のアプリをホワイトリストに登録することにより、データセーバーがオンになっているときでも、バックグラウンドで従量制課金接続を使用できます。
</p>
<p>Android N は {@link android.net.ConnectivityManager} を拡張することで、<a href="{@docRoot}preview/features/data-saver.html#status">ユーザーのデータセーバー設定を取得</a>する方法と、<a href="{@docRoot}preview/features/data-saver.html#monitor-changes">設定の変更を監視</a>する方法を提供しています。すべてのアプリは、ユーザーがデータセーバーを有効にしているかどうかを確認し、フォアグラウンドおよびバックグラウンドでのデータ使用を制限する必要があります。
</p>
<h2 id="tile_api">クイック設定タイル API</h2>
<div style="float:right;max-width:320px">
<img src="{@docRoot}preview/images/quicksettings.png" style="padding-left:1.5em;">
<p class="img-caption" style="padding-left:2em;">
<strong>図 5.</strong> 通知シェードにあるクイック設定タイル
</p>
</div><p>クイック設定を使用すると、通知シェードで主要な設定とアクションを直接公開することができます。Android N では、クイック設定の範囲が拡大され、さらに使いやすく便利な機能になっています。
</p>
<p>クイック設定タイル用のスペースが広くなったので、ユーザーは、左または右にスワイプして、ページ分割された表示領域でこれらのタイルにアクセスできます。また、ユーザーは、表示するクイック設定タイルとその表示場所を制御できるようになっています。ユーザーはタイルをドラッグ アンド ドロップして、タイルを追加または移動できます。
</p>
<p>Android N では、デベロッパーが独自のクイック設定タイルを定義できる新しい API が追加されており、ユーザーはこの API を通じて、アプリの主なコントロールとアクションに簡単にアクセスできます。
</p>
<p>
クイック設定タイルは、緊急に必要な、または頻繁に使用されるコントロールやアクション用に用意されたものであり、アプリを起動するためのショートカットとして使用するべきではありません。
</p>
<p>
タイルの定義が完了すると、ユーザーにタイルを公開できるようになります。ユーザーはタイルをドラッグ アンド ドロップするだけで、クイック設定にタイルを追加できます。
</p>
<p>
アプリタイルを作成する方法の詳細については、ダウンロード可能な <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API リファレンス</a>に掲載されている <code>android.service.quicksettings.Tile</code> をご覧ください。
</p>
<h2 id="number-blocking">迷惑電話のブロック</h2>
<p>Android N では、プラットフォームで迷惑電話のブロックがサポートされており、サービス プロバイダがブロックリストを保持するためのフレームワーク API が提供されています。デフォルトの SMS アプリ、デフォルトの電話アプリ、プロバイダ アプリは、ブロックリストを読みこんだり、ブロックリストに書き込んだりできます。その他のアプリはブロックリストにアクセスできません。
</p>
<p>Android では、迷惑電話のブロックをプラットフォームの標準の機能にすることにより、幅広いデバイスで迷惑電話をブロックできるようにする一貫した方法がアプリに提供されています。その他に、次のような機能も提供されます。
</p>
<ul>
<li> ブロックされた電話番号は、テキスト メッセージでもブロックされる
<li> ブロックされた電話番号は、リセットしたデバイスや、バックアップおよびリストア機能で移行したデバイスでも保持される
<li> 複数のアプリが同じブロックリストを使用できる
</ul>
<p>また、Android に携帯通信会社のアプリが組み込まれていると、携帯通信会社はデバイス上のブロックリストを読み込んで迷惑な電話やテキスト メッセージをサービス側でブロックできます。これによって、VOIP エンドポイントや転送電話などいかなる媒体を介しても、ブロックされた番号はユーザーに到達できなくなります。
</p>
<p>
詳細については、ダウンロード可能な <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API リファレンス</a>にある <code>android.provider.BlockedNumberContract</code> をご覧ください。
</p>
<h2 id="call_screening">通話スクリーニング</h2>
<p>
Android N では、デフォルトの電話アプリで新しい <code>CallScreeningService</code> を実装することによって、着信をスクリーニング(分類)できます。電話アプリは、着信する電話の {@link android.telecom.Call.Details Call.Details} に基づいて次のようなアクションを実行できます。
</p>
<ul>
<li> 着信を拒否する
<li> 着信を通話履歴に含めない
<li> 着信通知をユーザーに表示しない
</ul>
<p>
詳細については、ダウンロード可能な <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API リファレンス</a>にある <code>android.telecom.CallScreeningService</code> をご覧ください。
</p>
<h2 id="multi-locale_languages">マルチロケールのサポートと言語の追加</h2>
<p>Android N では、[Settings] で<strong>マルチロケール</strong>が選択できるようになり、複数言語を使用するユーザーへのサポートが強化されました。アプリで新しい API を使用して、ユーザーが選択したロケールを取得すると、複数のロケールを設定しているユーザーに対してより洗練された使用感を提供できます。たとえば、検索結果を複数の言語で表示したり、ユーザーが知っている言語のウェブページでは翻訳の提案を行わないようなことが可能になります。
</p>
<p>また、Android N では、マルチロケールのサポートに加えて、ユーザーが利用できる言語が追加されています。英語、スペイン語、フランス語、アラビア語などの一般的な言語に対して、それぞれ 25 以上の言語バリエーションが提供されます。100 以上の新しい言語も部分的にサポートされています。
</p>
<p>アプリは、<code>LocaleList.GetDefault()</code> を呼び出すことにより、ユーザーが設定したロケールのリストを取得できます。Android N では、増加したロケールをサポートするために、リソースを解決する方法が変更されています。この新しいリソース解決ロジックでアプリが想定どおりに動作することをテストおよび確認してください。
</p>
<p>新しいリソース解決動作と順守する必要のあるベストプラクティスの詳細については、<a href="{@docRoot}preview/features/multilingual-support.html">複数言語のサポート</a>をご覧ください。
</p>
<h2 id="icu4">Android の ICU4J API</h2>
<p>
Android N では、<a href="http://site.icu-project.org/">ICU4J</a> API のサブセットが提供されています。これは、Android フレームワークの <code>android.icu</code> パッケージにあります。移行は簡単で、ほとんどの場合、名前空間を <code>com.java.icu</code> から <code>android.icu</code> に変更するだけです。アプリで ICU4J バンドルを既に使用している場合は、Android フレームワークで提供されている <code>android.icu</code> API に移行すると、APK サイズを大幅に削減できます。
</p>
<p>
Android ICU4J API の詳細については、<a href="{@docRoot}preview/features/icu4j-framework.html">ICU4J サポート</a>をご覧ください。
</p>
<h2 id="gles_32">OpenGL&trade; ES 3.2 API</h2>
<p>Android N では、OpenGL ES 3.2 用の次のようなフレームワーク インターフェースとプラットフォーム サポートが追加されています。</p>
<ul>
<li> <code>EXT_texture_sRGB_decode</code> を除く <a class="external-link" href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">Android エクステンション パック</a></a>AEPのすべての拡張機能
<li> HDR および遅延シェーディング用の浮動小数点フレームバッファ
<li> 一括処理とストリーミングを向上させるための BaseVertex 描画呼び出し
<li> WebGL のオーバーヘッドを低減するための堅牢なバッファ アクセス コントロール
</ul>
<p>Android N の OpenGL ES 3.2 用のフレームワーク API は、<code>GLES32</code> クラスで提供されます。OpenGL ES 3.2 を使用する場合、<code>&lt;uses-feature&gt;</code> タグと <code>android:glEsVersion</code> 属性を使用してマニフェスト ファイルで要件を宣言する必要があります。
</p>
<p>デバイスでサポートされる OpenGL ES のバージョンを実行時に確認する方法など、OpenGL ES の使用方法については、<a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES API ガイド</a>をご覧ください。
</p>
<h2 id="android_tv_recording">Android TV の録画機能</h2>
<p>Android N では、新しい recording API を介して Android TV 入力サービスからコンテンツを録画して再生する機能が追加されています。TV 入力サービスは、録画できるチャンネル データや録画したセッションを保存する方法の制御、ユーザーによる録画されたコンテンツの操作の管理を行います。このサービスは、既存の time-shifting API を使用して構築されています。
</p>
<p>詳細については、<a href="{@docRoot}preview/features/tv-recording-api.html">Android TV Recording API</a> をご覧ください。</p>
<h2 id="android_for_work">Android for Work</h2>
<p>Android for Work は、Android N を実行しているデバイスに多くの新しい機能と API を追加するものです。主要な機能の一部を以下に紹介します。Android N に関連する Android for Work のアップデートの完全なリストについては、Android for Work の変更点をご覧ください。
</p>
<h3 id="work_profile_security_challenge">ワーク プロファイルによるセキュリティ確認 </h3>
<p>
プロファイル オーナーは、ワーク プロファイルで実行しているアプリで個別にセキュリティ確認を行うよう指定することができます。ユーザーが仕事用アプリを開こうとすると、セキュリティの確認画面が表示されます。セキュリティの確認に成功すると、ワーク プロファイルのロックが解除され、必要に応じて暗号化も解除されます。プロファイル オーナーは、<code>ACTION_SET_NEW_PASSWORD</code> でユーザーにワーク プロファイル用のセキュリティ確認を設定するように求めたり、<code>ACTION_SET_NEW_PARENT_PROFILE_PASSWORD</code> でユーザーにデバイスのロックを設定するように求めることができます。
</p>
<p>
プロファイル オーナーは、<code>setPasswordQuality()</code>、<code>setPasswordMinimumLength()</code>、および関連するメソッドを使用して、ワーク プロファイル用のセキュリティ確認に個別のパスワード ポリシーPIN に必要な長さや、指紋によるプロファイルのロック解除が可能かどうかなど)を設定できます。また、新しい <code>getParentProfileInstance()</code> メソッドが返す <code>DevicePolicyManager</code> インスタンスを使用してデバイスのロックを設定できます。さらに、新しい <code>setOrganizationColor()</code> メソッドおよび <code>setOrganizationName()</code> メソッドを使用してワーク プロファイル用のセキュリティ確認画面をカスタマイズすることができます。
</p>
<h3 id="turn_off_work">ワークモードのオフ </h3>
<p>ユーザーは、ワーク プロファイルがあるデバイスでワークモードのオン / オフを切り替えることができます。ワークモードがオフになると、管理されているユーザーが一時的にシャットダウンされ、ワーク プロファイルのアプリ、バックグラウンドでの同期、通知が無効になります。無効になるアプリには、プロファイル オーナーのアプリが含まれます。また、ワークモードがオフになると、仕事用アプリを起動できないことをユーザーに示すステータス アイコンが表示されたままになります。ランチャーは、仕事用アプリとウィジェットにアクセスできないことを示します。
</p>
<h3 id="always_on_vpn">Always on VPN </h3>
<p>デバイス オーナーとプロファイル オーナーは、仕事用アプリが指定した VPN を介して常時接続するように設定できます。デバイスが起動すると、システムは VPN を自動的に開始します。
</p>
<p>
<code>setAlwaysOnVpnPackage()</code> と <code>getAlwaysOnVpnPackage()</code> は新しい <code>DevicePolicyManager</code> のメソッドです。
</p>
<p>システムがアプリの介入なしに VPN サービスを直接バインドするため、Always on VPN の新しいエンドポイントは VPN クライアント側で処理する必要があります。以前と同じように、システムへのサービスの通知はインテントフィルタのマッチング アクション <code>android.net.VpnService</code> で行います。
</p>
<p>
プライマリ ユーザーは、<strong>[Settings] &gt; [More] &gt; [Vpn]</strong> から <code>VPNService</code> のメソッドを実装した Always on VPN クライアントを手動で設定することもできます。
</p>
<h2 id="accessibility_enhancements">アクセシビリティの機能強化</h2>
<p>Android N では、新しいデバイスのセットアップのオープニング画面に [Vision Settings] が直接表示されます。これにより、ユーザーは、ズーム操作、フォントサイズ、ディスプレイ サイズ、TalkBack など、デバイスのアクセシビリティ機能を簡単に見つけて構成できるようになっています。
</p>
<p>このようなアクセシビリティ機能が目立つ場所に配置されたため、ユーザーがこれらの機能を有効にしてアプリを試用する可能性が高まりました。アクセシビリティ機能の設定を有効にして、アプリを事前にテストするようにしてください。これらの設定は、[Settings] &gt; [Accessibility] で有効にできます。
</p>
<p>Android N では、アクセシビリティ サービスにより、運動障害のあるユーザーが画面をタップすることを支援できます。この新しい API を使用すると、顔追跡、視線追跡、ポイント スキャンなどの機能を備えたサービスを構築して、これらのユーザーのニーズに対応することができます。
</p>
<p>詳細については、ダウンロード可能な <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API リファレンス</a>にある <code>android.accessibilityservice.GestureDescription</code> をご覧ください。
</p>
<h2 id="direct_boot">ダイレクト ブート</h2>
<p>ダイレクト ブートはデバイスのスタートアップ時間を短縮し、予期しない再起動後でも、登録されたアプリの一部の機能が使用できるようにします。たとえば、ユーザーの就寝中に暗号化されたデバイスが再起動した場合でも、登録したアラーム、メッセージ、電話の着信をユーザーに通常どおり通知することができます。また、再起動後にアクセシビリティ サービスをすぐに使用することもできます。
</p>
<p>ダイレクト ブートでは、Android N のファイルベースの暗号化を活用して、システムとアプリのデータに対してきめ細かい暗号化ポリシーを適用します。システムは、一部のシステムデータと明示的に登録されたアプリデータにデバイス暗号化ストアを使用します。デフォルトでは、他のすべてのシステムデータ、ユーザーデータ、アプリ、アプリデータには、資格情報暗号化ストアが使用されます。
</p>
<p>システムは起動時にデバイス暗号化データのみにアクセスできる制限モードになります。この状態では、アプリやデータへの一般的なアクセスは許可されません。このモードで実行する必要のあるコンポーネントがある場合、マニフェストにフラグを設定することでコンポーネントを登録できます。再起動後、システムは、<code>LOCKED_BOOT_COMPLETED</code> インテントをブロードキャストすることにより、登録済みのコンポーネントをアクティベートします。システムは、ロック解除する前に、登録済みのデバイス暗号化アプリデータを利用できるようにします。他のすべてのデータは、ユーザーがロック画面の資格情報を確認して暗号化解除するまで利用できません。
</p>
詳細については、<a href="{@docRoot}preview/features/direct-boot.html">ダイレクト ブート</a>をご覧ください。</p>
</p>
<h2 id="key_attestation">キーの構成証明</h2>
<p>ハードウェアがサポートするキーストアは、Android 端末で暗号化キーを作成、格納、使用するためのより安全な方法を提供します。このキーストアは、Linux カーネル、Android の潜在的な脆弱性、ルート権限を取得された端末からの抽出からキーを保護します。
</p>
<p>ハードウェアがサポートするキーストアの使用をさらに簡単かつ安全にするために、Android N では、キーの構成証明が導入されています。アプリや別のデバイスは、キーの構成証明を使用して RSA または EC キーペアがハードウェアでサポートされているかどうか、キーペアのプロパティはどのようなものか、使用方法や有効性にどのような制限が適用されるかを積極的に確認することができます。
</p>
<p>アプリや別のデバイスのサービスは、有効な構成証明キーによって署名された X.509 構成証明書を通じて、キーペアについての情報をリクエストできます。この構成証明キーは、出荷前にデバイスのハードウェアがサポートするキーストアに挿入される ECDSA 署名キーです。したがって、有効な構成証明キーによって署名される構成証明書により、ハードウェアがサポートするキーストアの存在に加えて、そのキーストアのキーペアの詳細が確認できます。
</p>
<p>デバイスが Android の安全な公式ファクトリー イメージを使用していることを確認するために、キーの構成証明では、デバイスの<a class="external-link" href="https://source.android.com/security/verifiedboot/verified-boot.html#bootloader_requirements">ブートローダー</a>が以下の情報を <a class="external-link" href="https://source.android.com/security/trusty/index.html">Trusted Execution EnvironmentTEE</a>に提供することが要求されます。
</p>
<ul>
<li>デバイスにインストールされる OS のバージョンとパッチレベル</li>
<li><a href="https://source.android.com/security/verifiedboot/index.html" class="external-link">セキュアブート</a>の公開キーとロック ステータス</li>
</ul>
<p>ハードウェアがサポートするキーストアの機能の詳細については、<a href="https://source.android.com/security/keystore/" class="external-link">ハードウェアがサポートするキーストア</a>に関するガイドをご覧ください。
</p>
<p>Android N では、キーの構成証明に加えて、指紋にバインドされたキーが導入されています。このキーは、指紋を登録しても無効になることはありません。
</p>
<h2 id="network_security_config">ネットワーク セキュリティ構成</h2>
<p>Android N では、エラーが発生しやすいプログラムによる従来の APIX509TrustManager など)ではなく、宣言型のネットワーク セキュリティ構成を使用することにより、コードを変更することなく、セキュアなHTTPS、TLS接続の動作をアプリで安全にカスタマイズできます。<em></em>
</p>
<p>以下の機能がサポートされます。</p>
<ul>
<li><b>カスタム トラスト アンカー: </b>アプリがセキュアな接続でどの証明機関CAを信頼するかをカスタマイズできます。たとえば、特定の自己署名証明書や制限された一連の公的 CA を信頼できます。
</li>
<li><b>デバッグのみのオーバーライド: </b>アプリのデベロッパーは、インストール ベースに対する追加リスクなしに、アプリのセキュアな接続を安全にデバッグできます。
</li>
<li><b>クリアテキスト トラフィックのオプトアウト: </b>クリアテキスト トラフィックの意図しない使用からアプリを保護できます。
</li>
<li><b>証明書の固定: </b>アプリのセキュアな接続で信頼するサーバーキーを制限できる高度な機能です。
</li>
</ul>
<p>詳細については、<a href="{@docRoot}preview/features/security-config.html">ネットワーク セキュリティ構成</a>をご覧ください。
</p>
<h2 id="default_trusted_ca">デフォルトで信頼される証明機関</h2>
<p>デフォルトでは、Android N をターゲットにしたアプリは、システムが提供する証明書のみを信頼し、ユーザーが追加した証明機関CAを信頼しません。ユーザーが追加した CA を信頼する必要がある Android N 用アプリは、<a href="{@docRoot}preview/features/security-config.html">ネットワーク セキュリティ構成</a>を使用して、ユーザー CA を信頼する方法を指定する必要があります。
</p>
<h2 id="apk_signature_v2">APK 署名スキーム v2</h2>
<p>PackageManager クラスが APK 署名スキーム v2 を使用して、アプリを検証できるようになりました。APK 署名スキーム v2 は、APK ファイルに加えられた無許可の変更を検出することにより、検証速度の大幅な向上と整合性の保証強化を実現するファイル全体の署名スキームです。
</p>
<p>下位互換性を確保するために、v2 署名スキームで署名する前に、v1 署名スキームJAR 署名スキーム)で APK に署名する必要があります。v2 署名スキームでは、v2 スキームで署名した後、追加の証明書で APK に署名すると、検証が失敗します。
</p>
<p>APK 署名スキーム v2 のサポートは、Android N デベロッパー プレビューで間もなく使用できるようになります。
</p>
<h2 id="scoped_directory_access">特定のディレクトリへのアクセス</h2>
<p>Android N では、アプリで新しい API を使用して、SD カードなどのリムーバブル メディア上のディレクトリといった特定の<a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">外部ストレージ</a> ディレクトリへのアクセスをリクエストできるようになりました。この新しい API は、アプリが <code>Pictures</code> ディレクトリなどの標準の外部ストレージ ディレクトリにアクセスする方法を大幅に簡略化します。写真アプリなどのアプリでは、<code>READ_EXTERNAL_STORAGE</code> の代わりに、この API ですべてのストレージ ディレクトリやストレージ アクセス フレームワークにアクセスできます。その結果、ユーザーはそのディレクトリに移動できます。
</p>
<p>また、この新しい API は、ユーザーがアプリに外部ストレージへのアクセスを付与するステップを簡素化します。この新しい API を使用する場合、アプリがどのディレクトリへのアクセス許可を求めているかをわかりやすく説明するシンプルな UI が使用されます。
</p>
<p>詳細については、<a href="{@docRoot}preview/features/scoped-folder-access.html">特定のディレクトリへのアクセス</a>に関するデベロッパー向けドキュメントをご覧ください。
</p>

View File

@@ -0,0 +1,480 @@
page.title=動作の変更点
page.keywords=preview,sdk,compatibility
meta.tags="プレビュー"、"互換性"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-changes_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>本書の内容</h2>
<ol>
<li><a href="#perf">パフォーマンスの向上</a>
<ol>
<li><a href="#doze">Doze</a></li>
<li><a href="#bg-opt">バックグラウンド処理の最適化</a></li>
</ol>
</li>
<li><a href="#perm">パーミッションの変更</a></li>
<li><a href="#accessibility">アクセシビリティの改善</a>
<ol>
<li><a href="#screen-zoom">画面のズーム</a></li>
<li><a href="#vision-settings">セットアップ ウィザードの [Vision Settings]</a></li>
</ol>
</li>
<li><a href="#ndk">プラットフォーム ライブラリにリンクした NDK アプリ</a></li>
<li><a href="#afw">Android for Work</a></li>
</ol>
<h2>関連ドキュメント</h2>
<ol>
<li><a href="{@docRoot}preview/api-overview.html">Android N API の概要</a>
</li>
</ol>
</div>
</div>
<p>
Android N には、新しい機能に加えて、さまざまなシステムおよび API の動作の変更が追加されています。このドキュメントでは、アプリ開発において把握しておくべき主な変更点について説明します。
</p>
<p>
過去に Android にアプリを公開したことがある場合は、アプリが今回のプラットフォームの変更による影響を受ける場合があることに注意してください。
</p>
<h2 id="perf">パフォーマンスの向上</h2>
<p>
Android N では、デバイスのバッテリー寿命、RAM の使用状況、アプリのパフォーマンスを改善するために、システムの動作がいくつか変更されています。これらの変更点は、システム リソースの可用性やアプリへのシステム通知に影響を及ぼす可能性があります。これらの変更点を理解し、変更点に対してアプリを対応させる方法を検討する必要があります。
</p>
<h3 id="doze">Doze</h3>
<p>
Android 6.0API レベル 23で Doze が導入されました。これは、ユーザーがデバイスを電源と接続せずに静止状態にし、画面をオフにすると、CPU とネットワークのアクティビティを保留してバッテリーの寿命を改善するものです。Android N では、Doze が改良されています。デバイスを電源と接続せずに画面をオフにすると、デバイスが静止していなくてもたとえば、ユーザーが携帯端末をポケットに入れて持ち歩いている場合、CPU およびネットワーク制限のサブセットがアプリに適用されます。
</p>
<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" />
<p class="img-caption">
<strong>図 1.</strong> Doze が第 1 レベルのシステム アクティビティ制限を適用して、バッテリーの寿命を改善
</p>
<p>
デバイスがバッテリー電源で動作しているときに画面をしばらくオフにすると、デバイスは Doze モードになります。それによって制限の最初のサブセットが適用され、アプリのネットワーク アクセスが切断されてジョブと同期が保留されます。デバイスが Doze モードに入った後、しばらくの間動かさずに放置していると、残りの Doze 制限が {@link android.os.PowerManager.WakeLock}、
{@link android.app.AlarmManager} アラーム、GPS、Wi-Fi スキャンに適用されます。適用される Doze 制限が一部であるか完全なものであるかには関係なく、デバイスは Doze モードから短時間抜け出し、メンテナンス ウィンドウと呼ばれる状態になります。このとき、アプリはネットワーク アクセスを許可され、保留されたジョブや同期を実行することができます。
</p>
<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
<p class="img-caption">
<strong>図 2.</strong> デバイスがしばらくの間静止状態になると、Doze が第 2 レベルのシステム アクティビティ制限を適用する
</p>
<p>
画面をオンにするか、デバイスを電源に接続すると、Doze モードは解除され、処理の制限は適用されなくなります。<a href="{@docRoot}training/monitoring-device-state/doze-standby.html">Doze と App Standby 用に最適化する</a>で説明したように、今回追加された動作は、Android 6.0API レベル 23で導入された以前のバージョンの Doze にアプリを対応するための推奨事項とベストプラクティスには影響を及ぼしません。Google Cloud MessagingGCMを使用してメッセージを受送信することなどの推奨事項を引き続き順守して、追加の Doze 動作に対応するためにアップデートを計画する必要があります。
</p>
<h3 id="bg-opt">Project Svelte: バックグラウンド処理の最適化</h3>
<p>
Android N では、メモリ使用量と消費電力を最適化するために、3 つの暗黙的なブロードキャストが削除されています。この変更が必要になるのは、暗黙的なブロードキャストが行われると、バックグラウンドでブロードキャストをリッスンするように登録されているアプリが頻繁に起動されるためです。このブロードキャストを削除するとデバイスのパフォーマンスとユーザー エクスペリエンスが大幅に向上します。
</p>
<p>
モバイル端末では、Wi-Fi とモバイルデータの切り替えなど、接続が頻繁に変化します。現在のアプリでは、暗黙的な {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストのレシーバーをマニフェストに登録することにより、接続の変化を監視できるようになっています。多くのアプリがこのブロードキャストを受信する登録を行っているので、1 度ネットワークの切り替えが起こるだけですべてのアプリがアクティブになり、ブロードキャストが同時に処理されます。
</p>
<p>
同様に、暗黙的な {@link
android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストおよび {@link
android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストをカメラなどの他のアプリから受信するよう登録している場合、ユーザーがカメラアプリで写真を撮ると、登録されたアプリがアクティブになり、ブロードキャストの処理が行われます。
</p>
<p>
Android N では、こういった問題を緩和するために、以下の最適化手法が適用されます。
</p>
<ul>
<li>Android N をターゲットにしたアプリは、{@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストを受信しません。これは、アプリにイベントの通知をリクエストするマニフェスト エントリがある場合も同様です。フォアグラウンドで実行されているアプリが {@link
android.content.BroadcastReceiver} で通知をリクエストした場合は、メインスレッドで {@code CONNECTIVITY_CHANGE} を引き続きリッスンできます。
</li>
<li>アプリは、{@link
android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストまたは {@link
android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストを送受信できません。この最適化は、Android N をターゲットにしたアプリだけでなく、すべてのアプリに影響を及ぼします。
</li>
</ul>
<p>
Android の将来のリリースでは、追加の暗黙的なブロードキャストに加えて、バインドされていないバックグラウンド サービスが廃止される可能性があります。このため、マニフェストで宣言されている暗黙的なブロードキャスト用のレシーバーやバックグラウンド サービスとの依存関係は回避または削除する必要があります。
</p>
<p>
Android フレームワークは、これらの暗黙的なブロードキャストやバックグラウンド サービスの必要性を軽減するいくつかのソリューションを提供しています。たとえば、{@link
android.app.job.JobScheduler} API は、従量制ではないネットワークへの接続など、特定の条件が満たされたときに、ネットワーク操作をスケジュールするための堅牢なメカニズムを提供します。また、{@link
android.app.job.JobScheduler} を使用して、コンテンツ プロバイダの変更に対応することもできます。
</p>
<p>
この動作の変更や、アプリで必要となる対応の詳細については、<a href="{@docRoot}preview/features/background-optimization.html">バックグラウンド処理の最適化</a>をご覧ください。
</p>
<h2 id="perm">パーミッションの変更</h2>
<p>
Android N には、ユーザー アカウント パーミッションや外部ストレージに書き込むための新しいパーミッションなど、アプリに影響を及ぼす可能性のあるパーミッションが変更されています。ここでは、今回のプレビューで変更されたパーミションの概要について説明します。
</p>
<ul>
<li>{@code GET_ACCOUNTS}(廃止予定)
<p>
GET_ACCOUNTS パーミッションは廃止予定となりました。システムは、Android N をターゲットにしたアプリでこのパーミションを無視します。
</p>
</li>
</ul>
<h2 id="accessibility">アクセシビリティの改善</h2>
<p>
Android N には、低視力のユーザーまたは視覚障害のあるユーザー向けのプラットフォームのユーザビリティを改善するための変更が追加されています。通常は、これによってアプリのコードを変更する必要はありませんが、この機能について理解し、アプリをテストして、ユーザー エクスペリエンスに与える潜在的な影響を評価する必要があります。
</p>
<h3 id="screen-zoom">画面のズーム</h3>
<p>
Android N では、<strong>ディスプレイ サイズ</strong>を設定して、画面上のすべての要素を拡大または縮小することができるので、低視力のユーザーに対するデバイスのアクセシビリティが向上しています。ユーザーは、一般的な中くらいのサイズの携帯端末 Nexus 4 の幅である <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">sw320dp</a> の画面最小幅を超えて画面をズームできません。
</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>図 3.</strong> 右側の画面では、Android N システム イメージを実行しているデバイスのディスプレイ サイズを拡大している
</p>
<p>
デバイスの画面密度が変更されると、以下の方法で実行中のアプリに通知されます。
</p>
<ul>
<li>アプリが API レベル 23 以前のデバイスをターゲットにしている場合は、すべてのバックグラウンド処理が自動的に強制終了します。つまり、ユーザーがそのようなアプリから移動して [Settings] 画面を開き、<strong>ディスプレイ サイズ</strong>の設定を変更すると、メモリ不足の場合と同じように、アプリが強制終了します。アプリに何らかのフォアグラウンド処理がある場合は、<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>に記載されている構成変更の処理が通知されます。これは、デバイスの画面の向きが変わったときの処理と同様です。<em></em>
</li>
<li>アプリが Android N をターゲットにしている場合、<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>に記載されているように、すべての処理(フォアグラウンド処理およびバックグラウンド処理)に対して構成変更が通知されます。
</li>
</ul>
<p>
Android のベストプラクティスに従っているほとんどのアプリでは、この機能をサポートするための変更を加える必要はありませんが、以下の点は確認する必要があります。
</p>
<ul>
<li>画面幅 <code><a href=
"{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code> のデバイスでアプリをテストして、適切に機能することを確認します。
</li>
<li>デバイスの構成が変更された場合、キャッシュ済みのビットマップやネットワークからロードされるリソースなど、画面密度に依存するキャッシュ情報をアップデートしてください。また、アプリが一時停止状態から再開された場合は、構成変更をチェックしてください。
<p class="note">
<strong>注:</strong> 構成に依存したデータをキャッシュする場合は、そのデータ用の適切な画面サイズやピクセル密度など、関連するメタデータを含めることをお勧めします。このメタデータを保存しておくと、構成を変更した後、キャッシュ データを更新する必要があるかどうかを決定できます。
</p>
</li>
<li>ピクセル単位は画面密度に対応しないため、ピクセル単位で寸法を指定することは避けてください。その代わり、<a href="{@docRoot}guide/practices/screens_support.html">密度非依存ピクセル</a><code>dp</code>)単位で寸法を指定します。
</li>
</ul>
<h3 id="vision-settings">セットアップ ウィザードの [Vision Settings]</h3>
<p>
Android N には、オープニング画面に [Vision Settings] が追加されています。ユーザーは [Vision Settings] を使用して、新しいデバイスで<strong>ズーム操作</strong>、<strong>フォントサイズ</strong>、<strong>ディスプレイ サイズ</strong>、<strong>TalkBack</strong> などのアクセシビリティ機能を設定できます。この変更により、さまざまな画面設定に関連するバグが顕在化する可能性があります。この機能が及ぼす影響を評価するには、これらの設定を有効にしてアプリをテストする必要があります。設定は、<strong>[Settings] &gt; [Accessibility]</strong> にあります。
</p>
<h2 id="ndk">プラットフォーム ライブラリにリンクした NDK アプリ</h2>
<p>
Android N では、非パブリック API のロードを防止するために、名前空間が変更されています。NDK を使用する場合、Android プラットフォームのパブリック API のみを使用する必要があります。Android の次の公式リリースで非パブリック API を使用すると、アプリがクラッシュする可能性があります。
</p>
<p>
非パブリック API を使用していることをデベロッパーに警告するため、Android N で実行されているアプリが非パブリック API を呼び出すと、logcat にエラーが出力されます。この状態を認識してもらえるよう、エラー メッセージはデバイスの画面にも表示されます。アプリのコードを確認して、非パブリック API を削除し、プレビュー デバイスまたはエミュレータを使用して、アプリを十分にテストしてください。
</p>
<p>
アプリがプラットフォーム ライブラリに依存している場合は、NDK ドキュメントにある一般的な修正例を参照して、共通のプライベート API をそれと同等な機能を持つパブリック API に置き換えます。特に、プラットフォームに含まれていて NDK には含まれていないライブラリ(<code>libpng</code> など)をアプリで使用している場合、気付かないうちにプラットフォーム ライブラリにリンクしていることがあります。この場合、APK にリンク対象のすべての .so ファイルが含まれていることを確認します。
</p>
<p class="caution">
<strong>警告:</strong> サードパーティのライブラリの中には非パブリック API にリンクしているものもあります。アプリがこれらのライブラリを使用している場合、Android の次の公式リリースでアプリを実行すると、アプリがクラッシュする可能性があります。
</p>
<p>
NDK に含まれていないネイティブ ライブラリは Android のリリース版が変わると変更または削除される場合があるため、アプリでは、こういったライブラリへの依存やその使用を避けてください。OpenSSL から BoringSSL への移行は、そのような変更の一例です。また、NDK に含まれていないプラットフォーム ライブラリには互換性要件がないため、デバイスによって互換性レベルが異なる場合があります。古いバージョンで非 NDK ライブラリにアクセスする必要がある場合は、Android API レベルを判定してからロードしてください。
</p>
<p>
こうしたタイプの問題の診断を支援するために、Android N でアプリをビルドするときに発生する可能性のある Java および NDK のエラーの例を以下に示します。
</p>
<p>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>NDK のエラー例</p>
<pre class="no-pretty-print">
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
</pre>
<p>
こうしたタイプのエラーが発生しているアプリの典型的な修正例を以下に示します。
</p>
<ul>
<li>libandroid_runtime.so の getJavaVM と getJNIEnv を使用している場合は、標準の 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>{@code libcutils.so} の {@code property_get} シンボルを使用している場合は、公開されている {@code __system_property_get} に置き換えることができます。これを行うには、次の include 文とともに {@code __system_property_get} を使用します。
<pre>
#include &lt;sys/system_properties.h&gt;
</pre>
</li>
<li>{@code libcrypto.so} の {@code SSL_ctrl} シンボルを使用している場合は、アプリ内のローカルなバージョンに置き換える必要があります。たとえば、{@code .so} ファイルを
{@code libcyrpto.a} に静的にリンクするか、BoringSSL や OpenSSL の動的ライブラリ {@code libcrypto.so} をアプリに含める必要があります。
</li>
</ul>
<h2 id="afw">Android for Work</h2>
<p>
Android N には、証明書のインストール、パスワードのリセット、セカンダリ ユーザーの管理、デバイス識別子へのアクセスなど、Android for Work をターゲットにしたアプリに対する変更が含まれています。Android for Work 環境向けのアプリを構築している場合、これらの変更点を確認し、変更に応じてアプリを修正する必要があります。
</p>
<ul>
<li>デバイス ポリシー コントローラDPCが代理証明書の設定を行う前に、代理証明書のインストーラーをインストールする必要があります。また、プロファイルと N SDK をターゲットにしたデバイスオーナー アプリが代理証明書のインストーラーを使用できるよう、DPC が <code>DevicePolicyManager.setCertInstallerPackage()</code> を呼び出す前にインストーラーをインストールする必要があります。インストールされていない場合、システムは <code>IllegalArgumentException</code> をスローします。
</li>
<li>デバイス管理者向けのパスワードのリセット制限がプロファイル オーナーに適用されます。デバイスの管理者は、<code>DevicePolicyManager.resetPassword()</code> を使用して、既に設定されているパスワードを削除または変更できなくなりました。デバイスの管理者は、デバイスにパスワード、PIN、またはパターンが設定されていない場合のみ、パスワードを設定できます。
</li>
<li>デバイスとプロファイルのオーナーは、制限が設定されている場合でもアカウントを管理することができます。デバイス オーナーとプロファイル オーナーは、<code>DISALLOW_MODIFY_ACCOUNTS</code> ユーザー制限が適用されている場合でもアカウント管理 API を呼び出すことができます。
</li>
<li>デバイス オーナーによるセカンダリ ユーザーの管理がさらに簡単になりました。デバイスがデバイス オーナー モードで実行されている場合は、<code>DISALLOW_ADD_USER</code> 制限が自動的に設定されます。これにより、管理されていないセカンダリ ユーザーが作成されることを防ぐことができます。また、<code>CreateUser()</code> メソッドと <code>createAndInitial()</code> メソッドは廃止され、新しい <code>DevicePolicyManager.createAndManageUser()</code> メソッドに置き換えられました。
</li>
<li>デバイス オーナーは、デバイス識別子にアクセスできます。また、<code>DevicePolicyManagewr.getWifiMacAddress()</code> を使用して、デバイスの Wi-Fi MAC アドレスにもアクセスできます。デバイスで Wi-Fi が有効にされたことがない場合、このメソッドは {@code null} 値を返します。
</li>
</ul>
<p>
Android N の Android for Work の変更に関する詳細については、<a href="{@docRoot}preview/features/afw.html">Android for Work のアップデート</a>をご覧ください。
</p>
<h2 id="other">その他の重要事項</h2>
<ul>
<li>Android N 上で低い API レベルをターゲットにしたアプリが実行されている場合、ユーザーがディスプレイ サイズを変更すると、アプリのプロセスは強制終了されます。アプリは、このシナリオを適切に処理する必要があります。適切に処理しないと、ユーザーが [Recents] からアプリを復元したときに、アプリがクラッシュします。
<p>
アプリをテストして、この動作が発生しないようにしてください。DDMS でアプリを手動で強制終了させて同様のクラッシュを発生させることにより、アプリのテストを行なうことができます。
</p>
<p>
N 以上をターゲットにしたアプリは、画面密度の変更時に自動的に強制終了しませんが、構成変更への対応が不十分なままである可能性があります。
</p>
</li>
<li>
Android N 上のアプリは構成変更を適切に処理し、次回の起動時にクラッシュしないようにする必要があります。フォントのサイズを変更([<strong>Setting</strong>] &gt; [<strong>Display</strong>] &gt; [<strong>Font size</strong>])した後に [Recents] からアプリを復元すると、アプリの動作を確認できます。
</li>
</ul>

View File

@@ -0,0 +1,541 @@
page.title=デバイス上でテストする
meta.tags="プレビュー", "nexus","システム イメージ"
page.tags="preview", "androidn"
page.image=images/cards/card-n-downloads_2x.png
@jd:body
<div style="position:relative; min-height:600px">
<div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
<p class="sdk-terms-intro">Android Preview SDK のコンポーネントをダウンロード、インストールする前に、次の利用規約に同意する必要があります。
</p>
<h2 class="norule">利用規約</h2>
<div class="sdk-terms" onfocus="this.blur()" style="width:678px">
以下は、Android SDK Preview の使用許諾契約です(以下「本契約」)。
1. はじめに
1.1 Android SDK Preview以下、本契約で「Preview」という。具体的には利用可能な場合には Android システム ファイル、パッケージ型 API、Preview ライブラリ ファイルを含む)は、本契約の規定に従ってライセンス許可されます。本契約では、デベロッパーの Preview の使用に関して、デベロッパーと Google の間で法的拘束力のある契約を結びます。
1.2 「Android」とは、Android オープン ソース プロジェクトhttp://source.android.com/ にて随時更新)にて利用可能な、端末向けの Android ソフトウェア スタックを意味します。
1.3 「Android 互換」とは、iAndroid 互換ウェブサイトhttp://source.android.com/compatibilityに掲載されており、随時アップデートされる可能性がある Android Compatibility Definition ドキュメントに準拠し、かつiiAndroid Compatibility Test SuiteCTSに合格した任意の Android 実装を指します。
1.4 「Google」とは、1600 Amphitheatre Parkway, Mountain View, CA 94043, United States に主たる事業所を有するデラウェア州法人である Google Inc. を意味します。
2. 本契約の同意
2.1 Preview を使用するには、まず本契約に同意する必要があります。本契約に同意しない場合は Preview を使用できません。
2.2 同意するかまたは Preview を使用するためにクリックすると、本契約に同意したことになります。
2.3 米国またはその他の国(デベロッパーが居住している国かまたはデベロッパーが Preview を使用する国を含む)の法律により Preview の使用を禁止されている人である場合、Preview を使用することも、使用許諾契約に同意することもできません。
2.4 雇用主またはその他の事業体を代表または代理して本契約に拘束されることに同意し Preview を企業または組織の内部で使用する場合、担当者の雇用主またはその他の事業体を本契約に法的に拘束する完全な法的権限を有していることを表明および保証するものとします。担当者が必要な権限を有していない場合は、担当者の雇用主またはその他の事業体を代表または代理して、本契約に同意することも、Preview を使用することもできません。
3. Google からの Preview ライセンス
3.1 本契約の規定に従い、Google は Android 実装と互換性のあるアプリケーションの開発に Preview を使用するための、限定的で、世界規模の、ロイヤリティ フリーな、譲渡不可、非排他的、サブライセンス不可なライセンスを付与するものとします。
3.2 本 Preview は、別のプラットフォームAndroid 実装と互換性のないものも含む)のアプリケーションの開発や別の SDK の開発には使用できません。本 Preview をその目的で使用しない場合は、Android 実装と互換性のないものを含め、自由に別のプラットフォームのアプリケーションの開発を行うことができます。
3.3 Preview に関するすべての法的権利、所有権、利益Preview に含まれる知的財産権を含む)は Google またはサードパーティが所有するものとします。「知的財産権」とは、特許法、著作権法、営業秘密法、商標法、不当競争防止法に基づいて発生するすべての権利、およびその他のすべての所有権を意味します。デベロッパーに明示的に付与されていない権利は、すべて Google が所有します。
3.4 本契約で明示的に許可されている目的以外においては、Preview を使用できません。当該のサードパーティのライセンスで必要とされる場合を除き、デベロッパーは、aPreview または Preview の一部をコピー(バックアップ目的を除く)、修正、改造、再配布、逆コンパイル、リバース エンジニアリング、逆アセンブルまたは派生物の作成、またはbモバイル ハンドセットまたは個人用 PC 以外のハードウェア端末への Preview の読み込み、Preview と他のソフトウェアとの結合、または Preview の一部を組み込んだソフトウェアや端末の配布はできません。
3.5 オープンソース ソフトウェア ライセンス下でライセンス付与された Preview のコンポーネントの使用、複製、配布は、本契約ではなく、そのオープンソース ソフトウェアのライセンスに準拠するものとします。デベロッパーは、許諾されるすべての権利下で、そのようなオープンソース ソフトウェア ライセンスに対して、優良ライセンシーのままでいることに同意し、そのような権利を終了、停止、または違反する可能性のあるいかなる行為も差し控えることに同意するものとします。
3.6 デベロッパーは、Google が提供する Preview の形式および性質は事前の通知なしに変更される場合があり、今後リリースされる Preview のバージョンでは、以前のバージョンの Preview で開発されたアプリケーションとの互換性がない可能性があることに同意します。デベロッパーは、Google が事前の通知なく、Google の単独の裁量でデベロッパーまたはユーザーへの Previewまたは Preview 内の一部の機能)の提供を(恒久的または一時的に)停止する場合があることに同意します。
3.7 本契約のいかなる部分も、Google のいかなる商標名、商標、サービスマーク、ロゴ、ドメイン名、またはその他のブランド識別表示を使用する権利もデベロッパーに付与するものではありません。
3.8 デベロッパーは、Preview に添付または収録されているすべての知的財産権に関する通知(著作権および商標の通知を含む)の削除、隠ぺい、改ざんを行わないことに同意します。
4. デベロッパーによる Preview の使用
4.1 Google は、本契約に基づき Preview を使用してデベロッパーが開発したソフトウェア アプリケーションに関して、デベロッパー(またはデベロッパーのライセンサー)からいかなる権利、所有権、または利益(当該アプリケーションに含まれる知的財産権を含む)も取得するものではないことに同意します。
4.2 デベロッパーは、Preview をa本契約、およびb該当する司法管轄区における適用される法律、規則、または一般に認められた慣行またはガイドライン米国またはその他の該当国におけるデータまたはソフトウェアの輸出入に関する法律を含むで認められている目的にのみ使用することに同意します。
4.3 Preview を使用してアプリケーションを開発する場合、デベロッパーはユーザーのプライバシーおよび法的権利を保護することに同意します。ユーザーからデベロッパーにユーザー名、パスワード、またはその他のログイン情報または個人情報が提供される場合、デベロッパーは、情報がデベロッパーのアプリケーションに提供されることをユーザーに認識させ、当該ユーザーについてプライバシーに関する法的に十分な通知および保護を行わなければなりません。デベロッパーのアプリケーションに個人情報または秘密情報が保存される場合、この保存は保護された方法で行われなければなりません。ユーザーからデベロッパーのアプリケーションに Google アカウントの情報が提供された場合、デベロッパーのアプリケーションでは、ユーザーが許可したタイミングで、かつユーザーが許可した限定された目的にのみ、当該情報を使用してユーザーの Google アカウントにアクセスすることが認められるものとします。
4.4 デベロッパーは、Preview に関して、第三者Google、およびあらゆる携帯電話会社を含むが、これらに限定されないのサーバー、ネットワーク、またはその他の財産またはサービスへの妨害、中断、損害、または許可されていない態様でのアクセスとなる行為そのような行為に該当する対象製品の開発または販売 / 配布を含む)に関与しないことに同意します。
4.5 デベロッパーは、デベロッパーが Android および Android のアプリケーションを介して作成、送信、表示するデータ、コンテンツ、リソース、および自身の行為の結果Google に発生する可能性のあるあらゆる損失および損害を含む)について、自身が単独で責任を負うこと(および Google がこれについてデベロッパーまたはいかなる第三者に対しても一切責任を負わないこと)に同意します。
4.6 デベロッパーは、本契約、適用される第三者の契約もしくは利用規約、または適用される法律もしくは規則に基づく自身の義務に違反したこと、および当該違反の結果Google または第三者に発生したあらゆる損失および損害を含む)について、自身が単独で責任を負うこと(および Google がこれについてデベロッパーまたはいかなる第三者に対しても一切責任を負わないこと)に同意します。
4.7 Preview は開発中であり、デベロッパーによるテスティングやフィードバックは開発プロセスの重要な一部となります。デベロッパーは、Preview の使用により、一部の機能の実装が開発中であると認識し、Preview が安定したリリースの完全な機能性を持つことに依存すべきでないことを認識するものとします。本 Preview は、公式の Android SDK のリリース後はサポート対象でなくなるため、デベロッパーは、Preview を使用するいかなるアプリケーションも公然と配布または引き渡さないことに同意するものとします。
5. デベロッパーの資格情報
5.1 デベロッパーは、Google が発行した、またはデベロッパー自身で選択した、自身のデベロッパー用資格情報の秘密を保持する責任を負うこと、および自身のデベロッパー用資格情報のもとで開発されたすべてのアプリケーションについて単独で責任を負うことに同意します。
6. プライバシーおよび情報
6.1 Google は、Preview の継続的な技術革新と改良のために、ソフトウェアから特定の使用状況統計情報(一意識別子、関連する IP アドレス、ソフトウェアのバージョン番号、Preview のどのツール/サービスがどのように使用されているかに関する情報を含むが、これらに限定されないを収集できます。この情報が収集される前に、Preview に通知が表示され、デベロッパーの同意が求められます。デベロッパーが同意しない場合は、情報は収集されません。
6.2 収集されるデータは、Preview の改良のために集約された形で精査され、Google のプライバシー ポリシーhttp://www.google.com/policies/privacy/)に従って管理されます。
7. 第三者のアプリケーション
7.1 デベロッパーが、Preview を使用して第三者が開発したアプリケーションを実行する、あるいは第三者から提供されたデータ、コンテンツ、リソースにアクセスする場合、デベロッパーは、Google がそれらのアプリケーション、データ、コンテンツ、リソースについて責任を負わないことに同意します。デベロッパーは、そのような第三者のアプリケーションを介してアクセスするすべてのデータ、コンテンツ、リソースについては、それらを生成した者が単独で責任を負うものであり、Google はそれらの第三者のアプリケーション、データ、コンテンツ、またはリソースの使用もしくはアクセスによって生じたあらゆる損失および損害について一切責任を負わないことを理解します。
7.2 デベロッパーは、そのような第三者のアプリケーションを介して表示されるデータ、コンテンツ、リソースは、提供者(あるいは代理の第三者または事業体)が所有する知的財産権で保護されている場合があることを認識するものとします。デベロッパーは、当該所有者からの明確な許可がない限り、それらのデータ、コンテンツ、リソース(全体または一部)の変更、貸与、賃貸、担保、配布または派生物の作成を行うことはできません。
7.3 デベロッパーは、そのような第三者のアプリケーション、データ、コンテンツまたはリソースの使用が、デベロッパーと当該第三者間の別の規約に従うものであることを認識するものとします。
8. Google API の使用
8.1 Google API
8.1.1 API を使用して Google からデータを取得する場合、デベロッパーは、そのデータは、Google またはデータを提供する事業体(あるいは代理の第三者または事業体)が所有する知的財産権で保護されている場合があることを認識するものとします。そのような API の使用は追加の利用規約に従うものとします。デベロッパーは、当該の利用規約による許可がない限り、そのデータ(全体または一部)の変更、貸与、賃貸、担保、配布または派生物の作成を行うことはできません。
8.1.2 デベロッパーは、API を使用して Google からユーザーのデータを取得する場合、ユーザーが明示的に同意した場合のみ、およびユーザーが許可したタイミングとその目的にのみ、データを取得できることを理解し、同意します。
9. 本契約の終了
9.1 本契約は、下記の規定に従ってデベロッパーまたは Google のいずれかによって解約されるまで、継続して適用されるものとします。
9.2 デベロッパーが本契約の解約を希望する場合は、Preview および関連するデベロッパー資格情報の使用を停止することで、契約を終了するものとします。
9.3 Google は、理由の有無にかかわらず、書面で通知することでいつでもデベロッパーとの本契約を解約することができます。
9.4 本契約は事前の通知またはその他の措置なく、次のうち早い方に自動的に終了します。
AGoogle が、デベロッパーが居住している国またはデベロッパーがサービスを使用する国での Preview または Preview の一部の配布を停止したとき。
BGoogle が Android SDK の最終バージョンをリリースしたとき。
9.5 本契約が終了すると、本契約で付与されていたライセンスは終了し、デベロッパーは速やかに Preview のすべての使用を停止するものとし、第 10 条、第 11 条、第 12 条、第 14 条の規定は無期限に効力を有するものとします。
10. 免責事項
10.1 デベロッパーは、デベロッパーによる Preview の使用はデベロッパー自身の責任において行うものであること、および Preview は「現状有姿」かつ「提供可能な限りにおいて」、Google からのいかなる種類の保証もなく提供されるものであることを明示的に理解し、これに同意します。
10.2 デベロッパーによる Preview および Preview の使用を通じてダウンロードまたはその他の方法で取得されたマテリアルの使用は、デベロッパー自身の裁量および責任において行うものであり、当該使用の結果として生じるデベロッパーのコンピュータ システムもしくはその他の端末への損害またはデータの喪失についての責任はデベロッパーが単独で負います。前述を制限することなく、Preview は安定したリリースではなく、コンピュータやその他の端末の利用の完全な回復不可能な損失を含む、重大な損害を引き起こす可能性のあるエラー、欠陥、およびセキュリティ上の脆弱性が含まれている可能性があることを理解します。
10.3 Google はまた、商品性、特定目的への適合性、および権利侵害がないことの黙示的な保証および条件を含む(ただしこれらに限定されない)、明示的か黙示的かを問わずあらゆる種類のすべての保証および条件を明示的に否定します。
11. 責任の制限
11.1 デベロッパーは、Google、その子会社および関連会社、ならびにそのライセンサーが、デベロッパーに発生した直接損害、間接損害、偶発的損害、特別損害、結果的損害、または懲罰的損害データの喪失を含むについて、Google またはその代表者が当該損失が発生する可能性について告知されていたかどうか、または知っていたはずであるかどうかにかかわらず、いかなる責任法理のもとでもデベロッパーに対して責任を負わないことを明示的に理解し、これに同意します。
12. 補償
12.1 法律で認められる最大限の範囲内において、デベロッパーは、aデベロッパーが Preview を使用したこと、およびbデベロッパーが Preview で開発したアプリケーションが他者のいかなる知的財産権を侵害していること、または他者の名誉を毀損している、もしくは他者のパブリシティ権もしくはプライバシー権を侵害していること、およびcデベロッパーが本契約に違反したことから発生したあらゆる申し立て、普通法上の訴訟、衡平法上の訴訟、または法的手続き、ならびにあらゆる損失、責任、損害、費用、および経費合理的な弁護士報酬を含むについて、Google、その関連会社、ならびに当該各社の取締役、役員、従業員、代理人を防御し、補償し、免責することに同意します。
13. 契約の変更
13.1 Google は、Preview の新しいバージョンを配布することにより、いつでも本契約を変更することができます。変更が生じた場合、Google は、Preview の提供ウェブサイト上に使用許諾契約の改訂版を公開します。
14. 法的一般条項
14.1 本契約は、デベロッパーと Google の間の法的な合意のすべてを表し、デベロッパーによる Preview の使用(別の契約下で Google が提供するサービスを除くに適用され、Preview に関するデベロッパーと Google の間のあらゆる事前の合意に完全に取って代わるものです。
14.2 デベロッパーは、Google が本契約に定める(または適用される法律のもとで Google が享受できる法的な権利または救済措置を行使または執行しなかった場合でも、Google の権利が正式に放棄されたとはみなされないこと、および Google が以後も引き続き当該権利および救済措置を行使または執行できることに同意します。
14.3 本件について判断を下す管轄権を有する司法裁判所によって、本契約のいずれかの条項が無効と判断された場合、当該条項は、本契約の残りの部分に影響を与えることなく本契約から削除されるものとします。本契約の残りの条項は、以後も引き続き有効かつ執行可能であるものとします。
14.4 デベロッパーは、Google が親会社となっている各グループ企業が、本契約の第三受益者となること、および当該企業が、当該企業に利益(または受益権)を付与する本契約の条項を直接執行する、また当該条項に依拠する権利を有することを了承し、これに同意します。上記以外のいかなる人または法人も、本契約の第三受益者とはならないものとします。
14.5 輸出規制。Preview は、米国輸出管理法令の対象です。デベロッパーは、Preview に適用されるすべての国内および国際の輸出管理法令に従わなければなりません。これらの法律には、仕向け地、ユーザー、および最終用途に関する制限が含まれます。
14.6 デベロッパーは、Google から事前に書面で承認を得ずに、本契約を譲渡または移転することはできません。また、そのような承認を得ずに計画された譲渡はすべて無効になります。デベロッパーは、Google から事前に書面で承認を得ずに、本契約に基づく自身の責任または義務を他者に委任してはなりません。
14.7 本契約あるいは本契約に基づくデベロッパーと Google の関係から発生または関連するすべての申し立ては、米国カリフォルニア州の抵触法を除いて、カリフォルニア州法に準拠するものとします。デベロッパーおよび Google は、本契約あるいは本契約に基づくデベロッパーと Google の関係から発生または関連する法的事項の解決について、米国カリフォルニア州サンタクララ郡に所在の連邦裁判所または州立裁判所が専属管轄権を有することに合意します。上記にかかわらず、デベロッパーは、Google が任意の司法管轄区において差し止め命令による救済(または同等の緊急法的救済)を求める申し立てを行うことが認められることに同意します。
</div><!-- sdk terms -->
<div id="sdk-terms-form">
<p>
<input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
<label id="agreeLabel" for="agree">上記の利用規約を読み、同意します。</label>
</p>
<p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
</div>
</div><!-- end TOS -->
<div id="landing">
<div id="qv-wrapper">
<div id="qv">
<h2>本書の内容</h2>
<ol>
<li><a href="#device-preview">ハードウェア デバイスをセットアップする</a>
<ol>
<li><a href="#ota">OTA アップデートを取得する</a></li>
<li><a href="#flash">手動でデバイスへの書き込みを行う</a></li>
<li><a href="#revertDevice">アンインストールする</a></li>
</ol>
</li>
<li><a href="#setupAVD">エミュレータをセットアップする</a></li>
</ol>
</div>
</div>
<p>
新しいプラットフォーム上でアプリを実行してテストするには、以下のいずれかの方法で Android N のランタイム環境をセットアップする必要があります。
</p>
<ul>
<li>Android N をサポート対象のハードウェア デバイスにインストールする。</li>
<li>Android N が動作する Android エミュレータをセットアップする。</li>
</ul>
<p>
既存の APK とハードウェア デバイスまたはエミュレータがあれば、新しいプラットフォーム上でアプリの基本的な互換性テストを実施できます。基本的なテストのために開発環境全体をアップデートする必要はありません。
</p>
<p>
アプリを Android N 向けに修正したり、Android N の API を使用したりする場合は、Android N 用にアップデートされた開発環境をセットアップする必要があります。詳細は <a href="{@docRoot}preview/setup-sdk.html">Android N 向けの開発準備をする</a>の説明をご覧ください。
</p>
<h2 id="device-preview">ハードウェア デバイスをセットアップする</h2>
<p>
N Developer Preview は、携帯端末やタブレット、テレビなど、アプリのテストに使用するさまざまなハードウェア デバイスのシステム アップデートに対応しています。
</p>
<p>
対象機種をお持ちの場合は、以下のいずれかの方法で Developer Preview マイルストーン ビルドにアップデートできます。
</p>
<ul>
<li><a href="https://g.co/androidbeta">Android ベータ版プログラム</a>の<strong>自動 OTA システム アップデートにデバイスを登録します</strong>。登録したデバイスは、N Developer Preview のマイルストーン ビルドごとに、定期的に無線OTAアップデートを受信できます。既存の環境から N Developer Preview のさまざまなリリースへシームレスに移行できるため、このベータ版プログラムに登録することをお勧めします。
</li>
<li><strong>Developer Preview のシステム イメージをダウンロードして、デバイスに書き込みます</strong>。手動で書き込みをしたデバイスには、OTA アップデートが自動で配信されません。ただし、デバイスを Android ベータ版プログラムに登録すれば、OTA アップデートを取得できるようになります。
</li>
</ul>
<h3 id="ota">自動 OTA アップデートを受信するためにデバイスを登録する</h3>
<p>
対象機種(以下のダウンロードの表をご覧ください)をお持ちの場合は、<a href="https://g.co/androidbeta">Android ベータ版プログラム</a>にデバイスを登録すると、Android のプレビュー版への OTA アップデートを受信できます。正式なシステム アップデートと同様に、OTA アップデートのダウンロードやデバイスの更新は自動で行われます。
</p>
<p>
デバイスの登録解除はいつでもできます。登録を解除すると、そのデバイスで利用可能な Android の最新の実稼働向けバージョンAndroid 6.0 Marshmallow など)への OTA アップデートがデバイスに配信されます。アップデート時はオールリセットされ、デバイス上のユーザーデータは削除されます。デバイスの登録解除前には、<strong>重要なデータをバックアップ</strong>しておいてください。
</p>
<p>
詳細情報やデバイスの登録方法については、<a href="https://g.co/androidbeta">Android ベータ版プログラム</a>のウェブサイトをご覧ください。
</p>
<p class="note"><strong>注:</strong> 登録を解除するとデバイスはオールリセットされるので、重要なデータはあらかじめバックアップしておいてください。
</p>
<h3 id="flash">手動でデバイスへの書き込みを行う</h3>
<p>
最新の Developer Preview のシステム イメージはいつでもダウンロードして、手動でデバイスに書き込むことができます。テスト端末用のシステム イメージは、以下の表からダウンロード可能です。テスト環境を詳細に管理したり、自動テストなどで頻繁に再インストールが必要な場合は、このように手動でデバイスに書き込みをする方法が便利です。
</p>
<!-- You can flash by ota or system image --><p>
デバイスにシステム イメージをインストールすると、<strong>端末からすべてのデータが削除</strong>されるため、あらかじめデータをバックアップしておいてください。
</p>
<p>
デバイス上のデータをバックアップして、ご自身のデバイス用のシステム イメージを以下からダウンロードした後、<a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a> の手順に従ってデバイスにイメージを書き込みます。
</p>
<p>
手動でシステム イメージを書き込んだデバイスには、以降の Developer Preview マイルストーン ビルドへの <strong>OTA アップデートが自動配信されません</strong>。そのため Developer Preview マイルストーンごとに環境を最新にして、新しいシステムイメージを書き込む必要があります。
</p>
<p>
手動でデバイスに書き込みを行った後でも、<a href="https://g.co/androidbeta">Android ベータ版プログラム</a>にデバイスを登録すれば OTA アップデートを受信できるようになります。次のプレビュー版への OTA アップデートを受信したい方は、いつでもデバイス登録が可能です。
</p>
<table>
<tr>
<th scope="col">デバイス</th>
<th scope="col">ダウンロード / チェックサム</th>
</tr>
<tr id="bullhead">
<td>Nexus 5X <br>"bullhead"</td>
<td><a href="#top" onclick="onDownload(this)">bullhead-npc56p-preview-6c877a3d.tgz</a><br>
MD5:b5cf874021023b398f5b983b24913f5d<br>
SHA-1:6c877a3d9fae7ec8a1678448e325b77b7a7b143a
</td>
</tr>
<tr id="shamu">
<td>Nexus 6 <br>"shamu"</td>
<td><a href="#top" onclick="onDownload(this)">shamu-npc56p-preview-54b13c67.tgz</a><br>
MD5:af183638cf34e0eb944a1957d7696f60<br>
SHA-1:54b13c6703d369cc79a8fd8728fe4103c6343973
</td>
</tr>
<tr id="angler">
<td>Nexus 6P <br>"angler"</td>
<td><a href="#top" onclick="onDownload(this)">angler-npc56p-preview-85ffc1b1.tgz</a><br>
MD5:bc4934ea7bd325753eee1606d3725a24<br>
SHA-1:85ffc1b1be402b1b96f9ba10929e86bba6c6c588
</td>
</tr>
<tr id="volantis">
<td>Nexus 9 <br>"volantis"</td>
<td><a href="#top" onclick="onDownload(this)">volantis-npc56p-preview-0e8ec8ef.tgz</a><br>
MD5:c901334c6158351e945f188167ae56f4<br>
SHA-1:0e8ec8ef98c7a8d4f58d15f90afc5176303efca4
</td>
</tr>
<tr id="volantisg">
<td>Nexus 9G <br>"volantisg"</td>
<td><a href="#top" onclick="onDownload(this)">volantisg-npc56p-preview-1bafdbfb.tgz</a><br>
MD5:7bb95bebc478d7257cccb4652899d1b4<br>
SHA-1:1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6
</td>
</tr>
<tr id="fugu">
<td>Nexus Player <br>"fugu"</td>
<td><a href="#top" onclick="onDownload(this)">fugu-npc56r-preview-7027d5b6.tgz</a><br>
MD5:f5d3d8f75836ccfe4c70e8162e498be4<br>
SHA-1:7027d5b662bceda4c80a91a0a14ef0e5a7ba795b
</td>
</tr>
<tr id="ryu">
<td>Pixel C <br>"ryu"</td>
<td><a href="#top" onclick="onDownload(this)">ryu-npc56p-preview-335a86a4.tgz</a><br>
MD5:4e21fb183bbbf467bee91598d587fd2e<br>
SHA-1:335a86a435ee51f18464de343ad2e071c38f0e92
</td>
</tr>
<tr id="seed">
<td>General Mobile 4GAndroidOne <br>"seed"</td>
<td><a href="#top" onclick="onDownload(this)">seed_l8150-npc56p-preview-82472ebc.tgz</a><br>
MD5:983e083bc7cd0c4a2d39d6ebaa20202a<br>
SHA-1:82472ebc9a6054a103f53cb400a1351913c95127
</td>
</tr>
</table>
<h3 id="revertDevice">プレビュー版をデバイスからアンインストールする</h3>
<p>
以下のいずれかの方法で、プレビュー版をデバイスからアンインストールできます。
</p>
<ul>
<li><strong>工場出荷時仕様のシステム イメージを取得</strong>して、手動でデバイスに書き込みます。
<ul>
<li><strong>Nexus 端末と Pixel C 端末</strong>については <a href="http://developers.google.com/android/nexus/images">Nexus 端末のファクトリー イメージ</a>のページを参照してダウンロードしてください。
</li>
<li><strong>その他の端末</strong>については、直接デバイス メーカーにお問い合わせください。Android ベータ版プログラムの対象機種については、デバイスをプログラムに登録した後、登録を解除することができます(詳細は以下をご覧ください)。
</li>
</ul>
</li>
<li><strong>Android ベータ版プログラムへのデバイス登録を解除</strong>します。<a href="https://g.co/androidbeta">Android ベータ版プログラム</a>に登録中のデバイスは、その種類のよらず、簡単に登録を解除することができます。
<p>
登録を解除すると、そのデバイスで利用可能な Android の最新の実稼働向けバージョンAndroid 6.0 Marshmallow など)への OTA アップデートがデバイスに配信されます。アップデート時はオールリセットされ、デバイス上のユーザーデータは削除されます。デバイスの登録解除前には、<strong>重要なデータをバックアップ</strong>しておいてください。
</p>
</li>
</ul>
<p class="note"><strong>注:</strong> プログラムの終了前に Developer Preview のシステム イメージをアンインストールすると、端末はオールリセットされ、すべてのユーザーデータが削除されます。
</p>
<h2 id="setupAVD">エミュレータをセットアップする</h2>
<p>Android エミュレータで Android N Preview を実行するには、Android N Preview SDK をダウンロードして、エミュレータ用の仮想デバイスを準備する必要があります。
</p>
<p>まずは以下の手順で Android N Preview SDK をダウンロードします(すでに <a href="{@docRoot}preview/setup-sdk.html">Android N 向けの開発準備</a>でダウンロード済みの場合は、この手順は飛ばしてください)。
<ol>
<li>Android Studio で設定ダイアログを開きますWindows、Linux では <strong>[File] &gt; [Settings]</strong>、Mac では <strong>[Android Studio] &gt; [Preferences]</strong>)。左側のパネルで <strong>[Appearance &amp; Behavior] &gt; [System Settings] &gt; [Android SDK]</strong> を選択します。
<li><strong>[SDK Platforms]</strong> タブをクリックして、<strong>[Android N Preview]</strong> チェック ボックスを選択します。
</li>
<li><strong>[SDK Tools]</strong> タブをクリックして <strong>[Android SDK Build Tools]</strong>、<strong>[Android SDK Platform-Tools]</strong>、<strong>[Android SDK Tools]</strong> のチェック ボックスを選択します。
</li>
<li><strong>[OK]</strong> をクリックして、インストールするパッケージの使用許諾に同意します。
</li>
</ol>
<p>これで <strong>Android SDK Built-Tools 24.0 0 rc1</strong>、<strong>Platform-Tools 24.0.0 rc1</strong>、<strong>SDK Tools 25.0.9</strong> がインストールされます。SDK Tools を 25.0.9 にアップデートしないと、Android N の x86_64 システム イメージは動作しません。
</p>
<p>次に Android N のシステム イメージを使用して仮想デバイスを作成します。</p>
<ol>
<li><strong>[Tools] &gt; [Android] &gt; [AVD Manager]</strong> を選択して、AVD Manager を起動します。
</li>
<li><strong>[Create Virtual Device]</strong> をクリックします。</li>
<li>Nexus 5X、Nexus 6P、Nexus 9、Android TV などの端末を選択して、<strong>[Next]</strong> をクリックします。
</li>
<li><strong>N</strong> システム イメージ(<strong>x86</strong> ABIを選択して <strong>[Next]</strong> をクリックします(現時点で Android N Preview の Android エミュレータに対応しているのは x86 システム イメージだけです)。
<li>残りの AVD 設定を終えたら <strong>[Finish]</strong> をクリックします。
</li>
</ol>
<p>これで Android N Preview AVD で Android エミュレータを起動できます。</p>
<p>
<a href="http://tools.android.com/tech-docs/emulator">Android Emulator 2.0 Beta</a> に対応した Android Studio 2.1 のプレビュー版をインストールすると、Android Studio 1.5 よりもパフォーマンスが格段に向上し、Android エミュレータをより快適にお使いいただけます。
</p>
<p class="note"><strong>注:</strong> Android Studio 2.0 Beta を使用している場合、N プレビュー版のシステム イメージで AVD を作成できないという既知の不具合があります。よって現時点では、Android Studio 2.1 のプレビュー版を使用して AVD を作成してください。
</p>
<p>仮想デバイスの作成については、<a href="{@docRoot}tools/devices/index.html">仮想デバイスを管理する</a>で詳細をご覧ください。
</p>
</div><!-- landing -->
</div><!-- relative wrapper -->
<script>
var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
function onDownload(link) {
$("#downloadForRealz").html("Download " + $(link).text());
$("#downloadForRealz").attr('href', urlRoot + $(link).text());
$("#tos").fadeIn('fast');
$("#landing").fadeOut('fast');
return true;
}
function onAgreeChecked() {
/* verify that the TOS is agreed */
if ($("input#agree").is(":checked")) {
/* reveal the download button */
$("a#downloadForRealz").removeClass('disabled');
} else {
$("a#downloadForRealz").addClass('disabled');
}
}
function onDownloadForRealz(link) {
if ($("input#agree").is(':checked')) {
/*
$("#tos").fadeOut('fast');
$("#landing").fadeIn('fast');
*/
ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
/*
location.hash = "";
*/
return true;
} else {
return false;
}
}
$(window).hashchange( function(){
if (location.hash == "") {
location.reload();
}
});
</script>

View File

@@ -0,0 +1,388 @@
page.title=バックグラウンド処理の最適化
page.metaDescription=暗黙的なブロードキャストに対する新しい制限。
page.keywords="android N", "implicit broadcasts", "job scheduler"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>
このドキュメントの内容
</h2>
<ol>
<li>
<a href="#connectivity-action">CONNECTIVITY_ACTION に対する制限</a>
</li>
<li>
<a href="#sched-jobs">従量制ではない接続でネットワーク ジョブをスケジュールする</a>
</li>
<li>
<a href="#monitor-conn">アプリを実行しているときにネットワーク接続を監視する</a>
</li>
<li>
<a href="#media-broadcasts">NEW_PICTURE と NEW_VIDEO に対する制限</a>
</li>
<li>
<a href="#new-jobinfo">新しい JobInfo メソッド</a>
</li>
<li>
<a href="#new-jobparam">新しい JobParameter メソッド</a>
</li>
<li>
<a href="#further-optimization">アプリをさらに最適化する</a>
</li>
</ol>
</div>
</div>
<p>
バックグラウンド処理が多くのメモリとバッテリーを消費する場合があります。たとえば、多くのバックグラウンド処理が暗黙的なブロードキャストをリッスンするように登録されていますが、バックグラウンド処理が有用でない場合でも、暗黙的なブロードキャストによりこれらの処理が開始されることがあります。
バックグラウンド処理が端末のパフォーマンスとユーザー エクスペリエンスの両方に多大な影響を及ぼす可能性があります。
</p>
<p>
N Developer Preview では、この問題を軽減するために、次の制限が適用されています。
</p>
<ul>
<li>プレビューをターゲットにしたアプリは、マニフェストで {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストの受信登録をしていても、このブロードキャストを受信しません。
フォアグラウンドで実行中のアプリは、{@link
android.content.Context#registerReceiver Context.registerReceiver()} で {@link android.content.BroadcastReceiver} を登録することにより、メインスレッドで {@code CONNECTIVITY_CHANGE} を引き続きリッスンできます。
</li>
<li>アプリは、{@link
android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストまたは {@link
android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストを送受信できません。この最適化は、プレビューをターゲットにしたアプリだけでなく、すべてのアプリに影響を及ぼします。
</li>
</ul>
<p>
Android フレームワークは、これらの暗黙的なブロードキャストの必要性を軽減するいくつかのソリューションを提供します。
たとえば、{@link android.app.job.JobScheduler} と <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> は、従量制ではないネットワークへの接続など、指定条件が満たされたときに、ネットワーク操作をスケジュールするための堅牢なメカニズムを提供します。
また、コンテンツ プロバイダの変更に対応するために、{@link android.app.job.JobScheduler} を使用することもできます。{@link android.app.job.JobInfo} オブジェクトは、{@link android.app.job.JobScheduler} がジョブをスケジュールするために使用するパラメータをカプセル化します。
ジョブの条件が満たされると、システムはこのジョブをアプリの {@link android.app.job.JobService} で実行します。
</p>
<p>
このドキュメントでは、アプリをこれらの新しい制限に対応させるために、
{@link android.app.job.JobScheduler} などの代替メソッドの使用法について説明します。
</p>
<h2 id="connectivity-action">
CONNECTIVITY_ACTION に対する制限
</h2>
<p>
N Developer Preview をターゲットにしたアプリは、マニフェストで {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} ブロードキャストの受信登録をしていても、このブロードキャストを受信しません。また、このブロードキャストに依存している処理は開始されません。
これにより、ネットワークの変更をリッスンするアプリ、または端末が従量制ではないネットワークに接続したときにネットワーク アクティビティをまとめて実行するアプリに問題が発生する可能性があります。
Android フレームワークは、この制限を回避するためのいくつかのソリューションを備えていますが、アプリで実行するタスクに応じて、適切なソリューションを選択してください。
</p>
<p class="note">
<strong>注: </strong>{@link android.content.Context#registerReceiver Context.registerReceiver()} で登録された {@link android.content.BroadcastReceiver} は、アプリがフォアグラウンドにあるときにこれらのブロードキャストを継続して受信します。
</p>
<h3 id="sched-jobs">
従量制ではない接続でネットワーク ジョブをスケジュールする
</h3>
<p>
{@link android.app.job.JobInfo} オブジェクトをビルドするために {@link android.app.job.JobInfo.Builder JobInfo.Builder} を使用するときは、{@link
android.app.job.JobInfo.Builder#setRequiredNetworkType
setRequiredNetworkType()} メソッドを適用し、{@link android.app.job.JobInfo
JobInfo.NETWORK_TYPE_UNMETERED} をジョブ パラメータとして渡します。
次のコードサンプルは、端末が従量制ではないネットワークに接続し、充電しているときに実行するサービスをスケジュールします。
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
js.schedule(job);
}
</pre>
<p>
ジョブの条件が満たされたとき、アプリはコールバックを受け取り、指定された {@code JobService.class} で {@link android.app.job.JobService#onStartJob onStartJob()} メソッドを実行します。
{@link
android.app.job.JobScheduler} 実装の例については、<a href="{@docRoot}samples/JobScheduler/index.html">JobScheduler サンプルアプリ</a>をご覧ください。
</p>
<p>
GMSCore サービスを使用し、Android 5.0API レベル 21以前をターゲットにしているアプリは、<a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> を使用して {@code Task.NETWORK_STATE_UNMETERED} を指定できます。
</p>
<h3 id="monitor-conn">
アプリを実行しているときにネットワーク接続を監視する
</h3>
<p>
フォアグラウンドで実行中のアプリは、{@link
android.content.BroadcastReceiver} を登録することにより、{@code
CONNECTIVITY_CHANGE} を引き続きリッスンできます。ただし、{@link
android.net.ConnectivityManager} API は、特定のネットワーク条件が満たされたときだけコールバックをリクエストするより堅牢なメソッドを提供します。
</p>
<p>
{@link android.net.NetworkRequest} オブジェクトは、{@link android.net.NetworkCapabilities} に応じてネットワーク コールバックのパラメータを定義します。
{@link
android.net.NetworkRequest.Builder NetworkRequest.Builder} クラスを使って {@link android.net.NetworkRequest} オブジェクトを作成します。次に、{@link
android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} は、{@link android.net.NetworkRequest} オブジェクトをシステムに渡します。
ネットワーク条件が満たされると、アプリはコールバックを受け取り、{@link
android.net.ConnectivityManager.NetworkCallback} クラスで定義された {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
onAvailable()} メソッドを実行します。
</p>
<p>
アプリは終了するか、{@link android.net.ConnectivityManager#unregisterNetworkCallback
unregisterNetworkCallback()} を呼び出すまで、コールバックを受信し続けます。
</p>
<h2 id="media-broadcasts">
NEW_PICTURE と NEW_VIDEO に対する制限
</h2>
<p>
N Developer Preview では、アプリは、{@link
android.hardware.Camera#ACTION_NEW_PICTURE} ブロードキャストまたは {@link
android.hardware.Camera#ACTION_NEW_VIDEO} ブロードキャストを送受信できません。この制限は、新しい画像やビデオを処理するためにいくつかのアプリを起動する必要があるときに、パフォーマンスとユーザー エクスペリエンスへの影響を軽減するのに役立ちます。
N Developer Preview では、{@link android.app.job.JobInfo} と {@link
android.app.job.JobParameters} を拡張することにより、代わりのソリューションを提供しています。
</p>
<h3 id="new-jobinfo">
新しい JobInfo メソッド
</h3>
<p>
N Developer Preview では、コンテンツ URI の変更でジョブをトリガーするために、{@link android.app.job.JobInfo} API に次のメソッドが追加されています。
</p>
<dl>
<dt>
{@code JobInfo.TriggerContentUri()}
</dt>
<dd>
コンテンツ URI の変更でジョブをトリガーするために必要なパラメータをカプセル化します。
</dd>
<dt>
{@code JobInfo.Builder.addTriggerContentUri()}
</dt>
<dd>
{@code TriggerContentUri} オブジェクトを {@link
android.app.job.JobInfo} に渡します。{@link android.database.ContentObserver} は、カプセル化されたコンテンツ URI を監視します。
ジョブに関連する複数の {@code
TriggerContentUri} オブジェクトがある場合、システムは、1 つのコンテンツ URI のみの変更を通知する場合でも、コールバックを提供します。
</dd>
<dd>
指定した URI の子孫のいずれかが変更された場合、ジョブをトリガーするために、{@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} フラグを追加します。
このフラグは、{@link
android.content.ContentResolver#registerContentObserver
registerContentObserver()} に渡される {@code notifyForDescendants} パラメータに相当します。
</dd>
</dl>
<p class="note">
<strong>注:</strong> {@code TriggerContentUri()} は、{@link android.app.job.JobInfo.Builder#setPeriodic
setPeriodic()} または {@link android.app.job.JobInfo.Builder#setPersisted
setPersisted()} と組み合わせて使うことはできません。
コンテンツの変更を継続的に監視するには、アプリの {@link
android.app.job.JobService} が最新のコールバックの処理を完了する前に、新しい
{@link android.app.job.JobInfo} をスケジュールします。
</p>
<p>
次のサンプルコードは、システムが変更をコンテンツ URI {@code MEDIA_URI} に通知するときにトリガーされるジョブをスケジュールします。
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MediaContentJob.class));
builder.addTriggerContentUri(
new JobInfo.TriggerContentUri(MEDIA_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
js.schedule(builder.build());
}
</pre>
<p>
システムが特定のコンテンツ URI の変更を通知すると、アプリはコールバックを受け取り、{@link android.app.job.JobParameters} オブジェクトが {@code MediaContentJob.class} の {@link android.app.job.JobService#onStartJob onStartJob()} メソッドに渡されます。
</p>
<h3 id="new-jobparam">
新しい JobParameter メソッド
</h3>
<p>
また、N Developer Preview では、{@link android.app.job.JobParameters} が拡張され、ジョブをトリガーしたコンテンツ権限や URI についての有用な情報をアプリが受け取れるようになっています。
</p>
<dl>
<dt>
{@code Uri[] getTriggeredContentUris()}
</dt>
<dd>
ジョブをトリガーした URI の配列を返します。この配列は、ジョブをトリガーした URI がない場合(たとえば、期限切れ、またはその他の理由でジョブがトリガーされた場合)、または変更された URI の数が 50 を超える場合は、{@code
null} になります。
</dd>
<dt>
{@code String[] getTriggeredContentAuthorities()}
</dt>
<dd>
ジョブをトリガーしたコンテンツ権限の文字列配列を返します。
返された配列が {@code null} ではない場合、どの URI が変更されたかについて、詳細を取得するために {@code getTriggeredContentUris()} を使用します。
</dd>
</dl>
<p>
次のサンプルコードは、{@link
android.app.job.JobService#onStartJob JobService.onStartJob()} メソッドをオーバーライドし、ジョブを起動したコンテンツ権限と URI を記録します。
</p>
<pre>
&#64;Override
public boolean onStartJob(JobParameters params) {
StringBuilder sb = new StringBuilder();
sb.append("Media content has changed:\n");
if (params.getTriggeredContentAuthorities() != null) {
sb.append("Authorities: ");
boolean first = true;
for (String auth :
params.getTriggeredContentAuthorities()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(auth);
}
if (params.getTriggeredContentUris() != null) {
for (Uri uri : params.getTriggeredContentUris()) {
sb.append("\n");
sb.append(uri);
}
}
} else {
sb.append("(No content)");
}
Log.i(TAG, sb.toString());
return true;
}
</pre>
<h2 id="further-optimization">
アプリをさらに最適化する
</h2>
<p>
アプリをメモリ不足の端末またはメモリ不足の状況で実行するために最適化すると、パフォーマンスとユーザー エクスペリエンスが向上します。
バックグラウンド サービスと静的に登録された暗黙的なブロードキャスト レシーバーへの依存関係を削除すると、そのような端末上のアプリの動作が向上します。
N Developer Preview では、これらの問題を削減するための措置が講じられていますが、これらのバックグラウンド処理をまったく使用せずに、アプリが実行されるように最適化することをお勧めします。
</p>
<p>
N Developer Preview には、それらのバックグラウンド処理を無効にした状態でアプリの動作をテストするために使用できるいくつかの <a href="{@docRoot}tools/help/adb.html">Android デバッグ ブリッジADB</a>コマンドが追加されています。
</p>
<ul>
<li>暗黙的なブロードキャストとバックグラウンド サービスが利用できない状態をシミュレートするには、次のコマンドを入力します。
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
</pre>
</li>
<li>暗黙的なブロードキャストとバックグラウンド サービスを再度有効にするには、次のコマンドを入力します。
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
</pre>
</li>
</ul>

View File

@@ -0,0 +1,180 @@
page.title=ダイレクト ブート
page.keywords=preview,sdk,direct boot
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容</h2>
<ol>
<li><a href="#run">ダイレクト ブート中に実行するためのアクセスを要求する</a></li>
<li><a href="#access">暗号化端末ストレージにアクセスする</a></li>
<li><a href="#notification">ユーザーによる端末のロック解除の通知を受信する</a></li>
<li><a href="#migrating">既存のデータを移行する</a></li>
<li><a href="#testing">暗号化対応アプリをテストする</a></li>
</ol>
</div>
</div>
<p>Android N は <i>、</i> 電源を入れたときにユーザーが端末のロックを解除していない場合、セキュリティで保護された「ダイレクト ブート」モードで実行します。
この機能をサポートするため、システムで次の 2 つの保存先を使用できるようになります。</p>
<ul>
<li><i>資格情報暗号化ストレージ。</i>これはデフォルトの保存先で、ユーザーが端末のロックを解除した後にだけ使用できます。
</li>
<li><i>端末暗号化ストレージ。</i>この保存先は、ダイレクト ブート モード中とユーザーが端末のロックを解除した後の両方で使用できます。
</li>
</ul>
<p>デフォルトで、ダイレクト ブート モード中はアプリは実行されません。ダイレクト ブート モード中にアプリでアクションを実行する必要がある場合、このモードで実行するアプリ コンポーネントを登録できます。
ダイレクト ブート モードでアプリの実行が必要になる一般的な使用例は次のとおりです。
</p>
<ul>
<li>アラーム クロック アプリなど、通知がスケジュールされているアプリ。
</li>
<li>SMS アプリなど、重要なユーザー通知を表示するアプリ。</li>
<li>Talkback など、アクセシビリティ サービスを提供するアプリ。</li>
</ul>
<p>ダイレクト ブート モードで実行中にアプリがデータにアクセスする必要がある場合は、端末暗号化ストレージを使用します。
端末暗号化ストレージにはキーで暗号化されたデータが保存され、端末がセキュア ブートに成功した場合にのみこのデータを使用できます。
</p>
<p>ユーザーの資格情報に関連付けたキーで暗号化しなければならない PIN やパスワードなどのデータには、資格情報暗号化ストレージを使用します。資格情報暗号化ストレージは、ユーザーが端末のロック解除に成功した後に使用可能になり、ユーザーが端末を再起動するまでアクセスできます。
ユーザーが端末をロック解除した後にロック画面を有効にしても、資格情報暗号化ストレージはロックされません。
</p>
<h2 id="run">ダイレクト ブート中に実行するためのアクセスを要求する</h2>
<p>ダイレクト ブート モード中にアプリを実行したり、端末暗号化ストレージにアクセスしたりするには、アプリ コンポーネントの登録が必要です。
アプリをシステムに登録するには、コンポーネントが暗号化対応するように指定します。
<i></i>コンポーネントが暗号化対応するよう指定するには、マニフェスト内で
<code>android:encryptionAware</code> 属性を true に設定します。<p>
<p>暗号化対応コンポーネントを登録しておくと、端末を再起動したときにシステムから
<code>LOCKED_BOOT_COMPLETED</code> ブロードキャスト メッセージを受信できます。
この時点で端末暗号化ストレージが使用できるようになり、ダイレクト ブート モード中にコンポーネントが実行しなければならないタスクを実行できます。たとえば、スケジュールしたアラームのトリガーなどが該当します。
</p>
<p>次のコード スニペットは、アプリのマニフェスト内で
{@link android.content.BroadcastReceiver} を暗号化対応として登録し、<code>LOCKED_BOOT_COMPLETED</code> のインテント フィルタを追加する方法の例を示しています。
</p>
<pre>
&lt;receiever
android:encryptionAware="true" &gt;
...
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>ユーザーが端末のロックを解除すると、すべてのコンポーネントは端末暗号化ストレージと資格情報暗号化ストレージの両方にアクセスできます。
</p>
<h2 id="access">暗号化端末ストレージにアクセスする</h2>
<p>暗号化端末ストレージにアクセスするには、
<code>Context.createDeviceEncryptedStorageContext()</code> を呼び出して追加の
{@link android.content.Context} インスタンスを作成します。このコンテキストで実行されたストレージ API 呼び出しはすべて、端末暗号化ストレージにアクセスします。
次の例では、端末暗号化ストレージにアクセスして既存のアプリのデータ ファイルを開きます。
</p>
<pre>
Context directBootContext = Context.createDeviceEncryptedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...
</pre>
<p>端末暗号化ストレージは、ダイレクト ブート モード中にアクセスが必要な情報のみに使用してください。汎用的な暗号化された保存先として、端末暗号化ストレージを使用することはできません。ユーザーの個人情報や、ダイレクト ブート モード中に特に必要ではない暗号化されたデータには、資格情報暗号化ストレージを使用してください。
</p>
<h2 id="notification">ユーザーによる端末のロック解除の通知を受信する</h2>
<p>再起動後にユーザーが端末のロックを解除すると、アプリは資格情報暗号化ストレージへのアクセスに切り替えて、ユーザーの資格情報に応じて通常のシステム サービスを使用します。
</p>
<p>再起動後、ユーザーが端末のロックを解除したときに通知を受信するには、実行中のコンポーネントから {@link android.content.BroadcastReceiver} を登録して、<code>ACTION_USER_UNLOCKED</code> メッセージをリッスンするようにします。
または、既存の {@link android.content.Intent#ACTION_BOOT_COMPLETED
ACTION_BOOT_COMPLETED} メッセージを受信することもできます。このメッセージは、端末が起動してユーザーが端末のロックを解除したことを示すようになりました。
</p>
<p>
<code>UserManager.isUserUnlocked()</code> を呼び出して、ユーザーが端末のロックを解除したかを直接問い合わせることもできます。</p>
<h2 id="migrating">既存のデータを移行する</h2>
<p>ユーザーが端末をアップデートしてダイレクト ブート モードを使用できるようになると、既存のデータを端末暗号化ストレージに移行しなければならない場合があります。
<code>Context.migrateSharedPreferencesFrom()</code> および
<code>Context.migrateDatabaseFrom()</code> を使用すると、設定およびデータベースのデータを資格情報暗号化ストレージと端末暗号化ストレージ間で移行できます。
</p>
<p>どのデータを資格情報暗号化ストレージから端末暗号化ストレージに移行するかは、慎重に判断してください。
パスワードや認証トークンなどのユーザーの個人情報は、端末暗号化ストレージに移行しないでください。
場合によっては、この 2 つの暗号化された保存先に、データセットを振り分けて管理する必要があります。
</p>
<h2 id="testing">暗号化対応アプリをテストする</h2>
<p>新しいダイレクト ブート モードを使用して、暗号化対応アプリをテストしてみましょう。ダイレクト ブートを有効にする方法は 2 つあります。
</p>
<p class="caution"><strong>警告:</strong>ダイレクト ブートを有効にすると、端末上のすべてのユーザーデータが消去されます。
</p>
<p>Android N がインストールされたサポート対象端末では、次のいずれかの方法を使用してダイレクト ブートを有効にします。
</p>
<ul>
<li>端末で、<b>[Developer options]</b> がまだ有効になっていない場合は、次の手順で有効にします。<b>[Settings] &gt; [About phone]</b> で <b>[Build number]</b> を 7 回タップします。
[Developer options] 画面が表示されたら、<b>[Settings] &gt; [Developer options]</b> で <b>[Convert to file encryption]</b> を選択します。
</li>
<li>次の adb shell コマンドを使用して、ダイレクト ブート モードを有効にします。
<pre class="no-pretty-print">
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
</pre>
</li>
</ul>
<p>テスト端末でモードの切り替えが必要な場合、エミュレーションされたダイレクト ブート モードも使用できます。
データが失われるおそれがありますので、EMULATED モードは開発中にのみ使用してください。
エミュレーションされたダイレクト ブート モードを有効にするには、端末でロック パターンを設定します。ロック パターンの設定時にセキュリティで保護されたスタートアップ画面について確認メッセージが表示された場合は、[No thanks] を選択します。次に、次の adb shell コマンドを使用します。
</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe true
</pre>
<p>エミュレーションされたダイレクト ブート モードを無効にするには、次のコマンドを使用します。</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe false
</pre>
<p>これらのコマンドを使用すると、端末が再起動されます。</p>

View File

@@ -0,0 +1,158 @@
page.title=ICU4J Android フレームワーク API
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容:</h2>
<ol>
<li><a href="#relation">ICU4J との関係</a></li>
<li><a href="#migration">ICU4J から android.icu API に移行する</a></li>
<li><a href="#licence">ライセンス</a></li>
</ol>
<h2>関連ドキュメント</h2>
<ol>
<li>
<a class="external-link" href="http://userguide.icu-project.org">ICU4J のドキュメント</a>
</li>
<li>
<a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">ICU4J でサポートされている最新の標準</a>
</li>
</ol>
</div>
</div>
<p>
ICU4J は幅広く使用されている、オープン ソースの Java ライブラリのセットで、Unicode のほか、ソフトウェア アプリケーションのグローバル化のサポートを提供しています。
Android N では、アプリのデベロッパー向けの Android フレームワーク内で ICU4J API のサブセットを公開しており、{@code android.icu} パッケージ内で使用できます。
これらの API は、端末上のローカライズ データを使用します。
そのため、ICU4J ライブラリを APK にコンパイルせず、フレームワーク内にあるライブラリを呼び出せばよいので、APK のフットプリントを削減できます
この場合、Android N より前のバージョンの Android を実行しているユーザーも、ICU4J ライブラリを含むバージョンのアプリをダウンロードできるようにするには、<a href="{@docRoot}google/play/publishing/multiple-apks.html">APK を複数のバージョン</a>用意する必要があります)。
</p>
<p>
ここではまず、これらのライブラリをサポートするために必要な最低限の Android API レベルについて基本的な情報を説明します。
次に、Android 固有の ICU4J の実装に必要な情報を説明します。
最後に、Android フレームワーク内で ICU4J API を使用する方法について説明します。
</p>
<h2 id="relation">ICU4J との関係</h2>
<p>
Android N では、<code>com.ibm.icu</code> ではなく
<code>android.icu</code> パッケージを介して ICU4J API のサブセットを公開しています。Android フレームワークでは、さまざまな理由により ICU4J API を公開しないという選択も考えられます。たとえば、Android N で廃止された API を公開しないため、または ICU チームからまだ安定版の発表がないため、などの理由があります。
ICU チームが今後 API を廃止した場合、Android でも廃止と見なすことになりますが、引き続きそれらの API を含める予定です。
</p>
<p class="table-caption"><strong>表 1.</strong> Android N で使用される ICU および CLDR のバージョン
</p>
<table>
<tr>
<th>Android API レベル</th>
<th>ICU バージョン</th>
<th>CLDR バージョン</th>
</tr>
<tr>
<td>Android N</td>
<td>56</td>
<td>28</td>
</tr>
</table>
<p>いくつか注意事項があります。</p>
<ul>
<li>ICU4J Android フレームワーク API には、すべての ICU4J API が含まれているわけではありません。</li>
<li>NDK デベロッパーは、Android ICU4C がサポートされていない点にご注意ください。</li>
<li>Android フレームワーク内の API は、Android の<a href="{@docRoot}guide/topics/resources/localization.html">リソースを使用したローカライズ</a>に対するサポートに代わるものではありません。
</li>
</ul>
<h2 id="migration">com.ibm.icu から android.icu パッケージに移行する</h2>
<p>
アプリ内で既に ICU4J API を使用しており、
<code>android.icu</code> API がその要件を満たしている場合、このフレームワーク API に移行するには、Java のインポートを <code>com.ibm.icu</code> から <code>android.icu</code> に変更します。
次に、APK から ICU4J ファイルのコピーを削除します。
</p>
<p class="note">
<b>注:</b> ICU4J フレームワーク API では、名前空間に {@code com.ibm.icu} ではなく{@code android.icu} を使用します。
これは、独自の {@code com.ibm.icu} ライブラリを含む APK で名前空間が競合しないようにするためです。
</p>
<h3 id="migrate-from-android">
その他の Android SDK API から android.icu API に移行する
</h3>
<p>
<code>java</code> および <code>android</code> パッケージには、ICU4J にあるクラスと同等のクラスが一部含まれています。
しかし多くの場合、ICU4J では、より幅広い標準と言語のサポートを提供しています。
</p>
<p>次に、すぐに利用できる例をいくつか示します。</p>
<table>
<tr>
<th>クラス</th>
<th>代替クラス</th>
</tr>
<tr>
<td><code>java.lang.Character</code> </td>
<td><code>android.icu.lang.UCharacter</code> </td>
</tr>
<tr>
<td><code>java.text.BreakIterator</code> </td>
<td><code>android.icu.text.BreakIterator</code> </td>
</tr>
<tr>
<td><code>java.text.DecimalFormat</code> </td>
<td><code>android.icu.text.DecimalFormat</code> </td>
</tr>
<tr>
<td><code>java.util.Calendar</code></td>
<td>
<code>android.icu.util.Calendar</code></td>
</tr>
<tr>
<td><code>android.text.BidiFormatter</code>
</td>
<td><code>android.icu.text.Bidi</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateFormat</code>
</td>
<td><code>android.icu.text.DateFormat</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateUtils</code> </td>
<td><code>android.icu.text.DateFormat</code>
<code>android.icu.text.RelativeDateTimeFormatter</code>
</td>
</tr>
</table>
<h2 id="licence">ライセンス</h2>
<p>
ICU4J は ICU ライセンスでリリースされています。詳細については、<a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">ICU User Guide</a> をご覧ください。
</p>

View File

@@ -0,0 +1,582 @@
page.title=マルチ ウィンドウのサポート
page.metaDescription=複数のアプリを同時に表示するための Android N の新しいサポート。
page.keywords="multi-window", "android N", "split screen", "free-form"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容</h2>
<ol>
<li><a href="#overview">概要</a></li>
<li><a href="#lifecycle">マルチ ウィンドウ ライフサイクル</a></li>
<li><a href="#configuring">マルチ ウィンドウ モード向けアプリを構成する</a>
</li>
<li><a href="#running">マルチ ウィンドウ モードでアプリを実行する</a></li>
<li><a href="#testing">アプリのマルチ ウィンドウ サポートをテストする</a></li>
</ol>
<h2>関連ドキュメント</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">マルチ ウィンドウ Playground のサンプルアプリ</a>
</li>
</ol>
</div>
</div>
<p>
Android N には、複数のアプリを同時に表示するためのサポートが追加されています。
ハンドヘルド端末で、分割画面モードにして、2 つのアプリを並べて実行したり、重ねて表示したりできます。<em></em>
TV デバイスで、アプリがピクチャ イン ピクチャ モードでビデオを再生しているときに、ユーザーは別のアプリを操作できます。<em></em>
</p>
<p>
N Preview SDK でアプリをビルドする場合、アプリがマルチ ウィンドウ ディスプレイを処理をする方法を設定できます。
たとえば、アクティビティの最小許容ディメンションを指定できます。
また、アプリに対してマルチ ウィンドウ ディスプレイを無効にし、アプリを全画面モードのみで表示することもできます。
</p>
<h2 id="overview">概要</h2>
<p>
Android N では、複数のアプリが画面を同時に共有できます。たとえば、ユーザーは画面を分割し、ウェブページを左側の画面に表示しながら、右側の画面でメールを作成することができます。
ユーザー エクスペリエンスは端末によって異なります。
</p>
<ul>
<li>Android N を実行しているハンドヘルド端末は、分割画面モードに対応しています。
このモードでは、画面で 2 つのアプリが実行され、これらのアプリを並べて、または重ねて表示できます。
ユーザーは、2 つのアプリを分離している分割線をドラッグして、1 つのアプリを拡大し、もう 1 つのアプリを縮小することができます。
</li>
<li>Android N を実行している Nexus Player で、アプリを<a href="picture-in-picture.html">ピクチャ イン ピクチャ モード</a>にすると、アプリにコンテンツを表示したまま、ユーザーは他のアプリをブラウジングまたは操作することができます。
</li>
<li>より大きい画面の端末のメーカーは、ユーザーが各アクティビティのサイズを自由に変更できるフリーフォーム モードを有効にすることもできます。
メーカーがこの機能を有効にした場合、端末では、分割画面モードに加えて、フリーフォーム モードが利用できます。
</li>
</ul>
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
{@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong>図 1.</strong> 分割画面モードで並べて実行されている 2 つのアプリ。
</p>
<p>
ユーザーは、次の方法でマルチ ウィンドウ モードに切り替えることができます。
</p>
<ul>
<li>ユーザーは<a href="{@docRoot}guide/components/recents.html">オーバービュー画面</a>を開いているときに、アクティビティのタイトルを長押ししてから、そのアクティビティを画面の強調表示された部分にドラッグすることにより、アクティビティをマルチ ウィンドウ モードにすることができます。
</li>
<li>ユーザーがオーバービュー ボタンを長押しすると、現在のアクティビティがマルチ ウィンドウ モードになり、オーバービュー画面が開くので、ユーザーは、画面で共有する別のアクティビティを選択できるようになります。
</li>
</ul>
<p>
ユーザーは、複数のアクティビティが画面を共有しているときに、データを 1 つのアクティビティから別のアクティビティに<a href="{@docRoot}guide/topics/ui/drag-drop.html">ドラッグ アンド ドロップ</a>できます
(以前は、単一のアクティビティ内でのみデータをドラッグ アンド ドロップできました)。
</p>
<h2 id="lifecycle">マルチ ウィンドウ ライフサイクル</h2>
<p>
マルチ ウィンドウ モードは、<a href="{@docRoot}training/basics/activity-lifecycle/index.html">アクティビティのライフサイクル</a>を変更しません。
</p>
<p>
マルチ ウィンドウ モードでは、ユーザーが直前に操作したアクティビティのみが任意の時点でアクティブになります。
このアクティビティは、トップ レベルにあると見なされます。<em></em>
他のすべてのアクティビティは、表示されていても一時停止状態になっています。
ただし、一時停止状態ではあるが、表示されているこれらのアクティビティには、表示されていないアクティビティよりも高い優先度が付与されます。
ユーザーが一時停止状態のアクティビティのいずれかを操作した場合、そのアクティビティが再開され、前のトップ レベルのアクティビティが一時停止します。
</p>
<p class="note">
<strong>注:</strong> マルチ ウィンドウ モードでは、アプリが一時停止状態になっても、そのアプリを表示したままにすることができます。
アプリは、一時停止していても、アクティビティを続行する必用がある場合があります。
たとえば、一時停止モードになっているが、表示されているビデオ再生アプリは、ビデオの表示を継続する必要があります。
そのため、ビデオを再生するアクティビティが {@link android.app.Activity#onPause onPause()} ハンドラでビデオを一時停止しないようにすることをお勧めします。
<em></em>
その代わり、これらのアクティビティは {@link android.app.Activity#onStop
onStop()} でビデオを一時停止し、{@link android.app.Activity#onStart
onStart()} でビデオの再生を再開する必要があります。
</p>
<p>
<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>で指定したように、ユーザーがアプリをマルチ ウィンドウ モードにすると、アクティビティに構成の変更が通知されます。
基本的に、この構成の変更は、端末が縦表示から横表示に切り替えられたことをアプリに通知する場合と同じ影響(端末のディメンションが変更された場合を除いて)をアクティビティのライフサイクルに及ぼします。
<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更の処理</a>で説明したように、アクティビティは構成の変更を処理することができます。または、システムによってアクティビティを破棄し、新しいディメンションでアクティビティを再作成することもできます。
</p>
<p>
ユーザーがウィンドウのサイズを変更して、高さや幅を拡大した場合、ユーザー アクションに一致するようにアクティビティのサイズが変更され、必要に応じて、<a href="{@docRoot}guide/topics/resources/runtime-changes.html">実行時の変更</a>が発行されます。
アプリで新しく表示された領域を描画するまでに時間がかかる場合、{@link
android.R.attr#windowBackground windowBackground} 属性またはデフォルトの
<code>windowBackgroundFallback</code> システム属性によって指定された色でこれらの領域が一時的に塗りつぶされます。
</p>
<h2 id="configuring">マルチ ウィンドウ モード向けアプリを構成する</h2>
<p>
アプリが Android N をターゲットにしている場合は、アプリのアクティビティがマルチ ウィンドウ ディスプレイをサポートする方法や、このサポートを行うかどうかを決めることができます。
サイズとレイアウトを制御するための属性をマニフェストに設定できます。
ルート アクティビティ属性の設定は、タスクスタック内のすべてのアクティビティに適用されます。
</p>
<p class="note">
<strong>注</strong>: Android N より前の SDK バージョンでマルチ オリエンテーション アプリをビルドして、そのアプリをマルチ ウィンドウ モードで使用する場合は、アプリのサイズが強制的に変更されます。
アプリに予想外の動作が発生する場合があることをユーザーに警告するダイアログ ボックスが表示されます。
システムは、向きが固定されたアプリのサイズを変更しません。ユーザーがマルチ ウィンドウ モードで向きが固定されたアプリを開こうとすると、そのアプリが全画面で表示されます。<em></em>
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
マルチ ウィンドウ ディスプレイを有効または無効にするには、この属性をマニフェストの <code>&lt;activity&gt;</code> ノードまたは
<code>&lt;application&gt;</code> ノードに設定します。
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
この属性が true に設定されている場合、アクティビティを分割画面モードまたはフリーフォーム モードで起動できます。
この属性が false に設定されている場合、アクティビティはマルチ ウィンドウ モードをサポートしません。
この値が false のとき、ユーザーがアクティビティをマルチ ウィンドウ モードで起動しようとすると、アクティビティが全画面で表示されます。
</p>
<p>
アプリが Android N をターゲットにしているが、この属性の値が指定されていない場合、属性の値がデフォルトの true になります。
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
この属性をマニフェストの <code>&lt;activity&gt;</code> ノードに設定すると、アクティビティがピクチャ イン ピクチャ ディスプレイをサポートするかどうかを示すことができます。
<code>android:resizeableActivity</code> が false の場合、この属性は無視されます。
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">レイアウト属性</h3>
<p>
Android N では、<code>&lt;layout&gt;</code> マニフェスト要素により、マルチ ウィンドウ モードでのアクティビティの動作に影響を及ぼすいくつかの属性がサポートされています。
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
フリーフォーム モードで起動されたときのアクティビティのデフォルトの幅です。
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
フリーフォーム モードで起動されたときのアクティビティのデフォルトの高さです。
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
フリーフォーム モードで起動されたときのアクティビティの初期配置です。適切な値については、
{@link android.view.Gravity} のリファレンスをご覧ください。
</dd>
<dt>
<code>android:minimalSize</code>
</dt>
<dd>
分割画面モードおよびフリーフォーム モードでのアクティビティの最小の高さと幅です。
ユーザーが分割画面モードの分割線を移動して、アクティビティを指定された最小ディメンションよりも小さくすると、アクティビティはユーザーがリクエストしたサイズにトリミングされます。
</dd>
</dl>
<p>
たとえば、次のコードは、アクティビティがフリーフォーム モードで表示されているときに、アクティビティのデフォルトのサイズと位置、およびその最小サイズを指定する方法を示しています。
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalSize="450dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">マルチ ウィンドウ モードでアプリを実行する</h2>
<p>
Android N では、マルチ ウィンドウ モードで実行できるアプリをサポートするための新しい機能が導入されています。
</p>
<h3 id="disabled-features">マルチ ウィンドウ モードで無効になる機能</h3>
<p>
端末がマルチ ウィンドウ モードになっている場合、特定の機能は、端末の画面を他のアクティビティやアプリと共有する場合があるアクティビティに対して機能しないため、これらの機能は無効なるか、無視されます。
これらの機能には、次のものが含まれます。
<ul>
<li><a href="{@docRoot}training/system-ui/index.html">システム UI</a> の一部のカスタマイズ オプションは無効になります。たとえば、アプリが全画面モードで実行されていない場合、アプリのステータスバーを非表示にできません。
</li>
<li>システムは、<code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code> 属性に加えられた変更を無視します。
</li>
</ul>
<h3 id="change-notification">マルチ ウィンドウの変更通知とクエリ</h3>
<p>
マルチ ウィンドウ ディスプレイをサポートするために、次の新しいメソッドが {@link android.app.Activity} クラスに追加されています。
各メソッドの詳細については、<a href="{@docRoot}preview/setup-sdk.html#docs-dl">N プレビュー SDK リファレンス</a>をご覧ください。
</p>
<dl>
<dt>
<code>Activity.inMultiWindow()</code>
</dt>
<dd>
アクティビティがマルチ ウィンドウ モードで実行されているかどうかを判別するために呼び出します。
</dd>
<dt>
<code>Activity.inPictureInPicture()</code>
</dt>
<dd>
アクティビティがピクチャ イン ピクチャ モードで実行されているかどうかを判別するために呼び出します。
<p class="note">
<strong>注</strong>: ピクチャ イン ピクチャ モードは、マルチ ウィンドウ モードの特別な形態です。
<code>myActivity.inPictureInPicture()</code> が true を返す場合は、<code>myActivity.inMultiWindow()</code> も true を返します。
</p>
</dd>
<dt>
<code>Activity.onMultiWindowChanged()</code>
</dt>
<dd>
アクティビティがマルチ ウィンドウ モードになるか、マルチ ウィンドウ モードではなくなると、常にこのメソッドが呼び出されます。
アクティビティがマルチ ウィンドウ モードになると、このメソッドに true 値が渡され、アクティビティがマルチ ウィンドウ モードではなくなると、このメソッドに false 値が渡されます。
</dd>
<dt>
<code>Activity.onPictureInPictureChanged()</code>
</dt>
<dd>
アクティビティがピクチャ イン ピクチャ モードになるか、ピクチャ イン ピクチャ モードではなくなると、常にこのメソッドが呼び出されます。
アクティビティがピクチャ イン ピクチャ モードになると、このメソッドに true 値が渡され、アクティビティがピクチャ イン ピクチャ モードではなくなると、このメソッドに false 値が渡されます。
</dd>
</dl>
<p>
また、これらの各メソッドの {@link android.app.Fragment} バージョンがあります。たとえば、<code>Fragment.inMultiWindow()</code> です。
</p>
<h3 id="entering-pip">ピクチャ イン ピクチャ モードにする</h3>
<p>
アクティビティをピクチャ イン ピクチャ モードにするには、新しいメソッド
<code>Activity.enterPictureInPicture()</code> を呼び出します。端末がピクチャ イン ピクチャ モードをサポートしない場合、このメソッドの効果はありません。
詳細については、<a href="picture-in-picture.html">ピクチャ イン ピクチャ</a>に関するドキュメントをご覧ください。
</p>
<h3 id="launch">マルチ ウィンドウ モードで新しいアクティビティを起動する</h3>
<p>
新しいアクティビティを起動するときに、可能であれば、新しいアクティビティを現在のアクティビティの隣に表示する必用があるかどうかをシステムに示すことができます。
そうするには、フラグ
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code> を使用します。
このフラグを渡すと、次の動作がリクエストされます。
</p>
<ul>
<li>端末が分割画面モードになっている場合、システムは、起動しているアクティビティの隣に新しいアクティビティを作成しようとするので、これらの 2 つのアクティビティが画面を共有します。
システムでは、この操作の実行が保証されるわけではありませんが、可能であれば、アクティビティが並べて表示されます。
</li>
<li>端末が分割画面モードではない場合、このフラグの効果はありません。
</li>
</ul>
<p>
端末がフリーフォーム モードになっている場合、新しいアクティビティを起動するときに、
<code>ActivityOptions.setLaunchBounds()</code> を呼び出すことにより、新しいアクティビティのディメンションと画面上での位置を指定することができます。
端末がマルチ ウィンドウ モードではない場合、このメソッドの効果はありません。
</p>
<p class="note">
<strong>注</strong>: タスクスタック内でアクティビティを起動すると、画面上のアクティビティが起動したアクティビティに置き換えられ、すべてのマルチ ウィンドウ プロパティが継承されます。
マルチ ウィンドウ モードで新しいアクティビティを別個の画面として起動する場合は、新しいアクティビティを新しいタスクスタックで起動する必要があります。
</p>
<h3 id="dnd">ドラッグ アンド ドロップのサポート</h3>
<p>
ユーザーは、2 つのアクティビティが画面を共有しているときに、データを 1 つのアクティビティから別のアクティビティに<a href="{@docRoot}guide/topics/ui/drag-drop.html">ドラッグ アンド ドロップ</a>できます
(以前は、単一のアクティビティ内でのみデータをドラッグ アンド ドロップできました)。
そのため、アプリがドラッグ アンド ドロップをサポートしていない場合は、ドラッグ アンド ドロップ機能をアプリに追加する必要があります。
</p>
<p>
N プレビュー SDK では、異なるアプリ間のドラッグ アンド ドロップをサポートするために、<a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a> パッケージが拡張されています。
次のクラスとメソッドの詳細については、<a href="{@docRoot}preview/setup-sdk.html#docs-dl">N プレビュー SDK リファレンス</a>をご覧ください。
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
ドロップを受け取るアプリに付与されるパーミッションの指定を処理するトークン オブジェクトです。
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
{@link android.view.View#startDrag View.startDrag()} の新しいエイリアスです。異なるアクティビティ間のドラッグ アンド ドロップを有効にするには、新しいフラグ
<code>View.DRAG_FLAG_GLOBAL</code> を渡します。
URI パーミッションを受け取る側のアクティビティに付与する必要がある場合、必要に応じて、新しいフラグ
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> または
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code> を渡します。
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
実行中のドラッグ操作をキャンセルします。ドラッグ操作を開始したアプリだけが呼び出せます。
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
実行中のドラッグ操作のドラッグ シャドウを置き換えます。ドラッグ操作を開始したアプリだけが呼び出せます。
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
{@link android.view.DragEvent} に含まれる {@link
android.content.ClipData} で渡されるコンテンツ URI のパーミッションをリクエストします。
</dd>
</dl>
<h2 id="testing">アプリのマルチ ウィンドウ サポートをテストする</h2>
<p>
ユーザーが Android N を実行している端末をマルチ ウィンドウ モードにしてアプリの起動を試みる場合に備えて、Android N 向けにアプリをアップデートするかどうかに関係なく、アプリがマルチ ウィンドウ モードでどのように動作するかを確認する必要があります。
</p>
<h3 id="configuring">テスト端末の構成</h3>
<p>
Android N を端末にインストールすると、分割画面モードが自動的にサポートされます。
</p>
<h3 id="test-non-n">アプリが N プレビュー SDK でビルドされていない場合</h3>
<p>
アプリが N プレビュー SDK でビルドされていないときに、ユーザーがマルチ ウィンドウ モードでそのアプリを使用しようとすると、アプリが向きの固定を宣言しない限り、アプリのサイズが強制的に変更されます。
</p>
<p>
アプリが向きの固定を宣言しない場合、Android N を実行している端末でアプリを起動し、アプリを分割画面モードにすることを試みる必要があります。
アプリのサイズが強制的に変更されたときに、ユーザー エクスペリエンスが許容範囲内にあることを確認してください。
</p>
<p>
アプリが向きの固定を宣言する場合、アプリをマルチ ウィンドウ モードにすることを試みる必要があります。
アプリをマルチ ウィンドウ モードにすることを試みたとき、アプリが全画面モードのままであることを確認してください。
</p>
<h3 id="test-mw">マルチ ウィンドウ モードをサポートする場合</h3>
<p>
アプリが N プレビュー SDK でビルドされていて、マルチ ウィンドウ モードが無効になっていない場合、分割画面モードとフリーフォーム モードの両方で次の動作を確認してください。
</p>
<ul>
<li>アプリを全画面モードで起動してから、オーバービュー ボタンを長押しして、マルチ ウィンドウ モードに切り替えます。
モードが適切に切り替わることを確認します。
</li>
<li>アプリをマルチ ウィンドウ モードで直接起動し、アプリが適切に起動することを確認します。
オーバービュー ボタンを押すと、アプリをマルチ ウィンドウ モードで起動できます。次に、アプリのタイトルバーを長押しし、アプリを画面上の強調表示された領域のいずれかにドラッグします。
</li>
<li>分割画面モードで分割線をドラッグして、アプリのサイズを変更します。
アプリがクラッシュせずに、アプリのサイズが変更され、必要な UI 要素が表示されることを確認します。
</li>
<li>アプリの最小ディメンションを指定している場合、アプリのサイズをそれらのディメンション以下にすることを試みてください。
アプリのサイズを指定最小ディメンションよりも小さくできないことを確認してください。
</li>
<li>すべてのテストを通じて、アプリのパフォーマンスが許容範囲内にあることを確認してください。たとえば、アプリのサイズを変更した後、UI の更新に大きな遅延がないことを確認してください。
</li>
</ul>
<h4 id="test-checklist">チェックリストのテスト</h4>
<p>
アプリのパフォーマンスをマルチ ウィンドウ モードで確認するには、以下の操作を試みてください。
特に記載のない限り、分割画面モードとマルチ ウィンドウ モードの両方でこれらの操作を試みる必要があります。
</p>
<ul>
<li>マルチ ウィンドウ モードを有効にしてから無効にします。
</li>
<li>1 つのアプリから別のアプリに切り替えたとき、最初のアプリの動作が適切であり、表示されているが、アクティブになっていないことを確認します。
たとえば、アプリがビデオを再生している場合、ユーザーが別のアプリを操作しているときに、アプリでビデオの再生が継続していることを確認します。
</li>
<li>分割画面モードで分割線を移動して、アプリの拡大および縮小を試みてください。
アプリを並べて表示しているときと重ねて表示しているときの両方でこれらの操作を試みてください。
アプリがクラッシュせず、基本的な機能が表示され、サイズ変更の操作に時間がかかり過ぎないことを確認します。
</li>
<li>続けざまにサイズ変更の操作を行います。アプリがクラッシュしたり、メモリリークが発生したりしないことを確認します。
アプリのメモリリークをチェックする方法の詳細については、<a href="{@docRoot}tools/debugging/debugging-memory.html">RAM の使用状況を調査する</a>をご覧ください。
</li>
<li>さまざまなウィンドウ構成でアプリを通常の方法で使用し、アプリが適切に動作することを確認します。
テキストが読み取り可能であり、UI 要素が操作に支障をきたすほど小さくないことを確認します。
</li>
</ul>
<h3 id="test-disabled-mw">マルチ ウィンドウのサポートを無効にしている場合</h3>
<p>
<code>android:resizableActivity="false"</code> を設定して、マルチ ウィンドウのサポートを無効にした場合は、Android N を実行している端末でアプリを起動し、アプリをフリーフォーム モードおよび分割画面モードにすることを試みる必要があります。
アプリをマルチ ウィンドウ モードにすることを試みたとき、アプリが全画面モードのままであることを確認してください。
</p>

View File

@@ -0,0 +1,214 @@
page.title=言語とロケール
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容:</h2>
<ol>
<li><a href="#preN">言語リソースの解決における課題</a></li>
<li><a href="#postN">リソース解決方針の改善</a></li>
<li><a href="#design">追加のロケールをサポートするためのアプリ設計
</a></li>
</ol>
</div>
</div>
<p>Android N では、複数言語のユーザーのサポートが強化されており、設定で複数のロケールを選択できます。
Android N ではこの機能を提供するために、サポート対象のロケール数を大幅に拡大し、システムがリソースを解決する方法を変更しました。
この新しいリソース解決方法は、より堅牢で、既存の APK との互換性を保つよう設計されていますが、予想外の動作には十分に注意してください。
たとえば、アプリで目的の言語がデフォルトに設定されているかをテストする必要があります。
また、アプリで複数の言語をサポートする場合、そのサポートが意図したとおりに機能するかを確かめてください。
最後に、明示的にサポートを設計していない言語については、アプリで適切に処理する必要があります。
</p>
<p>このドキュメントでは最初に、Android N より前のバージョンのリソース解決方針について説明します。次に、Android N の改善されたリソース解決方針について説明します。
最後に、増大したロケールを活用し、より多くの複数言語ユーザーをサポートする方法について説明します。
</p>
<h2 id="preN">言語リソースの解決における課題</h2>
<p>Android N より前のバージョンの Android では、アプリとシステムのロケールを一致させることができない場合がありました。
たとえば、アプリのデフォルトの言語が米国英語で、{@code es_ES} リソース ファイルでスペイン語の文字列もローカライズされていたとします。
</p>
<p>Java コードが文字列を参照したとき、次のように文字列の言語を解決していました。
</p>
<ul>
<li>端末が {@code es_MX}(スペイン語 - メキシコに設定されていた場合、Android は {@code es_ES} リソース ファイルから文字列を読み込みます。
</li>
<li>端末が {@code en_AU} に設定されていた場合、Android は代わりに {@code
en_US} を読み込みます。ユーザーがアプリでまったくサポートされていないフランス語などを選択した場合にも、システムはデフォルトの {@code en_US} を読み込みます。
</li>
</ul>
<p>これらの解決の問題は、完全一致が見つからなかった場合に、ロケールの国コードが無視されることが原因で起こります。
次に例を示します。</p>
<p class="table-caption" id="t-resource-res">
<strong>表 1.</strong> ロケールの完全一致がない場合のリソース解決
</p>
<table>
<tbody>
<tr>
<th>ユーザー設定</th>
<th>アプリのリソース</th>
<th>リソース解決</th>
</tr>
<tr>
<td>fr_CH</td>
<td>
デフォルトen<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
fr_CH を試行 =&gt; 失敗<br>
fr を試行 =&gt; 失敗<br>
デフォルトenを使用
</td>
</tr>
</tbody>
</table>
<p>この例では、システムはユーザーが英語を理解できるかどうかを認識せず、英語の文字列を表示します。
この動作は現在、ごく一般的です。
Android N では、このような状況が大幅に削減されるはずです。
</p>
<h2 id="postN">リソース解決方針の改善</h2>
<p>Android N は、より堅牢なリソース解決を導入しており、自動的に適切な代替言語を見つけます。
ただし、解決を迅速化し保守性を向上させるには、最も一般的な親言語でリソースを保存する必要があります。
たとえば、これまで {@code es-US} ディレクトリにスペイン語のリソースを保存していた場合、{@code es-419} ディレクトリに移動します。ここには、ラテンアメリカのスペイン語が格納されます。
同様に {@code en-GB} という名前のフォルダにリソースを保存している場合、そのフォルダの名前を {@code en-001}(国際英語)に変更します。<code>en-GB</code> 文字列の最も一般的な親言語は {@code en-001} であるためです。
次の例では、このような対応がリソース解決のパフォーマンスと信頼性を向上する根拠について説明します。
</p>
<h3>リソース解決の例</h3>
<p>Android N では、<strong>表 1</strong> で説明した例の解決方法が異なります。
</p>
<p class="table-caption" id="t-improved-res">
<strong>表 2.</strong> ロケールの完全一致が存在しない場合の改善された解決方針
</p>
<table>
<tr>
<th>ユーザー設定</th>
<th>アプリのリソース</th>
<th>リソース解決</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
デフォルトen<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
fr_CH を試行 =&gt; 失敗<br>
fr を試行 =&gt; 失敗<br>
fr の子言語を試行 =&gt; fr_FR<br>
fr_FR を使用
</td>
</tr>
</table>
<p>これで、ユーザーは英語ではなくフランス語のリソースを利用できます。この例は、フランス語の文字列を Android N の {@code fr_FR} ではなく {@code fr} に保存すべき理由も示しています。これが、最も近い親言語と一致させ、迅速に解決し、予測しやすくするための対策になります。
</p>
<p>この改善された解決ロジックに加えて、Android では、選択できるユーザー言語を増やしました。
もう一度上記の例で説明します。今回は、追加のユーザー言語としてイタリア語が指定され、アプリはフランス語をサポートしていません。
</p>
<p class="table-caption" id="t-2d-choice">
<strong>表 3.</strong> アプリがユーザーの 2 番目に優先されるロケール設定のみと一致する場合のリソース解決
</p>
<table>
<tr>
<th>ユーザー設定</th>
<th>アプリのリソース</th>
<th>リソース解決</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
<li> it_CH</li>
</ol>
</td>
<td>
デフォルトen<br>
de_DE<br>
es_ES<br>
it_IT<br>
</td>
<td>
fr_CH を試行 =&gt; 失敗<br>
fr を試行 =&gt; 失敗<br>
fr の子を試行 =&gt; 失敗<br>
it_CH を試行 =&gt; 失敗<br>
it を試行 =&gt; 失敗<br>
it の子言語を試行 =&gt; it_IT<br>
it_IT を使用
</td>
</tr>
</table>
<p>アプリでフランス語をサポートしていなくても、ユーザーが理解できる言語が使用されます。
</p>
<h2 id="design">追加のロケールをサポートするためのアプリ設計</h2>
<h3>LocaleList API</h3>
<p>Android N では、新しい API {@code LocaleList.GetDefault()} が加わりました。これにより、アプリは直接、ユーザーが指定した言語のリストを問い合わせることができます。
この API を使用すると、アプリの動作がさらに洗練され、コンテンツの表示がより最適化されます。
たとえば検索で、ユーザーの設定に基づいて複数の言語で結果を表示できます。
ブラウザ アプリは、ユーザーが理解できる言語の翻訳ページを表示することがなくなり、キーボード アプリは、自動的に最適なレイアウトを有効にすることができます。
</p>
<h3>フォーマッタ</h3>
<p>Android 6.0API レベル 23までは、Android は多くの一般的な言語en、es、ar、fr、ruに対して 1 つか 2 つのロケールのみをサポートしていました。
各言語にはわずかなバリエーションしかなかったため、アプリはリソース ファイルでハードコーディングされた文字列として数字や日付を保存し、処理することができました。
しかし Android で幅広いロケールのセットがサポートされるようになったため、日付、時刻、通貨などの情報は、1 つのロケール内でも形式が大幅に異なる場合があります。
形式をハードコーディングすると、エンドユーザーが混乱するおそれがあります。
したがって、Android N で開発するときは、数字や日付の文字列をハードコーディングせず、必ずフォーマッタを使用してください。
</p>
<p>その良い例がアラビア語です。アラビア語のロケールのサポートは {@code ar_EG} の 1 つだけでしたが、Android N では 27 に増えました。
これらのロケールは、ほとんどのリソースを共有できますが、数字は ASCII 表記とネイティブ表記で好みが分かれています。
たとえば、「4 桁の PIN を選択してください」など、数字の変数を含む文を作成する場合、以下のようにフォーマッタを使用します。
</p>
<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>

View File

@@ -0,0 +1,328 @@
page.title=通知
page.tags=notifications
helpoutsWidget=true
page.image=/preview/images/notifications-card.png
trainingnavtop=true
@jd:body
<div id="qv-wrapper">
<div id="qv">
<!-- table of contents -->
<h2>このドキュメントの内容</h2>
<ol>
<li><a href="#direct">ダイレクト リプライ</a></li>
<li><a href="#bundle">バンドル通知</a></li>
<li><a href="#custom">カスタムビュー</a></li>
</ol>
</div>
</div>
<p>Android N には、アプリが視認性の高いインタラクティブな通知をポストできるようにする新しい API がいくつか導入されています。
</p>
<p>Android N では、ハンドセットでインライン リプライをサポートするために、既存の {@link android.support.v4.app.RemoteInput} 通知 API が拡張されています。
これらの機能を使用すると、ユーザーは、アプリにアクセスすることなく、通知シェードからすばやく応答できます。
</p>
<p>
Android N では、類似した通知をバンドルして、単一の通知として表示することもできます。
このバンドルを可能にするために、Android N では、既存の {@link
android.support.v4.app.NotificationCompat.Builder#setGroup
NotificationCompat.Builder.setGroup()} メソッドが使用されます。ユーザーは、各通知を展開して、通知シェードから個別に返信や消去などのアクションを各通知に対して行うことができます。
</p>
<p>最後に、Android N には、アプリのカスタマイズした通知ビューでシステム デコレーションを活用できるようにする新しい API が追加されています。
これらの API は、通知ビューで、標準のテンプレートを使った一貫した表示を共有できるようにします。
</p>
<p>このドキュメントでは、アプリでこれらの新しい通知機能を使用するときに考慮する必要のある主な変更点について説明します。
</p>
<h2 id="direct">ダイレクト リプライ</h2>
<p>Android N のダイレクト リプライ機能を使用すると、ユーザーは、テキスト メッセージにすばやく応答したり、通知インターフェース内でタスク リストを直接アップデートしたりできます。
ハンドヘルド デバイスでは、インライン リプライ アクションが、通知にアタッチされた追加ボタンとして表示されます。
ユーザーがキーボード経由で返信する場合、通知アクション向けに指定したインテントにテキストによる応答がアタッチされ、そのインテントがハンドヘルド デバイス用アプリに送信されます。
<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
{@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
<p class="img-caption">
<strong>図 1.</strong>Android N に追加された<strong>リプライ</strong> アクション ボタン。
</p>
<h3>インライン リプライ アクションを追加する</h3>
<p>ダイレクト リプライをサポートする通知アクションを作成する方法は次のとおりです。
</p>
<ol>
<li>通知アクションに追加できる {@link android.support.v4.app.RemoteInput.Builder} のインスタンスを作成します。
このクラスのコンストラクタは、システムがテキスト入力のキーとして使用する文字列を受け取ります。
その後、ハンドヘルド デバイス用アプリはそのキーを使用して、入力テキストを取得します。
<pre>
// Key for the string that's delivered in the action's intent
private static final String KEY_TEXT_REPLY = "key_text_reply";
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
</pre>
</li>
<li> <code>addRemoteInput()</code> を使用して、{@link android.support.v4.app.RemoteInput} オブジェクトをアクションにアタッチします。
<pre>
// Create the reply action and add the remote input
Notification.Action action =
new Notification.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
.build();
</pre>
</li>
<li>アクションを通知に適用し、通知を発行します。
<pre>
// Build the notification and add the action
Notification notification =
new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.content))
.addAction(action))
.build();
// Issue the notification
NotificationManager notificationManager =
NotificationManager.from(mContext);
notificationManager.notify(notificationId, notification);
</pre>
</li>
</ol>
<p> ユーザーが通知アクションをトリガーすると、ユーザーは応答を入力するよう求められます。
</p>
<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
{@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
<p class="img-caption">
<strong>図 2.</strong>ユーザーは通知シェードでテキスト メッセージを入力できます。
</p>
<h3>インライン リプライからユーザー入力を取得する</h3>
<p>リプライ アクションのインテントで宣言したアクティビティで、通知インターフェースからのユーザー入力を取得する方法は次のとおりです。
</p>
<ol>
<li> 通知アクションのインテントを入力パラメータとして渡すことにより、{@link android.support.v4.app.RemoteInput#getResultsFromIntent
getResultsFromIntent()} を呼び出します。
このメソッドは、テキストによる応答が含まれた {@link android.os.Bundle} を返します。
</li>
<pre>
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
</pre>
<li>result キー({@link
android.support.v4.app.RemoteInput.Builder} コンストラクタに提供されている)を使用して、バンドルへのクエリを実行します。
</li>
</ol>
<p>次のコード スニペットは、メソッドがバンドルから入力テキストを取得する方法を示しています。
</p>
<pre>
// Obtain the intent that started this activity by calling
// Activity.getIntent() and pass it into this method to
// get the associated string.
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
return null;
}
</pre>
<p>アプリはロジックを適用して、取得したテキストに対して実行するアクションを決定できます。インタラクティブなアプリ(チャットなど)の場合、ユーザーが適切に応答できるように通知自体により多くのコンテキスト(たとえば、ユーザー自身のメッセージを含めた、複数行のチャット履歴)を提供します。ユーザーが {@link android.support.v4.app.RemoteInput} を介して応答する場合は、{@code setRemoteInputHistory()} メソッドを使って、返信履歴にテキスト メッセージを含めます。
</p>
<h2 id="bundle">バンドル通知</h2>
<p>Android N は、通知のキューを表す新しい方法である
<i>バンドル通知をデベロッパーに提供します</i>。この機能は、Android Wear の<a href="{@docRoot}training/wearables/notifications/stacks.html">通知スタック</a>機能に似ています。
たとえば、受信したメッセージの通知をアプリで作成する場合、複数のメッセージが受信されると、通知が単一のグループにバンドルされます。
既存の {@link android.support.v4.app.NotificationCompat.Builder#setGroup
Builder.setGroup()} メソッドを使用して、同様の通知をバンドルできます。
</p>
<p>
通知グループでは、通知グループを構成する通知が階層化されます。
この階層の最上位には、そのグループの概要情報を表示する親通知があります。
ユーザーは通知グループを順次展開できます。ユーザが階層を深くたどると、より多くの情報が表示されます。
ユーザーがバンドルを展開すると、すべての子通知の詳細情報が表示されます。ユーザーがいずれかの通知を展開すると、その内容がすべて表示されます。
</p>
<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
{@docRoot}preview/images/bundles_2x.png 2x" width="300">
<p class="img-caption">
<strong>図 3.</strong>ユーザーは通知グループを順次展開できます。
</p>
<p>通知をグループに追加する方法については、<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">各通知をグループに追加する</a>をご覧ください。
</p>
<h3 id="best-practices">バンドル通知のベストプラクティス</h3>
<p>このセクションでは、前のバージョンの Android プラットフォームで利用可能な {@link android.app.Notification.InboxStyle InboxStyle} 通知の代わりに、通知グループを使用する必要がある状況についてのガイドラインを提供します。
</p>
<h3>バンドル通知を使用するとき</h3>
<p>ユースケースで次のすべての条件が満たされた場合にのみ通知グループを使用する必要があります。
</p>
<ul>
<li>子通知が完全な通知であり、グループの概要なしに、子通知を個別に表示できる。
</li>
<li>子通知を個別に表示するメリットがある。次に例を示します。
</li>
<ul>
<li>子通知がアクション可能であり、各子通知に固有のアクションがある。</li>
<li>ユーザーが読みたい多くの情報が子通知にある。</li>
</ul>
</ul>
<p>通知グループの適切なユースケースの例には、着信メッセージのリストを表示するメッセージング アプリや受信したメールのリストを表示するメールアプリなどが含まれます。
</p>
<p>
単一の通知が望ましいユースケースの例には、1 人のユーザーからの個別メッセージや、1 行のテキスト アイテムのリスト表示が含まれます。
このリスト表示を行うには、
{@link android.app.Notification.InboxStyle InboxStyle} または {@link android.app.Notification.BigTextStyle BigTextStyle} を使用します。
</p>
<h3 id ="post">バンドル通知を表示する</h3>
<p>
アプリは、グループに単一の子通知が含まれている場合でも、グループの概要を常にポストする必要があります。
グループに単一の通知のみが含まれている場合、システムによって、概要の表示が非表示になり、子通知が直接表示されます。
これにより、ユーザーがグループの子通知をスワイプして消すときに一貫した使用感が出ます。
</p>
<p class="note">
<strong>注:</strong> このバージョンの Android N では、単一の子通知が含まれる通知グループの概要を非表示にできません。
この機能は、将来のバージョンの Android N に追加されます。
</p>
<h3>通知をピークする</h3>
<p>通常、子通知はグループとして表示されますが、子通知を<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">ヘッドアップ通知</a>として一時的に表示するように設定できます。
この機能は、特に最新の子通知とその関連するアクションへの即時アクセスを可能にするので便利です。
</p>
<h3>下位互換性</h3>
<p>
Android 5.0API レベル 21以降では、Android Wear 端末をサポートするために、通知グループとリモート入力が {@link
android.app.Notification} API の一部になっています。
これらの API を使用して通知を既に作成している場合は、アプリの動作が上記のガイドラインに適合していることの確認と、{@code
setRemoteInputHistory()} の実装検討のみを行ってください。
</p>
<p>
下位互換性をサポートするために、サポート ライブラリの {@link android.support.v4.app.NotificationCompat} クラスで同じ API が利用できるようになっているため、前の Android バージョンで機能する通知を作成できます。
携帯端末とタブレットでは、概要通知のみがユーザーに表示されるため、アプリは、受信トレイスタイルやグループの全情報を表す同等の通知を引き続きサポートする必要があります。
Android Wear 端末では、古いプラットフォーム レベル上にもすべての子通知が表示されるため、API レベルに関係なく、子通知を作成する必要があります。
</p>
<h2 id="custom"> カスタムビュー</h2>
<p>Android N 以降では通知ビューをカスタマイズでき、通知ヘッダー、アクション、展開レイアウトなどのシステム デコレーションを引き続き取得できます。
</p>
<p>この機能を有効にするために、Android N には、カスタムビューにスタイルを適用する次の API が追加されています。
</p>
<dl>
<dt>
{@code DecoratedCustomViewStyle()}</dt>
<dd> メディア通知以外の通知にスタイルを適用します。
</dd>
<dt>
{@code DecoratedMediaCustomViewStyle()}</dt>
<dd> メディア通知にスタイルを適用します。</dd>
</dl>
<p>この新しい API を使用するには、{@code setStyle()} メソッドを呼び出し、目的のカスタムビュー スタイルに渡します。
</p>
<p>次のコード スニペットは、{@code DecoratedCustomViewStyle()} メソッドでカスタム通知オブジェクトを作成する方法を示しています。
</p>
<pre>
Notification noti = new Notification.Builder()
.setSmallIcon(R.drawable.ic_stat_player)
.setLargeIcon(albumArtBitmap))
.setCustomContentView(contentView);
.setStyle(new Notification.DecoratedCustomViewStyle())
.build();
</pre>

View File

@@ -0,0 +1,186 @@
page.title=ピクチャ イン ピクチャ
page.keywords=preview,sdk,PIP,Picture-in-picture
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容</h2>
<ol>
<li><a href="#declaring">アクティビティがピクチャ イン ピクチャをサポートしていることを宣言する
</a></li>
<li><a href="#pip_button">アクティビティをピクチャ イン ピクチャに切り替える</a>
</li>
<li><a href="#handling_ui">ピクチャ イン ピクチャの実行中に UI を処理する</a>
</li>
<li><a href="#continuing_playback">ピクチャ イン ピクチャの実行中にビデオの再生を続行する
</a></li>
<li><a href="#best">ベスト プラクティス</a></li>
</ol>
<h2>関連ドキュメント</h2>
<ol>
<li><a href="{@docRoot}preview/features/multi-window.html">マルチ ウィンドウのサポート
</a></li>
</ol>
</div>
</div>
<p>Android N では、Android TV ユーザーは、アプリを操作するときに画面の隅に固定されたウィンドウでビデオを視聴できるようになりました。
ピクチャ イン ピクチャPIPモードを使用すると、アプリはバックグランドで別のアクティビティを続けながら、固定されたウィンドウでビデオ アクティビティを実行できるようになります。
PIP ウィンドウでは、アプリの使用中にマルチタスクを実行できます。これにより、ユーザーの作業効率が向上します。
</p>
<p>アプリで、PIP モードをトリガーするタイミングを決めることができます。次に、PIP モードの開始時点の例を示します。
</p>
<ul>
<li>ユーザーが別のコンテンツを閲覧するためにビデオから別のコンテンツに切り替えると、アプリはビデオを PIP モードに切り替えることができます。
</li>
<li>コンテンツのエピソード終了の画面が表示されている間、アプリはビデオを PIP モードに切り替えることができます。
メイン画面には、シリーズの次のエピソードに関するプロモーションや概要の情報が表示されます。
</li>
<li>アプリで、ユーザーがビデオを視聴している間に、追加のコンテンツのキューを作成する方法を提供できます。
メイン画面でコンテンツの選択アクティビティを表示している間に、ビデオは PIP モードで再生を続行できます。
</li>
</ul>
<p>PIP ウィンドウは 240 x 135 dp で、画面の 4 つのコーナーのうちいずれかの一番上のレイヤに表示されます。表示する場所はシステムによって選択されます。
ユーザーは PIP メニューを表示して、PIP ウィンドウを全画面表示に切り替えたり、リモコンの [<b>Home</b>] ボタンを押して PIP ウィンドウを閉じたりすることができます。
別のビデオがメイン画面で再生を開始すると、PIP ウィンドウは自動的に閉じます。
最近使ったアプリから PIP ウィンドウを閉じることもできます。</p>
<img src="{@docRoot}preview/images/pip-active.png" />
<p class="img-caption"><strong>図 1.</strong> ユーザーがメイン画面でコンテンツを閲覧中に画面の隅に表示されるピクチャ イン ピクチャのビデオ
</p>
<p>PIP では、Android N で使用可能なマルチウィンドウ API を活用し、固定されたビデオ オーバーレイ ウィンドウを表示します。
PIP をアプリに追加するには、PIP をサポートするアクティビティを登録し、必要に応じてアクティビティを PIP モードに切り替えて、UI 要素を非表示にして、アクティビティが PIP モードを開始してもビデオの再生が続行されるようにします。
</p>
<h2 id="declaring">アクティビティがピクチャ イン ピクチャをサポートしていることを宣言する</h2>
<p>デフォルトでは、システムはアプリの PIP を自動的にサポートしません。アプリで PIP をサポートする場合、マニフェストで
<code>android:supportsPictureInPicture</code> および
<code>android:resizeableActivity</code> を <code>true</code> に設定して、ビデオ アクティビティを登録します。
また、アクティビティがレイアウトの設定変更を処理するように指定して、PIP モードの遷移中にレイアウト変更が発生しても、アクティビティが再開しないようにします。
</p>
<pre>
&lt;activity android:name="VideoActivity"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
</pre>
<p>アクティビティを登録する際は、PIP モードでは、アクティビティが TV 画面の小さなオーバーレイ ウィンドウに表示される点に注意してください。
ビデオの再生アクティビティは、最小限の UI にすることで最高のユーザー エクスペリエンスを提供できます。
小さな UI 要素を含むアクティビティでは、PIP モードに切り替えたときに優れたユーザー エクスペリエンスを提供できない可能性があります。PIP ウィンドウでは、その UI 要素の詳細が見えづらくなるためです。
</p>
<h2 id="pip_button">アクティビティをピクチャ イン ピクチャに切り替える</h2>
アクティビティを PIP モードに切り替える必要があるときは、
<code>Activity.enterPictureInPicture()</code> を呼び出します。次の例では、ユーザーがメディア コントロール バーにある専用の PIP ボタンを選択したときに、PIP モードに切り替わります。
</p>
<pre>
&#64;Override
public void onActionClicked(Action action) {
if (action.getId() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPicture();
return;
}
...
</pre>
<p>メディア コントロール バーに PIP ボタンを追加すると、ユーザーがビデオの再生を操作中に、簡単に PIP モードに切り替えることができます。
</p>
<img src="{@docRoot}preview/images/pip-button.png" />
<p class="img-caption"><strong>図 1.</strong> メディア コントロール バー上の [Picture-in-picture] ボタン
</p>
<p>Android N には、新しい
<code>PlaybackControlsRow.PictureInPictureAction</code> クラスが含まれています。このクラスは、コントロール バーの PIP アクションと PIP アイコンの使用方法を定義します。
</p>
<h2 id="handling_ui">ピクチャ イン ピクチャの実行中に UI を処理する</h2>
<p>アクティビティが PIP モードを開始したら、ビデオの再生のみを表示する必要があります。
アクティビティが PIP を開始する前に UI 要素を削除して、再び全画面表示に戻ったら、削除した要素を復元します。<code>Activity.onPictureInPictureChanged()</code> または
<code>Fragment.onPictureInPictureChanged()</code> をオーバーライドして、必要に応じて UI 要素を有効または無効にします。次に例を示します。
</p>
<pre>
&#64;Override
public void onPictureInPictureChanged(boolean inPictureInPicture) {
if (inPictureInPicture) {
// Hide the controls in picture-in-picture mode.
...
} else {
// Restore the playback UI based on the playback status.
...
}
}
</pre>
<h2 id="continuing_playback">ピクチャ イン ピクチャの実行中にビデオの再生を続行する
</h2>
<p>アクティビティを PIP に切り替えると、システムはそのアクティビティを一時停止状態と見なして、アクティビティの <code>onPause()</code> メソッドを呼び出します。
PIP モードによってアクティビティが一時停止になっても、ビデオの再生は一時停止せず、再生を続ける必要があります。
アクティビティの
<code>onPause()</code> メソッドで PIP を確認し、適切に再生を処理してください。次に例を示します。
</p>
<pre>
&#64;Override
public void onPause() {
// If called due to PIP, do not pause playback
if (inPictureInPicture()) {
// Continue playback
...
}
// If paused but not in PIP, pause playback if necessary
...
}
</pre>
<p>アクティビティが PIP モードを終了して全画面モードに戻ると、システムはアクティビティを再開して <code>onResume()</code> メソッドを呼び出します。
</p>
<h2 id="best">ベスト プラクティス</h2>
<p>PIP は、ビデオを全画面表示で再生するアクティビティに使用します。アクティビティを PIP モードに切り替えるときは、ビデオ コンテンツ以外は何も表示しないでください。アクティビティが PIP モードを開始したタイミングを検出し、<a href="#handling_ui">ピクチャ イン ピクチャの実行中に UI を処理する</a>で説明したように、UI 要素を非表示にします。
</p>
<p>PIP ウィンドウは画面の隅にフローティング ウィンドウとして表示されるため、メイン画面のどの場所にも重要な情報を表示しないでください。PIP ウィンドウによって隠れる可能性があります。
</p>
<p>アクティビティが PIP モードになると、デフォルトで、入力フォーカスは失われます。PIP モードで動作中に入力イベントを受け付けるには、
<code>MediaSession.setMediaButtonReceiver()</code> を使用します。
</p>

View File

@@ -0,0 +1,124 @@
page.title=特定のディレクトリへのアクセス
page.keywords=preview,sdk,scoped directory access
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容</h2>
<ol>
<li><a href="#accessing">外部ストレージのディレクトリへのアクセス</a></li>
<li><a href="#removable">リムーバブル メディアのディレクトリへのアクセス</a></li>
<li><a href="#best">ベスト プラクティス</a></li>
</ol>
</div>
</div>
<p>写真アプリなどは通常、外部ストレージの特定のディレクトリ(<code>Pictures</code> ディレクトリなど)のみにアクセスする必要があります。
外部ストレージへのアクセスに関する従来のアプローチでは、このようなアプリに目的のディレクトリへのアクセスを容易に提供できる設計にはなっていませんでした。
次に例を示します。</p>
<ul>
<li>マニフェストで {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} または {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} を要求すると、外部ストレージ上のすべての公開ディレクトリにアクセスできますが、この場合、アプリが不要な場所にもアクセスできます。
</li>
<li><a href="{@docRoot}guide/topics/providers/document-provider.html">ストレージ アクセス フレームワーク</a>を使用すると、通常、ユーザーはシステム UI を使用してディレクトリを選択できますが、アプリが常に同じ外部ディレクトリにアクセスする場合、この選択は不要です。Android N では、一般的な外部ストレージ ディレクトリにアクセスできる、新しいシンプルな API を提供します。
</li>
</ul>
<p>
</p>
<h2 id="accessing">外部ストレージのディレクトリへのアクセス</h2>
<p><code>StorageManager</code> クラスを使用して、適切な
<code>StorageVolume</code> インスタンスを取得します。次に、そのインスタンスの
<code>StorageVolume.createAccessIntent()</code> メソッドを呼び出して、インテントを作成します。このインテントを使用して、外部ストレージのディレクトリにアクセスします。
リムーバブル メディア ボリュームなど、使用できるすべてのボリュームのリストを取得するには、
<code>StorageManager.getVolumesList()</code> を使用します。
</p>
<p>次のコード スニペットは、プライマリ共有ストレージの
<code>Pictures</code> ディレクトリを開く方法の例を示しています。</p>
<pre>
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<p>システムは外部ディレクトリへのアクセスの付与を試行し、必要に応じてシンプルな UI で、ユーザーにアクセスを確認します。
</p>
<img src="{@docRoot}preview/images/scoped-folder-access-framed.png" srcset="{@docRoot}preview/images/scoped-folder-access-framed.png 1x,
{@docRoot}preview/images/scoped-folder-access-framed_2x.png 2x" />
<p class="img-caption"><strong>図 1.</strong> Pictures ディレクトリへのアクセスを要求するアプリケーション
</p>
<p>ユーザーがアクセスを付与すると、
<code>Activity.RESULT_OK</code> の結果コードと、URI を含むインテント データを指定して、
<code>onActivityResult()</code> のオーバーライドを呼び出します。提供された URI を使用して、ディレクトリの情報にアクセスします。これは、<a href="{@docRoot}guide/topics/providers/document-provider.html">ストレージ アクセス フレームワーク</a>で返された URI を使用する場合と同様です。
</p>
<p>ユーザーがアクセスを付与しなかった場合は、
<code>Activity.RESULT_CANCELED</code> の結果コードと、null のインテント データを指定して、
<code>onActivityResult()</code> のオーバーライドを呼び出します。</p>
<p class="note"><b>注:</b> 特定の外部ディレクトリへのアクセスを取得すると、そのディレクトリ内のサブディレクトリへのアクセスも取得します。
</p>
<h2 id="removable">リムーバブル メディアのディレクトリへのアクセス</h2>
<p>特定のディレクトリへのアクセスを使用してリムーバブル メディア上のディレクトリにアクセスするには、まず {@link android.os.Environment#MEDIA_MOUNTED} 通知をリッスンする {@link android.content.BroadcastReceiver} を追加します。次に例を示します。
</p>
<pre>
&lt;receiver
android:name=".MediaMountedReceiver"
android:enabled="true"
android:exported="true" &gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MEDIA_MOUNTED" /&gt;
&lt;data android:scheme="file" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>ユーザーが SD カードなどのリムーバブル メディアをマウントすると、システムは
{@link android.os.Environment#MEDIA_MOUNTED} 通知を送信します。この通知は、インテント データ内の <code>StorageVolume</code> オブジェクトを提供します。このオブジェクトを使用して、リムーバブル メディア上のディレクトリにアクセスできます。
次の例では、リムーバブル メディア上の <code>Pictures</code> ディレクトリにアクセスします。
</p>
<pre>
// BroadcastReceiver has already cached the MEDIA_MOUNTED
// notification Intent in mediaMountedIntent
StorageVolume volume = (StorageVolume)
mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<h2 id="best">ベスト プラクティス</h2>
<p>外部ディレクトリのアクセス URI はできる限り保持してください。そうすれば、ユーザーに何度もアクセス要求をする必要がなくなります。
ユーザーがアクセスを付与したら、ディレクトリのアクセス URI を指定して
<code>getContentResolver().takePersistableUriPermssion()</code> を呼び出します。
システムが URI を保持し、以降のアクセス要求では <code>RESULT_OK</code> を返して、ユーザーに確認の UI を表示しません。
</p>
<p>ユーザーが外部ディレクトリへのアクセスを拒否した直後に、またアクセスを要求しないようにしてください。
何度もアクセスを要求すると、ユーザー エクスペリエンスが低下します。
</p>

View File

@@ -0,0 +1,744 @@
page.title=ネットワーク セキュリティ構成
page.keywords=preview,security,network
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容</h2>
<ol>
<li><a href="#manifest">セキュリティ構成ファイルの追加</a></li>
<li><a href="#CustomTrust">信頼できる CA のカスタマイズ</a>
<ol>
<li><a href="#ConfigCustom">信頼できる CA の構成</a></li>
<li><a href="#LimitingCas">信頼できる CA の制限</a></li>
<li><a href="#TrustingAdditionalCas">信頼できる CA の追加</a></li>
</ol>
</li>
<li><a href="#TrustingDebugCa">デバッグ限定の CA</a></li>
<li><a href="#UsesCleartextTraffic">クリアテキスト トラフィックのオプトアウト</a></li>
<li><a href="#CertificatePinning">証明書のピン留め</a></li>
<li><a href="#ConfigInheritance">構成の継承の動作</a></li>
<li><a href="#FileFormat">構成ファイルの形式</a></li>
</ol>
</div>
</div>
<p>
Android N には、ネットワーク セキュリティ構成機能が含まれています。これにより、アプリのコードを修正しなくても、安全な宣言型構成ファイルで、アプリのネットワーク セキュリティの設定をカスタマイズできます。
これらの設定は、特定のドメインおよび特定のアプリに対して構成できます。
主な機能は次のとおりです。
</p>
<ul>
<li>
<b>カスタム トラスト アンカー:</b>アプリのセキュアな接続にどの証明機関CAを信頼するかをカスタマイズできます。
たとえば、特定の自己署名証明書や制限された一連の公的 CA を信頼できます。
</li>
<li>
<b>デバッグ限定のオーバーライド:</b>インストール ベースに対する追加リスクなしに、アプリのセキュアな接続を安全にデバッグできます。<b>クリアテキスト トラフィックのオプトアウト:</b>
</li>
<li>
クリアテキスト トラフィックの意図しない使用からアプリを保護できます。
</li>
<li>
<b>証明書のピン留め:</b>アプリのセキュアな接続を特定の証明書に制限します。
</li>
</ul>
<h2 id="manifest">セキュリティ構成ファイルの追加</h2>
<p>
ネットワーク セキュリティ構成機能は、XML ファイルを使用します。このファイルで、アプリの設定を指定できます。
アプリのマニフェストに、このファイルを指すエントリを含める必要があります。
次のコードはマニフェストからの抜粋で、このエントリの作成方法を示しています。
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
...
&lt;app ...&gt;
&lt;meta-data android:name="android.security.net.config"
android:resource="@xml/network_security_config" /&gt;
...
&lt;/app&gt;
</pre>
<h2 id="CustomTrust">信頼できる CA のカスタマイズ</h2>
<p>
アプリで、プラットフォームのデフォルトの設定ではなく、カスタマイズした一連の CA を信頼することが必要な場合があります。
主な理由は次のとおりです。
</p>
<ul>
<li>カスタムの証明機関(自己署名、社内の CA で発行など)を使用してホストに接続する。
</li>
<li>プレインストールされたすべての CA ではなく、信頼する一部の CA のみに制限する。
</li>
<li>システムに含まれていない追加の CA を信頼する。
</li>
</ul>
<p>
デフォルトで、すべてのアプリのセキュアな接続TLS、HTTPS など)は、システムにプレインストールされた CA を信頼し、API レベル 23Android M以下をターゲットにしたアプリは、ユーザーが追加した CA も信頼します。
アプリは {@code base-config}(アプリ全体のカスタマイズ)または {@code domain-config} (ドメイン単位のカスタマイズ)を使用して、独自の接続をカスタマイズすることもできます。
</p>
<h3 id="ConfigCustom">信頼できる CA の構成</h3>
<p>
自己署名 SSL 証明書を使用するホストか、または信頼できる非パブリック CA社内の CA など)によって SSL 証明書が発行されているホストに接続するケースで説明します。
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
PEM または DER 形式で、自己署名または非パブリック CA 証明書を
{@code res/raw/my_ca} に追加します。
</p>
<h3 id="LimitingCas">信頼できる CA の制限</h3>
<p>
システムによって信頼されているすべての CA をアプリで信頼したくない場合は、信頼する CA を制限できます。
これにより、他の CA が発行した偽造証明書からアプリを保護できます。
</p>
<p>
信頼できる CA を制限するための設定は、特定のドメインで<a href="#TrustingACustomCa">カスタムの CA を信頼する</a>設定と似ています。ただし、リソースで複数の CA を指定できる点が異なります。
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;domain includeSubdomains="true"&gt;cdn.example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/trusted_roots"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
PEM または DER 形式で、信頼できる CA を {@code res/raw/trusted_roots} に追加します。
PEM 形式を使用する場合、そのファイルには PEM データのみを含めるようにして、余分なテキストを含めないでください。<em></em>
1 つだけでなく複数の
<a href="#certificates"><code>&lt;certificates&gt;</code></a> 要素を指定できます。
</p>
<h3 id="TrustingAdditionalCas">
信頼できる CA の追加
</h3>
<p>
システムで信頼されていない CA を、アプリが追加で信頼しなければならない場合があります。これは、システムに CA がまだ組み込まれていなかったり、CA が Android システムに組み込まれるための要件を満たしていないことが原因です。
CA を追加するには、アプリの構成で複数の証明書ソースを指定します。
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/extracas"/&gt;
&lt;certificates src="system"/&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="TrustingDebugCa">デバッグ用の CA の構成</h2>
<p>
HTTPS で接続するアプリをデバッグするときは、運用サーバーの SSL 証明書がインストールされていないローカルの開発サーバーへの接続が必要になります。
アプリのコードを変更せずにこの接続をサポートするには
<i>、</i> {@code debug-overrides} を使用して、<a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a> が {@code true} の場合にのみ信頼されるデバッグ限定の CA を指定できます。
通常、IDE およびビルド ツールによって、非リリース ビルドには自動的にこのフラグが設定されます。
</p>
<p>
この方法は、通常の条件付きコードよりも安全です。セキュリティ対策として、アプリ ストアでは debuggable とマークされたアプリは拒否されるからです。
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/debug_cas"/&gt;
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="UsesCleartextTraffic">クリアテキスト トラフィックのオプトアウト</h2>
<p>
アプリケーションで、セキュアな接続のみを使用して接続する場合、それらの接続先に対してHTTPS ではなく暗号化されていない HTTP プロトコルを使用する)クリアテキストのサポートを除外できます。
このオプションにより、バックエンド サーバーなど外部ソースが提供する URL の変更によって、アプリで思わぬパフォーマンスの低下が発生するのを防ぐことができます。
詳細については、{@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted
NetworkSecurityPolicy.isCleartextTrafficPermitted()} をご覧ください。
</p>
<p>
たとえば、アプリで {@code
secure.example.com} へのすべての接続には常に HTTPS を使用して、機密性の高いトラフィックを有害なネットワークから保護することが必要な場合があります。
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config usesCleartextTraffic="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="CertificatePinning">証明書のピン留め</h2>
<p>
通常、アプリはプレインストールされたすべての CA を信頼します。これらの CA が偽造証明書を発行すると、アプリは MiTM 攻撃のリスクにさらされます。
アプリによっては、信頼する CA を制限するか証明書をピン留めすることで、受け入れる証明書を制限できます。
</p>
<p>
証明書をピン留めするには、公開鍵のハッシュによって証明書のセットを指定しますX.509 証明書の SubjectPublicKeyInfo
証明書チェーンが有効になるのは、証明書チェーンに 1 つ以上のピン留めされた公開鍵が含まれている場合のみです。
</p>
<p>
証明書のピン留めを使用するときは、必ずバックアップの鍵を含めてください。そうすれば、新しい鍵に切り替えたり、CA を変更したりする必要が生じた場合にCA の証明書またはその CA の中間証明書にピン留めしていても)、アプリの接続が影響を受けることはありません。
そうしないと、接続を復元するためにアプリにアップデートをプッシュしなければならなくなります。
</p>
<p>
また、ピン留めの有効期限を設定することもできます。その有効期限を過ぎると、ピン留めが無効になります。
これにより、アップデートされていないアプリの接続の問題を防ぐことができます。
ただし、ピン留めに有効期限を設定すると、ピン留めを回避できるようになります。
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;pin-set expiration="2018-01-01"&gt;
&lt;pin digest="SHA-256"&gt;7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=&lt;/pin&gt;
&lt;!-- backup pin --&gt
&lt;pin digest="SHA-256"&gt;fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=&lt;/pin&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="ConfigInheritance">構成の継承の動作</h2>
<p>
固有の構成で設定されていない値は、継承されます。この動作により、より複雑な構成が可能になるうえ、構成ファイルの読みやすさを維持できます。
</p>
<p>
固有のエントリに値が設定されていない場合、その次に汎用的なエントリの値が使用されます。
{@code domain-config} で設定されていない値は、ネストされている場合は親の {@code domain-config} から、ネストされていない場合は {@code
base-config} から取得されます。
{@code base-config} で設定されていない値には、プラットフォームのデフォルト値を使用します。
</p>
<p>
たとえば、{@code
example.com} のサブドメインに対するすべての接続で、CA のカスタム セットを使用する必要があるケースを考えてみましょう。また、これらのドメインに対するクリアテキストのトラフィックは、{@code
secure.example.com} に接続する場合を除いて許可します。<em></em>
{@code example.com} の構成で {@code
secure.example.com} の構成をネストすることで、
{@code trust-anchors} の重複を回避できます。
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;domain-config cleartextTrafficPermitted="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="FileFormat">構成ファイルの形式</h2>
<p>
ネットワーク セキュリティ構成機能では、XML ファイル形式を使用します。
ファイルの全体的な構造については、次のコード サンプルをご覧ください。
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;domain-config&gt;
&lt;domain&gt;android.com&lt;/domain&gt;
...
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;pin-set&gt;
&lt;pin digest="..."&gt;...&lt;/pin&gt;
...
&lt;/pin-set&gt;
&lt;/domain-config&gt;
...
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
<p>
次のセクションでは、このファイル形式の構文とその他の詳細について説明します。
</p>
<h3 id="network-security-config">
&lt;network-security-config&gt;
</h3>
<dl class="xml">
<dt>
含めることのできる要素:
</dt>
<dd>
0 または 1 つの <code><a href="#base-config">&lt;base-config&gt;</a></code><br>
任意の数の <code><a href=
"#domain-config">&lt;domain-config&gt;</a></code><br>
0 または 1 つの <code><a href="#debug-overrides">&lt;debug-overrides&gt;</a></code>
</dd>
</dl>
<h3 id="base-config">
&lt;base-config&gt;
</h3>
<dl class="xml">
<dt>
構文:
</dt>
</dl>
<pre class="stx">
&lt;base-config <a href=
"#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/base-config&gt;
</pre>
<dl class="xml">
<dt>
含めることのできる要素:
</dt>
<dd>
<code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
説明:
</dt>
<dd>
<a href="#domain-config"><code>domain-config</code></a> に含まれていない接続先に対するすべての接続に使用される、デフォルトの構成。
<p>
設定されていない値はすべて、プラットフォームのデフォルト値を使用します。API レベル 24 以上をターゲットにしたアプリのデフォルトの構成は次のとおりです。
</p>
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
API レベル 23 以下をターゲットにしたアプリのデフォルトの構成は次のとおりです。
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;certificates src="user" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
</dd>
</dl>
<h3 id="domain-config">&lt;domain-config&gt;</h3>
<dl class="xml">
<dt>構文: </dt>
<dd>
<pre class="stx">&lt;domain-config <a href="#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/domain-config&gt;</pre>
</dd>
<dt>含めることのできる要素: </dt>
<dd>
1 つ以上の <code><a href="#domain">&lt;domain&gt;</a></code>
<br/>0 または 1 つの <code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
<br/>0 または 1 つの <code><a href="#pin-set">&lt;pin-set&gt;</code></a>
<br/>任意の数のネストされた <code>&lt;domain-config&gt;</code></dd>
<dt>説明</dt>
<dd>固有の接続先への接続に使用される構成です。{@code domain} 要素の定義に従います。
<p>複数の {@code domain-config} 要素で接続先を指定している場合は、最も具体的な(長い)マッチング ドメイン ルールを持つ構成が採用されます。
</p></dd>
</dl>
<h3 id="domain">&lt;domain&gt;</h3>
<dl class="xml">
<dt>
構文:
</dt>
<dd>
<pre class="stx">
&lt;domain includeSubdomains=["true" | "false"]&gt;example.com&lt;/domain&gt;
</pre>
</dd>
<dt>
属性:
</dt>
<dd>
<dl class="attr">
<dt>
{@code includeSubdomains}
</dt>
<dd>
{@code "true"} の場合、このドメイン ルールはドメインおよびすべてのサブドメイン(サブドメインのサブドメインも含む)に一致します。そうでない場合、このルールは完全一致のみに適用されます。
</dd>
</dl>
</dd>
<dt>
説明:
</dt>
</dl>
<h3 id="debug-overrides">&lt;debug-overrides&gt;</h3>
<dl class="xml">
<dt>
構文:
</dt>
<dd>
<pre class="stx">
&lt;debug-overrides&gt;
...
&lt;/debug-overrides&gt;
</pre>
</dd>
<dt>
含めることのできる要素:
</dt>
<dd>
0 または 1 つの <code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
説明:
</dt>
<dd>
オーバーライドは、<a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a> が {@code "true"} の場合に適用されます。これは通常、IDE およびビルド ツールで生成された非リリース ビルドに使用します。
{@code
debug-overrides} で指定されたトラスト アンカーは、その他すべての構成に追加されます。サーバーの証明書チェーンでデバッグ限定のトラスト アンカーのいずれかを使用するときは、証明書のピン留めは実行されません。
<a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a> が {@code "false"} の場合、このセクションは完全に無視されます。
</dd>
</dl>
<h3 id="trust-anchors">&lt;trust-anchors&gt;</h3>
<dl class="xml">
<dt>
構文:
</dt>
<dd>
<pre class="stx">
&lt;trust-anchors&gt;
...
&lt;/trust-anchors&gt;
</pre>
</dd>
<dt>
含めることのできる要素:
</dt>
<dd>
任意の数の <code><a href="#certificates">&lt;certificates&gt;</a></code>
</dd>
<dt>
説明:
</dt>
<dd>
セキュアな接続に使用するトラスト アンカーのセット。
</dd>
</dl>
<h3 id="certificates">&lt;certificates&gt;</h3>
<dl class="xml">
<dt>構文: </dt>
<dd><pre class="stx">&lt;certificates src=["system" | "user" | "<i>raw resource</i>"]
overridePins=["true" | "false"] /&gt;
</pre></dd>
<dt>説明: </dt>
<dd>{@code trust-anchors} 要素の X.509 証明書のセットです。</dd>
<dt>属性: </dt>
<dd><dl class="attr">
<dt>{@code src}</dt>
<dd>
CA 証明書のソースには、次のいずれかを指定します。
<ul>
<li>X.509 証明書を含むファイルを指す未加工のリソース ID。
証明書は、DER または PEM 形式でエンコードする必要があります。PEM 証明書の場合、ファイルには PEM 以外の余分なデータ(コメントなど)を含めないでください。
<em></em>
</li>
<li>{@code "system"}: プレインストールされたシステムの CA 証明書
</li>
<li>{@code "user"}: ユーザーが追加した CA 証明書
</li>
</ul>
</dd>
<dt>{@code overridePins}</dt>
<dd>
<p>
ソースから取得した CA が証明書のピン留めを回避するかどうかを指定します。{@code
"true"} の場合、証明書チェーンはこのソースから取得したいずれかの CA を使用して作成され、ピン留めは実行されません。
この設定は、CA をデバッグしたり、アプリのセキュアなトラフィックでユーザーの MiTM の許可をサポートするために役立ちます。
</p>
<p>
デフォルトは {@code "false"} です。ただし、{@code debug-overrides} 要素で指定された場合のデフォルトは {@code "true"} です。
</p>
</dd>
</dl>
</dd>
<h3 id="pin-set">&lt;pin-set&gt;</h3>
<dl class="xml">
<dt>
構文:
</dt>
<dd>
<pre class="stx">
&lt;pin-set expiration="date"&gt;
...
&lt;/pin-set&gt;
</pre>
</dd>
<dt>
含めることのできる要素:
</dt>
<dd>
任意の数の <code><a href="#pin">&lt;pin&gt;</a></code>
</dd>
<dt>
説明:
</dt>
<dd>
公開鍵のピンのセットです。セキュアな接続を信頼するには、信頼チェーン内の公開鍵一式のうちどれかが、ピンのセットに含まれている必要があります。
ピンの形式については、
<code><a href="#pin">&lt;pin&gt;</a></code> をご覧ください。
</dd>
<dt>
属性:
</dt>
<dd>
<dl class="attr">
<dt>
{@code expiration}
</dt>
<dd>
{@code yyyy-MM-dd} 形式のピン留めの有効期限、つまりピン留めを無効にする日付です。
この属性が設定されていない場合、ピン留めの有効期限はありません。
<p>
有効期限を設定しておくと、ユーザーがアプリのアップデートを無効にしているなどの原因で、ピンのセットのアップデートを取得していないアプリで、アプリの接続上の問題を回避できます。
</p>
</dd>
</dl>
</dd>
</dl>
<h3 id="pin">&lt;pin&gt;</h3>
<dl class="xml">
<dt>
構文:
</dt>
<dd>
<pre class="stx">
&lt;pin digest=["SHA-256"]&gt;base64 encoded digest of X.509
SubjectPublicKeyInfo (SPKI)&lt;/pin&gt;
</pre>
</dd>
<dt>
属性:
</dt>
<dd>
<dl class="attr">
<dt>
{@code digest}
</dt>
<dd>
ピンの生成にはダイジェスト アルゴリズムが使用されます。現在サポートされているのは
{@code "SHA-256"} のみです。
</dd>
</dl>
</dd>
</dl>

View File

@@ -0,0 +1,120 @@
page.title=TV の録画
page.keywords=preview,sdk,tv,recording
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>このドキュメントの内容</h2>
<ol>
<li><a href="#supporting">録画のサポートを示す</a></li>
<li><a href="#recording">セッションを録画する</a></li>
<li><a href="#errors">録画のエラーを処理する</a></li>
<li><a href="#sessions">録画したセッションを管理する</a></li>
<li><a href="#best">ベスト プラクティス</a></li>
</ol>
</div>
</div>
<p>TV の入力サービスを使用すると、ユーザーは time-shifting API を介してチャンネルの再生を一時停止および再開できます。
Android N では、録画したセッションを複数保存できるようにして、タイムシフティング機能を拡張しています。
</p>
<p>ユーザーはあらかじめ録画をスケジュールできます。また、プログラムを視聴しながら録画を開始することもできます。
システムが録画を保存すると、システムの TV アプリで録画を視聴、管理、再生できます。
</p>
<p>TV 入力サービスで録画機能を提供する場合は、アプリが録画をサポートしていることをシステムに示し、プログラムの録画機能を実装し、録画中に発生したエラーを処理および通知し、録画したセッションを管理する必要があります。
</p>
<h2 id="supporting">録画のサポートを示す</h2>
<p>TV 入力サービスで録画をサポートしていることをシステムに示すには、次の手順を実行します。
</p>
<ol>
<li><code>TvInputService.onCreate()</code> メソッドで、<code>TvInputInfo.Builder</code> クラスを使用して新しい
<code>TvInputInfo</code> オブジェクトを作成します。
</li>
<li>新しい <code>TvInputInfo</code> オブジェクトを作成するときは、
<code>setCanRecord(true)</code> を呼び出してから、<code>build()</code> を呼び出して、サービスが録画をサポートしていることを示します。
</li>
<li>
<code>TvInputService.updateTvInputInfo()</code> を呼び出してシステムに <code>TvInputInfo</code> オブジェクトを登録します。</li>
</ol>
<h2 id="recording">セッションを録画する</h2>
<p>TV 入力サービスで録画機能のサポートを登録した後、システムがアプリの録画機能の実装にアクセスする必要があるときに、
<code>TvInputService.onCreateRecordingSession()</code> を呼び出します。
独自の
<code>TvInputService.RecordingSession</code> サブクラスを実装し、<code>onCreateRecordingSession()</code> コールバックが発生したときに返します。
このサブクラスは、正しいチャンネル データへの切り替え、要求されたデータの録画、録画のステータスおよびエラーのシステムへの通知を処理します。
</p>
<p>システムが <code>RecordingSession.onTune()</code> を呼び出すと、チャンネル URI を渡して、URI で指定されたチャンネルに合わせます。
<code>notifyTuned()</code> を呼び出して、アプリが目的のチャンネルに合わせたことをシステムに通知します。または、アプリが適切なチャンネルに合わせることができなかった場合は、
<code>notifyError()</code> を呼び出します。
</p>
<p>次に、システムは <code>RecordingSession.onStartRecording()</code> コールバックを呼び出します。
アプリは直ちに録画を開始する必要があります。システムはこのコールバックを呼び出すときに、これから録画するプログラムに関する情報を含む URI を提供します。
録画が完了したら、このデータを <code>RecordedPrograms</code> データ テーブルにコピーする必要があります。
</p>
<p>最後に、システムが <code>RecordingSession.onStopRecording()</code> を呼び出します。この時点で、アプリは録画を直ちに停止する必要があります。
また、<code>RecordedPrograms</code> テーブルのエントリも作成する必要があります。
このエントリは、
<code>RecordedPrograms.COLUMN_RECORDING_DATA_URI</code> 列に録画したセッション データの URI を設定し、システムが最初に
<code>onStartRecording()</code> を呼び出したときに提供したプログラム情報がすべて含まれている必要があります。
</p>
<p><code>RecordedPrograms</code> テーブルへのアクセス方法の詳細については、<a href="#sessions">録画したセッションを管理する</a>をご覧ください。
</p>
<h2 id="errors">録画のエラーを処理する</h2>
<p>録画中にエラーが発生し、録画したデータのレンダリングができない場合は、<code>RecordingSession.notifyError()</code> を呼び出してシステムに通知します。同様に、録画セッションの作成後に <code>notifyError()</code> を呼び出して、アプリがセッションを録画できないことをシステムに通知することもできます。
</p>
<p>録画中にエラーが発生したにもかかわらず、一部の録画を再生できるようにしてユーザーに提供したい場合は、
<code>RecordingSession.notifyRecordingStopped()</code> を呼び出すと、システムで部分的なセッションを使用できるようになります。
</p>
<h2 id="sessions">録画したセッションを管理する</h2>
<p>システムは、すべての録画可能チャンネル アプリで録画したすべてのセッションの情報を、<code>TvContract.RecordedPrograms</code>
コンテンツ プロバイダ テーブルに保持します。
この情報は、
<code>RecordedPrograms.Uri</code> コンテンツ URI を使用してアクセスできます。コンテンツ プロバイダ API を使用して、このテーブルのエントリの読み取り、追加、削除が可能です。
</p>
<p>コンテンツ プロバイダのデータの操作方法については、<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">コンテンツ プロバイダの基本</a>をご覧ください。
</p>
<h2 id="best">ベスト プラクティス</h2>
<p>TV 端末のストレージには上限があるため、録画したセッションを保存するためにストレージを割り当てるときは、十分に検討してください。
録画したセッションを保存する容量が不足している場合は、
<code>RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)</code> を使用します。
</p>
<p>ユーザーが録画を開始すると、できるだけ速やかにデータの録画を開始する必要があります。
録画を円滑に開始するには、システムが
<code>onCreateRecordingSession()</code> コールバックを呼び出したときにストレージ容量のアクセスや割り当てなど、時間のかかるタスクをあからじめ完了しておきます。
そうすれば、<code>onStartRecording()</code> コールバックが発生したときに直ちに録画を開始できます。
</p>

View File

@@ -0,0 +1,120 @@
page.title=Android N Developer Preview
page.tags="preview","developer"
meta.tags="プレビュー", "android"
fullpage=true
forcelocalnav=true
header.hide=1
footer.hide=1
@jd:body
<script>
$(document).ready(function() {
if (useUpdatedTemplates) {
$("#useUpdatedTemplates").css("display","block");
} else {
$("#useOldTemplates").css("display","block");
}
})
</script>
<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
<div class="wrap" style="max-width:1100px;margin-top:0">
<div class="cols dac-hero-content" style="padding-bottom:1em;">
<div class="col-7of16 col-push-9of16" style="padding-left:2em">
<h1 class="dac-hero-title">Android N Developer Preview</h1>
<p class="dac-hero-description">
Android N が正式リリースされる前に、Nexus などのデバイスで事前に<strong>アプリの動作をご確認</strong>いただけます。Android N の新しいシステム動作をサポートして、<strong>電力やメモリの使用量を削減</strong>しましょう。<strong>マルチ ウィンドウ UI</strong> や<strong>ダイレクト リプライ通知</strong>などの機能も利用して、アプリを拡張してみてください。
</p>
<a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
<span class="dac-sprite dac-auto-chevron"></span>
スタートガイド</a>
<!--<br>
<a class="dac-hero-cta" href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron"></span>
Update to Android N (final SDK)
</a><br>-->
</div>
<div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
<img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
{@docRoot}images/home/n-preview-hero_2x.png 2x">
</div>
</div>
<div class="dac-section dac-small">
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/resources"
data-cardSizes="6x2"
data-maxResults="6"></div>
</div>
</div>
</section>
<div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
<div class="wrap dac-offset-parent">
<a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
<i class="dac-sprite dac-arrow-down-gray"></i>
</a>
<ul class="dac-actions">
<li class="dac-action">
<a class="dac-action-link" href="https://developer.android.com/preview/bug">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
問題の報告</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/support.html">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
リリースノートの確認</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/dev-community">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
開発者コミュニティに参加</a>
</li>
</ul>
</div><!-- end .wrap -->
</div><!-- end .dac-actions -->
<div id="useOldTemplates" style="display:none;color:black" class="actions-bar dac-expand dac-invert">
<div class="wrap dac-offset-parent">
<div class="actions">
<div><a href="https://developer.android.com/preview/bug">
<span class="dac-sprite dac-auto-chevron-large"></span>
問題の報告</a>
</div>
<div><a href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron-large"></span>
リリースノートの確認</a>
</div>
<div><a href="{@docRoot}preview/dev-community">
<span class="dac-sprite dac-auto-chevron-large"></span>
開発者コミュニティに参加</a>
</div>
</div><!-- end .actions -->
</div><!-- end .wrap -->
</div>
<section class="dac-section dac-light"><div class="wrap">
<h1 class="dac-section-title">リソース</h1>
<div class="dac-section-subtitle">
Android N 向けにアプリを開発する上で役立つ必須情報をご提供します。
</div>
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
data-items-per-page="6"
data-maxResults="15"
data-initial-results="6"></div>
</div>
</section>

View File

@@ -0,0 +1,183 @@
page.title=Java 8 の機能
page.keywords="android N", "Java 8", "Jack"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li>
<a href="#supported-features">Java 8 のサポート機能と API</a>
</li>
<li>
<a href="#configuration">Java 8 の機能と Jack ツールチェーンの有効化</a>
</li>
</ol>
</div>
</div>
<p>Android N 向けのアプリを開発する際は、Java 8 の機能をご利用いただけます。このページでは Android N Preview でサポートしている Java 8 の新機能や、それらを利用するためのプロジェクトの正しい設定方法、想定される既知の問題についてご紹介します。
</p>
<p>これらの機能を使うには、Android Studio 2.1(プレビュー版)と Android N Preview SDK をダウンロードしてセットアップし、Jack ツールチェーンと最新の Gradle 用の Android Plugin を準備する必要があります。Android N Preview SDK をお持ちでない方は、<a href="{@docRoot}preview/setup-sdk.html">Android N 向けの開発準備</a>の説明をご覧ください。
</p>
<p class="note">
<strong>注: </strong> Android N プラットフォーム向けのアプリを開発する際は、必ずしも Java 8 の新機能を使う必要はありません。Java 8 の機能を使用せずにコーディングしたい場合は、プロジェクトのソースコードを保持して、ターゲットの互換性の指定を Java 7 にしておくこともできます。ただし、Android N プラットフォームでビルドする時は、必ず JDK 8 を使用してコンパイルしてください。
</p>
<h2 id="supported-features">
Java 8 のサポート機能と API
</h2>
<p>
Android ではまだ Java 8 の全機能はサポートしておりません。現時点で Android N のプレビュー版向けにアプリを開発する際にご利用いただける機能は、以下のとおりです。
</p>
<ul>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html">デフォルトおよび静的インターフェースのメソッド</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html">ラムダ式</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html">反復アノテーション</a>
</li>
</ul>
<p>
さらに以下の Java 8 機能の API もご利用いただけます。
</p>
<ul>
<li>リフレクションおよび言語関連の API
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.lang.FunctionalInterface}
</li>
<li>{@code java.lang.annotation.Repeatable}
</li>
<li>{@code java.lang.reflect.Method.isDefault()}
</li>
<li>以下のような反復アノテーション関連のリフレクション API
{@code AnnotatedElement.getAnnotationsByType(Class)}
</li>
</ul>
</li>
<li>ユーティリティ API
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.util.function}
</li>
</ul>
</li>
</ul>
<p class="note">
<strong>注:</strong> Android N の実装は匿名クラスのラムダ式に基づいているため下方互換性があり、前の Andoird バージョンで実行することができます。前のバージョンでラムダ式をテストする際は、必ず {@code
build.gradle} ファイルの {@code compileSdkVersion} と {@code
targetSdkVersion} の値を 23 以下に設定してください。
</p>
<h2 id="configuration">
Java 8 の機能と Jack ツールチェーンの有効化
</h2>
<p>
Java 8 の新機能を使うには、新しい <a class="external-link" href="https://source.android.com/source/jack.html">Jack ツールチェーン</a>も必要です。この新しい Android ツールチェーンは、Java のソースコードを Android で判別可能な dex バイトコードにコンパイルします。さらにこのツールには独自の {@code .jack} ライブラリ フォーマットがあり、再パッケージ化、縮小、難読化、Multidex など、ほとんどのツールチェーン機能に対応しています。
</p>
<p>以下は、Android の DEX ファイルのビルドに使用する 2 つのツールチェーンの比較です。</p>
<ul>
<li>従来の javac ツールチェーン<br>
<b>javac</b> ({@code .java} --&gt; {@code .class}) --&gt; <b>dx</b> ({@code
.class} --&gt; {@code .dex})
</li>
<li>新しい Jack ツールチェーン<br>
<b>Jack</b> ({@code .java} --&gt; {@code .jack} --&gt; {@code .dex})
</li>
</ul>
<h3>
Gradle の設定
</h3>
<p>
プロジェクトで Java 8 の機能と Jack を使うには、モジュール固有の {@code build.gradle} ファイルに以下の内容を記載します。
</p>
<pre>
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
</pre>
<h3>
既知の問題
</h3>
<p>
Android Studio 2.0(ベータ版)で導入された Instant Run は、現段階では Jack と併用できません。そのため新しいツールチェーンの使用中は、Instant Run が無効になります。
</p>
<p>Jack はアプリのコンパイル中に中間クラスファイルを生成しないため、中間ファイルに依存する以下のようなツールは現在 Jack と併用できません。
</p>
<ul>
<li>クラスファイルに作用する Lint Detector
</li>
<li>アプリのクラスファイルを必要とするツールやライブラリJaCoCo や Mockito など)
</li>
</ul>
<p>その他の不具合がありましたら、<a href="http://tools.android.com/filing-bugs">バグの報告</a>をお願いします。</p>

View File

@@ -0,0 +1,440 @@
page.title=プログラムの概要
page.metaDescription= 次期 Android バージョン用のアプリを準備しましょう。
page.image=images/cards/card-n-overview_2x.png
meta.tags="プレビュー", "デベロッパー", "android"
page.tags="preview", "developer", "android"
@jd:body
<!--
<div class="cols" style=
"background-color:#f2daf5; padding: 5px 0;margin-bottom:1em; text-align:center;">
<h3>
Developer Preview 3 is now available
</h3>
<p>Includes final SDK and near-final system images</p>
<div style="margin:auto 1em">
<ul class="dac-section-links">
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-notes">
<span class="dac-sprite dac-auto-chevron"></span>
Read the Notes</a>
</li>
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-get">
<span class="dac-sprite dac-auto-chevron"></span>
Get the Update</a>
</li>
<li class="dac-section-link">
<a href="https://code.google.com/p/android-developer-preview/">
<span class="dac-sprite dac-auto-chevron"></span>
Report Issues</a>
</li>
</ul>
</div>
</div>
-->
<p>
<strong>Android N Developer Preview</strong> には、Android の次期バージョンに備えてアプリをテストし、最適化するための機能がすべて備わっています。N Developer Preview 用のツールをダウンロードするだけで、今すぐ無料でご利用いただけます。
</p>
<div style="background-color:#eceff1;padding:1em;">
<div class="wrap">
<div class="cols">
<div class="col-4of12">
<h5>
ハードウェアとエミュレータのイメージ
</h5>
<p>
さまざまなデバイスやエミュレータでアプリを動かしてテストできます。
</p>
</div>
<div class="col-4of12">
<h5>
最新のプラットフォームのコード
</h5>
<p>
プレビュー期間は毎月アップデートされるので、最新のプラットフォームで変更された箇所のテストを実施できます。
</p>
</div>
<div class="col-4of12">
<h5>
デベロッパー不具合の優先
</h5>
<p>
最初の数週間でデベロッパーから報告された問題に優先的に対応するので、テストの実施とフィードバックはお早めにお願いします。
</p>
</div>
</div>
<div class="cols">
<div class="col-4of12">
<h5>
新しい動作や機能
</h5>
<p>
新しいプラットフォーム動作への対応や、新機能を利用した開発を早い段階で開始できます。
</p>
</div>
<div class="col-4of12">
<h5>
OTA 配信によるアップデート
</h5>
<p>
Android ベータ版プログラムによる無線でのシームレスなアップデートに対応しているため、イメージを書き込む必要がありません。
</p>
</div>
<div class="col-4of12">
<h5>
フィードバックとサポート
</h5>
<p>
<a href="{@docRoot}preview/bug">Issue Tracker</a> で問題を報告し、フィードバックを送ってください。<a href="{@docRoot}preview/dev-community">N&nbsp;デベロッパー コミュニティ</a>では、他のデベロッパーと情報交換をすることができます。
</p>
</div>
</div>
</div>
</div>
<!--
<p>New in the Android N Developer Preview: </p>
<ul>
<li> Accompanying Android Beta Program for consumers, starting later in the preview</li>
<li> More supported devices, including devices from OEM partners</li>
<li> Seamless OTAs for your devices, from initial release to final N release without flashing</li>
</ul>
-->
<h2 id="timeline">スケジュールとアップデート</h2>
<img src="{@docRoot}images/n-preview-updates_2x.png">
<p>
N Developer Preview の対象期間は、2016 年 3 月 9 日から AOSP と OEM 向けの Android N の正式リリース2016 年 の第 3 四半期を予定)までの間です。
</p>
<p>
主要な開発マイルストーンでアップデートをリリースしますので、開発やテスト用の環境としてご利用ください。リリース間隔は基本的には各月4 週から 6 週に 1 回)の予定です。マイルストーンについては、以下をご覧ください。
</p>
<ul>
<li><strong><a href="{@docRoot}preview/support.html">Preview 1</a></strong>(初回リリース、アルファ版)</li>
<li><strong>Preview 2</strong>(追加アップデート、ベータ版)</li>
<li><strong>Preview 3</strong>(追加アップデート、ベータ版)</li>
<li><strong>Preview 4</strong>(最終版の API と正式な SDK、Google Play への公開)</li>
<li><strong>Preview 5</strong>(最終テスト用の最終版とほぼ同じシステム イメージ)</li>
<li>AOSP とエコシステムへの<strong>最終リリース</strong></li>
</ul>
<p>
各アップデートには、SDK ツールとプレビュー版のシステム イメージ、エミュレータ、参考資料、API の差分情報が含まれます。
</p>
<p>
<strong>最初の 3 つのプレビュー マイルストーン</strong>では、<strong>初期段階のテストや開発用の環境</strong>を提供します。それを利用して既存のアプリにおける互換性の問題を特定し、新規プラットフォームへの移行や主な作業計画を立ててください。この期間は各種機能や API、ファイル互換性の問題など、あらゆるフィードバックを受け付けている貴重な期間です。ぜひ <a href="{@docRoot}preview/bug">Issue Tracker</a> を使用して、皆様のご意見をお聞かせください。いただいたフィードバックをもとに、一部の API を改善してアップデートで提供する予定です。
</p>
<p>
<strong>Preview 4 と 5</strong> には、開発に使用する <strong>Android N の最終版の API と SDK</strong>、システム動作や機能のテストに使用する最終版とほぼ同じシステム イメージが含まれます。この時点で Android N の標準 API レベルが確定しますので、以後は既存アプリの最終的な互換性テストを開始し、Android N の API や機能を使った新しいコードを改善できるようになります。
</p>
<p>
さらに Preview 4 以降では、正式な API レベルの Android N を搭載している<strong>デバイスにアプリを公開</strong>できるようになりますAndroid ベータ版プログラムにオプトインしたユーザーのデバイスなどが対象)。なお、アプリは Google Play のアルファ版やベータ版のチャネルで先に配信できるので、ストア全体に公開する前に、Android ベータ版のユーザーに事前にアプリをテストしてもらうことが可能です。
</p>
<p>
Android N でテストや開発を行う場合、プレビューのアップデートがリリースされるたびに<strong>開発環境を最新の状態に更新する</strong>ことを強くお勧めします。その際はテスト用のデバイスを Android ベータ版プログラムに登録して、マイルストーンごとに<strong>無線OTAでアップデート</strong>を取得するようにしておくと便利です。もしくはプレビュー イメージを手動でダウンロードして書き込むこともできます。
</p>
<p>
プレビュー アップデートをご利用いただけるようになった際は <a href="http://android-developers.blogspot.com/">Android デベロッパー ブログ</a>、本サイト、<a href="{@docRoot}preview/dev-community">Android N デベロッパー コミュニティ</a>でお知らせします。
</p>
<h2 id="preview_tools">N Developer Preview の概要</h2>
<p>
N Developer Preview は、既存のアプリをさまざまな画面サイズ、ネットワーク テクロジー、CPU や GPU チップセット、ハードウェア アーキテクチャでテストするために必要なものをすべて備えています。
</p>
<h3 id="sdk_tools">SDK ツール</h3>
<p>各コンポーネントは <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a> の SDK Manager を使ってダウンロードできます。</p>
<ul>
<li> N Developer Preview の <strong>SDK とツール</strong>
<li> N Developer Preview の<strong>エミュレータ システム イメージ</strong>32 ビット版と 64 ビット版)
<li> N Developer Preview の <strong>Android TV 版エミュレータ システム イメージ</strong>32 ビット版)
<li> N Developer Preview サポート ライブラリ(新規アプリのテンプレート用)
</ul>
<p>
上記のツールは、必要に応じて各マイルストーンでアップデートします。
</p>
<h3 id="hardware_system_images">ハードウェアのシステム イメージ</h3>
<p>
N Developer Preview に含まれる Nexus などのハードウェアのシステム イメージを使用すると、実機でテストや開発ができます。ハードウェア イメージの一覧は、<a href="{@docRoot}preview/download.html">デバイス イメージ</a>のページでご確認ください。
</p>
<p>
これらのデバイス用のシステム イメージは、各マイルストーンでアップデートします。アップデートされたシステム イメージは、何度でもダウンロードしてテスト用のデバイスに手動で書き込むことができます。自動化されたテスト環境では、繰り返しデバイスに再書き込みをする必要があるので、この方法は特に便利です。
</p>
<p class="note"><strong>注:</strong> 昨年のプレビュー版とは違い、<strong>手動で書き込みをしたデバイスは OTA アップデートを取得できなくなります</strong>。そのため、今年はデバイスを Android ベータ版プログラムに登録して、OTA を取得するようにしてください。 詳細は次のセクションに記載しています。
</p>
<h3 id="android_beta">Android ベータ版プログラムによる OTA アップデート</h3>
<p>
Android N は、新たに無線OTAアップデート プログラムに対応しています。このプログラムに登録しているデバイスには、Android N の最新プレビュー版へのアップデートが直接自動配信されます。登録は無料で、Google アカウントに登録済みの対象機種を所有していれば誰でもご利用いただけます。
</p>
<p>
このプログラムに登録するには、まず <a href="https://g.co/androidbeta">Android ベータ版プログラム</a>のサイトに移動します。このページには、Android ベータ版プログラムに登録可能なアカウントに登録済みデバイスの一覧が表示されます。
</p>
<ol>
<li> Android N のアップデートを取得するデバイスを選択します。
<li> [Enroll] をクリックして利用規約を読み、合意したら [OK] をクリックします。
</ol>
<p>
登録が完了すると、すぐにデバイスにアップデートが配信されます。ほとんどの場合、Android N に移行する際にデータのオールリセットは不要ですが、デバイスの登録前には大事なデータをバックアップしておくことをお勧めします。
</p>
<p>
デバイスにアップデートが配信されたら、できるだけ早めにダウンロードしてインストールするようにしてください。そうすることで常に最新のシステム UI や 動作、API、さまざまな機能の変更点を把握できます。
</p>
<p>
Developer Preview の終了時には、登録デバイスに Android N の正式リリース版へのアップデートが配信されます。
</p>
<p>
デバイスはいつでも Android ベータ版プログラムへの登録を解除できます。登録を解除する前には、デバイス上のデータを必ずバックアップしておいてください。
</p>
<p class="note"><strong>注:</strong> 登録を解除すると、<strong>デバイスはファクトリー リセットされ</strong>、Android 6.0 Marshmallow の最新バージョンになります(デバイスを登録する前のバージョンに戻るとは限りません)。確実にクリーン インストールを行うため、連絡先やメッセージ、写真などのデバイス上のデータは削除されます。
</p>
<h3 id="documentation_and_sample_code">ドキュメントとサンプル コード</h3>
<p>
Developer Preview サイトにあるドキュメントで、Android&nbsp;N の詳細をご確認いただけます。
</p>
<ul>
<li> <a href="{@docRoot}preview/setup-sdk.html">Android N 向けの開発準備</a>では、はじめの手順をステップごとに説明しています。
</li>
<li> <a href="{@docRoot}preview/behavior-changes.html">動作の変更点</a> には、集中的にテストを実施すべき箇所が記載されています。
</li>
<li> 新規 API に関するドキュメントには、<a href="{@docRoot}preview/api-overview.html">API 概要</a>、ダウンロード可能な <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API リファレンス</a>などが含まれています。また、マルチ ウィンドウのサポート、バンドル通知、マルチロケールのサポートなどの主要機能についての詳細なデベロッパー ガイドも含まれています。
<li> <a href="{@docRoot}preview/samples.html">サンプル コード</a>では、パーミッションや他の新機能の使用方法を確認できます。
<li> 現行バージョンの N Developer Preview の<a href="{@docRoot}preview/support.html#release-notes">リリース ノート</a>では、変更履歴や差分レポートなどを確認できます。
</ul>
<h4 id="reference">ダウンロード可能な API リファレンス</h4>
<p>
初期のプレビュー アップデートでは、<a href="{@docRoot}preview/setup-sdk.html#docs-dl">Android N プラットフォーム用の API リファレンス</a>の最新版を個別の zip ファイルとしてダウンロードできます。このリファレンスには差分レポートも含まれているので、API 23 や以前のアップデートからの API の変更点をご確認いただけます。
</p>
<p>
Android N の API が最終決定して正式な API レベルが割り当てられた時点で、API リファレンスを <a href="https://developer.android.com">https://developer.android.com</a> で公開します。
</p>
<h3 id="support_resources">
サポート リソース
</h3>
<p>
N Developer Preview のテスト中や開発中は、以下の方法で不具合の報告やフィードバックの送信を行ってください。
</p>
<ul>
<li> <strong>主なフィードバック手段</strong>は、<a href="https://code.google.com/p/android-developer-preview/">N Developer Preview Issure Tracker</a> です。これを使うと、バグやパフォーマンスの問題、一般的なフィードバックを報告できます。さらに<a href="{@docRoot}preview/bug">既知の問題</a>や、その回避方法もご確認いただけます。報告いただいた問題は常に最新の情報に更新されるので、重要度が判定されたり、問題が Android エンジニア チームに引き継がれたことを確認できます。
</li>
<li> <a href="{@docRoot}preview/dev-community">Android N デベロッパー コミュニティ</a>は、Android N に携わっている<strong>デベロッパー同士がつながる</strong> Google+ のコミュニティです。Android N について意見交換をしたり、疑問点を解消したりする場としてご活用ください。Google はこのコミュニティを管理し、必要に応じて回答やアドバイスをします。
</li>
</ul>
<h3 id="targeting">ターゲット、プレビュー API、公開</h3>
<p>
N Developer Preview では開発専用のシステムと、<strong>標準 API レベルを持たない</strong> Android ライブラリを提供します。アプリのテストで互換動作を除外する場合(強く推奨します)、アプリの <code><a href=
"{@docRoot}preview/setup-sdk.html#create-update">targetSdkVersion</a></code> を <code>“N”</code> に設定することで Android N の プレビュー版を対象にすることができます。
</p>
<p>
Android N Developer Preview では、<strong>プレビュー API</strong> を提供しています。この API は、2016 年の第 3 四半期に予定している最終版 SDK のリリースまで正式版ではありません。そのため、プログラム開始後の数週間は特に<strong>軽微な API 変更が発生することが予想されます</strong>。変更点の概要については、Android N Developer Preview がアップデートされるたびにお知らせします。
</p>
<p class="note">
<strong>注:</strong> プレビュー API は変更される可能性がありますが、システムの基幹にかかわる機能には変更はありませんので、すぐにテストしていただけます。
</p>
<p>
Google Play では <strong>N Developer Preview を対象としたアプリの配信を禁止</strong>しています。Android N の最終版 SDK がリリースされてからは、正式な Android N の API レベルを対象にして、アルファ版またはベータ版のリリース チャンネルでアプリを Google Play に公開できます。それまでは、Android N を対象とするアプリをテスターに配信する場合は、電子メールで送付するか、自身のサイトから直接ダウンロードしてもらうようにしてください。
</p>
<p>
AOSP と OEM 向けの Android N のフルリリースは 2016 年度の第 3 四半期を予定しています。その後は、Android N 向けのアプリを Google Play の公式リリース チャンネルで配信いただけます。
</p>
<h2 id="how_to_get_started">開始するには</h2>
<p>
以下の手順で Android N を使用したアプリのテストを開始できます。
</p>
<ol>
<li> <a href="{@docRoot}preview/api-overview.html">API 概要</a>や<a href="{@docRoot}preview/behavior-changes.html">動作の変更点</a>を参照して、新機能や自身のアプリへの影響をご確認ください。特に新しい<a href="{@docRoot}preview/features/notification-updates.html">通知</a>機能と<a href="{@docRoot}preview/features/multi-window.html">マルチ ウィンドウ</a>機能について把握しておくことをお勧めします。
</li>
<li> <a href="{@docRoot}preview/setup-sdk.html">Preview SDK のセットアップ</a>手順に従い、ご利用の環境をセットアップしてテスト用デバイスの設定をします。
</li>
<li> <a href="https://developers.google.com/android/nexus/images">書き込み手順</a>に従い、最新の Android N のシステム イメージを 自身のデバイスに書き込みます。
</li>
<li> <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API リファレンス</a>や <a href="{@docRoot}preview/samples.html">Android N のサンプル</a>を参考に API の新機能について理解を深め、それらを自身のアプリに利用する方法をご検討ください。
<li> <a href="{@docRoot}preview/dev-community">Android N デベロッパー コミュニティ</a>に参加すると、最新のニュースを入手でき、新しいプラットフォームを利用している開発者同士で交流ができます。
</li>
</ol>
<p>
Android N Developer Preview プログラムへの参加をお待ちしています。
</p>

View File

@@ -0,0 +1,85 @@
page.title=サンプル
page.tags="preview", "samples", "android"
page.image=images/cards/card-n-samples_2x.png
@jd:body
<p>
以下は Android N のサンプルコードです。サンプルを Android Studio でダウンロードするには、<b>[File] &gt; [Import Samples]</b> メニュー オプションを選択します。
</p>
<p class="note">
<strong>注:</strong> 以下のダウンロード可能なプロジェクトは、Gradle と Android Studio でご利用いただくために提供しています。
</p>
<h3 id="mw">マルチ ウィンドウ Playground</h3>
<img src="{@docRoot}preview/images/sample-multiwindow.png" style="float: left; padding-right: 0.5em" height="250" width="156" />
<p>
このサンプルでは、自身のアプリでマルチ ウィンドウのユーザー インターフェースを使用する方法をご確認いただけます。
</p>
<p>
<a href="https://github.com/googlesamples/android-MultiWindowPlayground">GitHub でサンプルを入手</a>
</p>
<div style="clear: both;"></div>
<h3 id="an">アクティブ通知</h3>
<img src="{@docRoot}preview/images/sample-activenotifications.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
NotificationCompat を用いて通知を送信するシンプルなサービスをご確認いただる既存のサンプルです。ユーザからの未読メッセージは、それぞれ別の通知として送信されます。
</p>
<p>
このサンプルは、Android N 向けの新たな通知機能を利用できるようにアップデートされています。
</p>
<p>
<a href="https://github.com/googlesamples/android-ActiveNotifications">GitHub でサンプルを入手</a>
</p>
<div style="clear: both;"></div>
<h3 id="ms">メッセージ サービス</h3>
<img src="{@docRoot}preview/images/sample-messagingservice.png" style="float: left; padding-right: 0.5em" height="250" width="150" />
<p>
1 つのアプリで表示している通知の件数を NotificationManager で取得する方法をご確認いただける既存のサンプルです。
</p>
<p>
このサンプルは、Android N 向けの新たな通知機能を利用できるようにアップデートされています。
</p>
<p>
<a href="https://github.com/googlesamples/android-MessagingService">GitHub でサンプルを入手</a>
</p>
<div style="clear: both;"></div>
<h3 id="fbe">ダイレクト ブート</h3>
<img src="{@docRoot}preview/images/sample-directboot.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
このサンプルでは、デバイスの暗号化ストレージ内のデータにアクセスしたり、データを保存したりする方法をご確認いただけます。この機能はデバイスが起動している間は常に有効です。
</p>
<p>
<a href="https://github.com/googlesamples/android-DirectBoot">GitHub でサンプルを入手</a>
</p>
<div style="clear: both;"></div>
<h3 id="sda">特定のディレクトリへのアクセス</h3>
<img src="{@docRoot}preview/images/sample-scopeddirectoryaccess.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
このサンプルでは、より少ないパーミッションで、特定のディレクトリに対するデータの読み出しや書き込みを行う方法をご確認いただけます。
</p>
<p>
<a href="https://github.com/googlesamples/android-ScopedDirectoryAccess">GitHub でサンプルを入手</a>
</p>

View File

@@ -0,0 +1,226 @@
page.title=プレビューのセットアップ
meta.keywords="プレビュー"、"android"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-sdk_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li><a href="#get-as13">Android Studio 2.1 を入手する</a></li>
<li><a href="#get-sdk">Android N SDK を入手する</a>
<ol>
<li><a href="#docs-dl">リファレンス ドキュメント</a>
</ol>
</li>
<li><a href="#java8">Java 8 JDK および JRE を入手する</a></li>
<li><a href="#create-update">プロジェクトをアップデートまたは作成する</a></li>
<li><a href="#next">次のステップ</a></li>
</ol>
</div>
</div>
<p>このページで説明しているように、Android N Preview 向けのアプリを開発するには、デベロッパー環境をアップデートする必要があります。
</p>
<p>Android N システム イメージでアプリの互換性を簡単にテストするには、<a href="{@docRoot}preview/download.html">Android N デバイスでのテスト</a>に関するガイドに従ってください。
</p>
<img src="{@docRoot}preview/images/n-preview-setup.png" width="700" alt="" />
<h2 id="get-as13">Android Studio 2.1(プレビュー)を入手する</h2>
<p>Android N プラットフォームには、Jack と呼ばれる新しいコンパイラーが必要な <a href="{@docRoot}preview/j8-jack.html">Java 8 機能</a>のサポートが追加されています。現在、最新バージョンの Jack は、Android Studio 2.1 のみでサポートされています。したがって、Java 8 機能を使用する場合は、Android Studio 2.1 を使用してアプリをビルドする必要があります。Java 8 機能を使用しない場合は Jack コンパイラーを使用する必要はありません。ただし、以下に説明するように、Android N プラットフォームを対象にコンパイルを行うには、JDK 8 にアップデートする必要があります。
</p>
<iframe width="400" height="225" src="//www.youtube.com/embed/SBbWGxXCMqQ?autohide=1&amp;showinfo=0" frameborder="0" allowfullscreen="" style="float: right; margin: 0 0 20px 20px;"></iframe>
<p>現在、Android Studio 2.1 は、先行リリース チャンネルでプレビューとして入手できます。Android Studio を既に入手していて、先行チャンネル版にアップデートしない場合は、Android Studio 2.1 を個別のインストールとしてダウンロードして、Android N での開発に使用することにより、Android Studio のプライマリ環境に影響を及ぼさないようにすることができます。
</p>
<p>Android Studio 2.1 を個別のインストールとしてダウンロードするには、次のステップを実行します(既存のインストールを Android Studio 2.1 にアップデートする場合は、ステップ 4 に進んでください)。
</p>
<ol>
<li>Android Studio の既存のインストールの名前を編集し、バージョン番号を末尾に追加します。このようにすると、新しいバージョンをインストールしたときに、新しいバージョンが既存のバージョンを上書きしません。
</li>
<li><a href="http://tools.android.com/download/studio/canary/latest">先行チャンネルのダウンロード ページ</a>から、お使いのオペレーティング システムに対応した ZIP ファイルをダウンロードします。
</li>
<li>パッケージを解凍し、アプリケーションを配置するシステム上の適切な場所に Android Studio 2.1 の内容を移動してから起動します。
</li>
<li>設定ダイアログを開きますWindows、Linux では <strong>[File] &gt; [Settings]</strong>、Mac では <strong>[Android Studio] &gt; [Preferences]</strong>)。左側のパネルで、<strong>[Appearance &amp; Behavior] &gt; [System Settings] &gt; [Updates]</strong> を選択します。
</li>
<li>[Updates] パネルで、[<strong>Automatically check updates for</strong>] チェック ボックスを選択し、ドロップダウン リストから [<strong>Canary Channel</strong>] を選択します。
</li>
</ol>
<p>次のステップのために、この設定ウィンドウを開いたままにします。</p>
<h2 id="get-sdk">N Preview SDK を入手する</h2>
<p>Android N API を使用して開発を開始するには、次のステップに従って、Android Studio に Android N Preview SDK をインストールする必要があります。
</p>
<ol>
<li>開いたままにしている [Updates] パネル(上記のステップ 4で、[<strong>Automatically check updates for Android SDK</strong>] チェック ボックスを選択し、ドロップダウン リストから [<strong>Preview Channel</strong>] を選択します。
</li>
<li>[<strong>Check Now</strong>] をクリックします。</li>
<li>左側のパネルで、<strong>[Appearance &amp; Behavior] &gt; [System Settings] &gt; [Android SDK]</strong> を選択します。
<li>[<strong>SDK Platforms</strong>] タブをクリックして、[<strong>Android N Preview</strong>] チェック ボックスを選択します。
</li>
<li><strong>[SDK Tools]</strong> タブをクリックして <strong>[Android SDK Build Tools]</strong>、<strong>[Android SDK Platform-Tools]</strong>、<strong>[Android SDK Tools]</strong> のチェック ボックスを選択します。
</li>
<li>[<strong>OK</strong>] をクリックして、インストールするパッケージの使用許諾に同意します。
</li>
</ol>
<h3 id="docs-dl">N Preview のリファレンス ドキュメントを入手する</h3>
<p>
Android N API に関する詳細は、N Preview のリファレンス ドキュメントに記載されています。このドキュメントは、次の表からダウンロードできます。このパッケージには、簡略化されたオフライン バージョンの Android デベロッパー ウェブサイト、Android N API のアップデートされた API リファレンス、API の比較レポートが含まれています。
</p>
<table>
<tr>
<th scope="col">ドキュメント</th>
<th scope="col">チェックサム</th>
</tr>
<tr>
<td style="white-space: nowrap">
<a href="{@docRoot}shareables/preview/n-preview-1-docs.zip">n-preview-1-docs.zip</a></td>
<td width="100%">
MD5: 4ab33ccbe698f46f125cc5b807cf9c2f<br>
SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5
</td>
</tr>
<table>
<h2 id="java8">Java 8 JDK および JRE を入手する</h2>
<p>Android N プラットフォームを対象にしたアプリをコンパイルするには、Java 8 Developer KitJDK 8を使用する必要があります。また、Android Studio 2.1 でいくつかのツールを使用するには、Java 8 Runtime EnvironmentJRE 8をインストールする必要があります。したがって、JDK 8 と JRE 8 の最新バージョンを持っていない場合は、すぐに JDK 8 と JRE 8 をダウンロードしてください。
</p>
<p>その後、次のステップに従って Android Studio で JDK のバージョンを設定します。</p>
<ol>
<li>Android Studio で Android プロジェクトを開いてから、<strong>[File] &gt; [Project Structure]</strong> を選択して、[Project Structure] ダイアログを開きます(または、<strong>[File] &gt; [Other Settings] &gt; [Default Project Structure]</strong> を選択すると、すべてのプロジェクトのデフォルトを設定できます)。
</li>
<li>ダイアログの左側のパネルで、[<strong>SDK Location</strong>] をクリックします。
</li>
<li>[<strong>JDK Location</strong>] フィールドに Java 8 JDK の場所を入力し(ファイルを参照するには、右側のボタンをクリックします)、[<strong>OK</strong>] をクリックします。
</li>
</ol>
<img src="{@docRoot}preview/images/studio-jdk-location.jpg" width="700" alt="" />
<h2 id="create-update">プロジェクトをアップデートまたは作成する</h2>
<p>
Android N API を使用するには、プロジェクトが適切に構成されている必要があります。
</p>
<p>Java 8 機能の使用を計画している場合は、<a href="{@docRoot}preview/j8-jack.html">Java 8 機能</a>を読んで、サポートされる Java 8 機能に関する情報と、プロジェクトで Jack コンパイラーを構成する方法を確認してください。
</p>
<h3 id="update">既存のプロジェクトをアップデートする</h3>
<p>モジュールの <code>build.gradle</code> ファイルを開き、次のように値をアップデートします。
</p>
<pre>
android {
compileSdkVersion <strong>'android-N'</strong>
buildToolsVersion <strong>'24.0.0-rc1'</strong>
...
defaultConfig {
minSdkVersion <strong>'N'</strong>
targetSdkVersion <strong>'N'</strong>
...
}
...
}</pre>
<h3 id="create">新しいプロジェクトを作成する</h3>
<p>Android N Preview SDK を使って、開発のために新しいプロジェクトを作成するには、次のステップを実行します。</p>
<ol>
<li><strong>[File] &gt; [New Project]</strong> をクリックし、対象とする Android 端末のページに到達するまでのステップを実行します。
</li>
<li>このページで、[<strong>Phone and Tablet</strong>] オプションを選択します。</li>
<li>[<strong>Phone and Tablet</strong>] オプションの下にある [<strong>Minimum SDK</strong>] オプション リストで、[<strong>N: Android API 23, N Preview (Preview)</strong>] を選択します。
</li>
</ol>
<h2 id="next">次のステップ</h2>
<ul>
<li><a href="{@docRoot}preview/download.html">Android N デバイスでのテスト</a>に関するガイドに従ってください。</li>
<li>Android N プラットフォームの詳細については、<a href="{@docRoot}preview/behavior-changes.html">動作の変更点</a>と <a href="{@docRoot}preview/api-overview.html">Android N API とその機能</a>をご覧ください。
</li>
</ul>

View File

@@ -0,0 +1,676 @@
page.title=개발자용 Android N
meta.tags="프리뷰", "androidn"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-apis_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>주요 개발자 기능</h2>
<ol>
<ul style="list-style-type:none;">
<li><a href="#multi-window_support">다중 창 지원</a></li>
<li><a href="#notification_enhancements">알림</a></li>
<li><a href="#jit_aot">JIT/AOT 컴파일</a></li>
<li><a href="#quick_path_to_app_install">앱 설치를 위한 빠른 경로</a></li>
<li><a href="#doze_on_the_go">이동 중에 Doze</a></li>
<li><a href="#background_optimizations">백그라운드 최적화</a></li>
<li><a href="#data_saver">Data Saver</a></li>
<li><a href="#tile_api">빠른 설정 타일 API</a></li>
<li><a href="#number-blocking">번호 차단</a></li>
<li><a href="#call_screening">통화 스크리닝</a></li>
<li><a href="#multi-locale_languages">로케일 및 언어</a></li>
<li><a href="#icu4">Android의 ICU4J API</a></li>
<li><a href="#gles_32">OpenGL ES 3.2 API</a></li>
<li><a href="#android_tv_recording">Android TV 녹화</a></li>
<li><a href="#android_for_work">Android for Work</a></li>
<li><a href="#accessibility_enhancements">접근성</a></li>
<li><a href="#direct_boot">직접 부팅</a></li>
<li><a href="#key_attestation">Key Attestation</a></li>
<li><a href="#network_security_config">네트워크 보안 구성</a></li>
<li><a href="#default_trusted_ca">신뢰할 수 있는 기본 CA</a></li>
<li><a href="apk_signature_v2">APK 서명 구성표 v2</a></li>
<li><a href="#scoped_directory_access">범위가 지정된 디렉터리 액세스</a></li>
</ol>
</div>
</div>
<p>Android N은 아직 한창 개발 중이지만, N Developer Preview를
통해 지금 Android N을 일부 체험해 볼 수 있습니다. 아래 섹션에서는
개발자를 위한 몇 가지 새로운 기능을 중점적으로 다룹니다. </p>
<p>
플랫폼 변경사항이 앱에 영향을 미칠 수도 있는 부분에
대해 알아보려면 <a href="{@docRoot}preview/behavior-changes.html">동작 변경사항</a>을 살펴보고,
주요 기능에 대해 자세히 알아보려면 개발자 가이드를 참조하고, 새로운 API에 대한 자세한
내용은 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>를 다운로드하세요.
</p>
<h2 id="multi-window_support">다중 창 지원</h2>
<p>Android N에서 저희는 요청이 많은 새로운 멀티태스킹
기능인 다중 창 지원을 플랫폼에 도입하고 있습니다. </p>
<p>이제 사용자가 화면에서 두 개의 앱을 동시에 열 수 있습니다. </p>
<ul>
<li>Android N이 실행되는
전화와 태블릿에서 사용자가 화면 분할 모드에서 두 개의 앱을
나란히 또는 상하로 실행할 수 있습니다. 또한 앱 사이의 디바이더를 끌어서 앱의 크기를
조정할 수 있습니다. </li>
<li>Android TV 기기에서, 앱이 <a href="{@docRoot}preview/features/picture-in-picture.html">화면 속 화면
모드</a>로 배치될 수 있으므로, 사용자가 검색을 수행하거나 다른
앱과 상호작용하는 중에도 앱이 계속해서 콘텐츠를 표시할 수 있습니다. 자세한 내용은 아래를 참조하세요. </li>
</ul>
<div class="col-4of10">
<img src="{@docRoot}preview/images/mw-portrait.png" alt="" style="height:460px;padding-left:1em;" id="img-split-screen" />
<p class="img-caption">
<strong>그림 1.</strong> 화면 분할 모드에서 실행되는 앱.
</p>
</div>
<p>특히 태블릿이나 다른 대형 화면 기기에서 다중 창
지원을 통해 새로운 방식으로 사용자를 참여시킬 수 있습니다. 또한
앱에서 끌어서 놓기 기능을 활성화하여 사용자가 편리하게 앱에 콘텐츠를 끌어다 놓거나 앱에서 콘텐츠를 끌어와서 놓을 수 있으므로,
사용자 경험이 크게 개선됩니다. </p>
<p>다중 창 지원을 앱에 추가하고 다중 창이 표시되는 방식을
구성하는 것은 매우 간단합니다. 예를 들어, 자신의 액티비티에 대해
최소 허용 크기를 지정할 수 있으며 이 경우 사용자는 이 크기보다
작은 액티비티의 크기를 조정할 수 없습니다. 또한 앱에
대해 다중 창 표시를 비활성화할 수도 있으며 이 경우 시스템은 앱을 전체 화면 모드에서만 표시합니다.</p>
<p>
자세한 내용은 <a href="{@docRoot}preview/features/multi-window.html">다중 창 지원</a>
개발자 문서를 참조하세요.
</p>
<h2 id="notification_enhancements">알림 향상</h2>
<p>Android N에서 저희는 알림을 더 쉽고 빠르게 사용할 수
있도록 재설계했습니다. 몇 가지 변경사항은 다음과 같습니다.</p>
<ul>
<li>
<strong>템플릿 업데이트</strong>: 영웅 이미지와 아바타를 새롭게
강조하기 위해 알림 템플릿을 업데이트하는
중입니다. 개발자가 최소한의 코드 조정만으로 새로운 템플릿을 활용할 수가 있습니다.
</li>
<li>
<strong>묶음 알림</strong>: 시스템이 메시지를 서로
그룹화하고(예: 메시지 주제별로 그룹화) 이 그룹을 표시할 수 있습니다.
사용자는 그룹에 대해 닫기 또는 아카이브 등의 작업을 적절히 수행할 수
있습니다. Android Wear용 알림을 구현한 적이 있다면 이미 이 모델에 친숙할
것입니다.
</li>
<li>
<strong>직접 회신</strong>: 실시간 통신 앱의 경우, Android 시스템은
인라인 회신을 지원하므로, 사용자가 알림 인터페이스
내에서 신속하게 SMS 또는 문자 메시지에 응답할 수 있습니다.
</li>
<li>
<strong>사용자 지정 뷰</strong>: 두 개의 새로운 API를 통해 사용자
지정 뷰를 알림에 사용할 때 시스템 장식(예: 알림 헤더 및 작업)을
활용할 수 있습니다.
</li>
</ul>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-1.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-3.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-2.png" alt="" style="padding:.5em;max-width:226px">
</div>
<p class="img-caption">
<strong>그림 2.</strong> 묶음 알림 및 직접 회신.
</p>
<p>새로운 기능을 구현하는 방법에 대해 알아보려면,
<a href="{@docRoot}preview/features/notification-updates.html">알림</a>
가이드를 참조하세요.</p>
<h2 id="jit_aot">프로필 가이드 방식의 JIT/AOT 컴파일</h2>
<p>Android N에서 코드 프로파일링을 포함한
JIT(Just in Time) 컴파일러를 ART에 추가했으며, 실행 시에 Android 앱의
성능이 계속해서 향상됩니다. JIT 컴파일러는 ART의 현재
AOT(Ahead of Time) 컴파일러를 보완하고 런타임 성능을 개선하며,
저장 공간을 절약하고, 앱 업데이트 및 시스템 업데이트 속도를 빠르게 해줍니다.</p>
<p>프로필 가이드 방식의 컴파일을 통해 ART는 실제 사용량과 기기의
조건에 따라 각 앱의 AOT/JIT 컴파일을 관리할 수 있습니다. 예를 들어,
ART는 최적의 성능을 위해 각 앱의 핫 메서드에 대한 프로필을
유지관리하고 이들 메서드를 프리컴파일하고
캐싱할 수 있습니다. 이 경우 앱의 다른 부분들은 실제로 사용될 때까지 컴파일하지 않고 남겨둡니다.</p>
<p>프로필 가이드 방식의
컴파일은 앱의 주요 부분들에서 성능을 개선할
뿐만 아니라 관련 바이너리를 비롯한 앱 전체의 RAM 공간을 줄이는 데 도움이 됩니다. 이 기능은 저용량 메모리 기기에 특히 중요합니다.</p>
<p>ART는 기기 배터리에 미치는 영향이 최소화되는 방식으로
프로필 가이드 방식의 컴파일을 관리합니다. ART는 기기가 유휴 상태이고
충전 중일 때만 프리컴파일을 수행하며, 해당 작업을 미리 수행하여 시간과 배터리를 절약합니다.</p>
<h2 id="quick_path_to_app_install">앱 설치를 위한 빠른 경로</h2>
<p>ART의 JIT 컴파일러가 가진 가장 눈에 띄는 이점 중 하나는
앱 설치 및 시스템 업데이트 속도가 빠르다는 것입니다.
Android 6.0에서 최적화하고 설치하는 데 몇 분이 걸리는 대용량 앱조차도
이제는 몇 초만에 설치가 가능합니다. 또한 최적화 단계가 없기 때문에 시스템 업데이트도 더 빠릅니다. </p>
<h2 id="doze_on_the_go">이동 중에 Doze...</h2>
<p>Android 6.0에서는 기기가 테이블 위나 서랍 안에
있는 등 유휴 상태일 때 앱이 CPU와 네트워크를 사용하는 작업을 지연시키는 방식으로 배터리를
절약하는 시스템 모드인 Doze를 도입했습니다. </p>
<p>이제 Android N에서 Doze는 한걸음 더 나아가서 이동 중에도
배터리를 절약합니다. 화면이 일정 시간 동안 꺼져있고 기기의 플러그가
뽑혀있으면 Doze는 친숙한 일부 CPU 및 네트워크 제한을 앱에 적용합니다.
즉, 사용자가 기기를 주머니에 휴대하고 다닐 때도 배터리를
절약할 수 있습니다.</p>
<img src="/preview/images/doze-diagram-1.png" alt="" id="figure1" />
<p class="img-caption">
<strong>그림 3.</strong> 이제 Doze는 기기가 정지 상태가 아니더라도
배터리 수명을 개선할 수 있도록 제한을 적용합니다.
</p>
<p>기기의 배터리가 켜져 있는 동안 화면이 꺼지면 잠시 후에
Doze는 네트워크 액세스를 제한하고 작업과 동기화를 지연시킵니다.
잠시 동안의 유지관리 기간 중에
애플리케이션의 네트워크 액세스가 허용되고 지연된 작업/동기화가 실행됩니다.
화면을 켜거나 기기의 플러그를 꽂으면 기기가 Doze 상태에서 벗어납니다.</p>
<p>기기가 다시 일정 시간 동안 배터리가 켜져 있고 화면이 꺼진
정지 상태가 되면, Doze는 {@link
android.os.PowerManager.WakeLock}, {@link android.app.AlarmManager} 알람 및
GPS/Wi-Fi 스캔에 대해 전체 CPU 및 네트워크 제한을 적용합니다.</p>
<p>앱을 Doze에 맞게 적용하는 최선의 방법은 기기가 움직이든
움직이지 않든 간에 동일합니다. 따라서 Doze를 효율적으로 처리하도록
앱을 이미 업데이트했다면 모든 준비가 완료된 것입니다. 아직
업데이트하지 않았다면 지금 <a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">앱을 Doze에 맞게 적용</a>해 보세요.</p>
<h2 id="background_optimizations">Project Svelte: 백그라운드 최적화</h2>
<p>Project Svelte는 에코시스템의 전체 Android 기기 범위에서 시스템 및 앱에
의해 사용되는 RAM 크기를 최소화하기 위한 지속적인 노력입니다. Android N에서 Project
Svelte는 앱이 백그라운드에서 실행되는 방식을 최적화하는 데 초점을 맞추고 있습니다. </p>
<p>백그라운드 처리는 대부분의 앱에서 필수적인 부분입니다.
백그라운드 처리가 올바로 수행된다면 신속하고, 빠르고, 상황에 맞는 멋진 사용자 경험을 제공하겠지만, 백그라운드
처리가 올바로 수행되지 않는다면 불필요하게 RAM과 배터리를 소모하고
다른 앱의 시스템 성능에 영향을 미칠 것입니다. </p>
<p>Android 5.0 이후로, 사용자가 선호하는 백그라운드 작업
수행 방식은 {@link android.app.job.JobScheduler}이었습니다. 메모리,
전원 및 연결 조건에 따라 시스템을 최적화하면서도 앱으로
작업을 예약할 수 있습니다. JobScheduler는 제어 기능과 간편성을 함께
제공하므로, 저희는 모든 앱에서 이를 사용하기를 원합니다. </p>
<p>
또 한가지의 좋은 옵션은 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
<code>GCMNetworkManager</code></a>입니다. 이는 Google Play
서비스의 일부분이며, 기존 Android 버전에서 호환성이
있는 유사한 작업 예약 기능을 제공합니다.
</p>
<p>저희는 더 많은 사용 사례를 충족시키기 위해 <code>JobScheduler</code> 및
<code>GCMNetworkManager</code>를 계속해서
확장하고 있습니다. 예를 들어, 이제 Android N에서는 콘텐츠 제공자의 변화에 따라
백그라운드 작업을 예약할 수 있습니다. 이와 동시에 저희는
특히 저용량 메모리 기기에서 시스템 성능을 저하시킬
수 있는 일부 오래된 패턴들을 없애기 시작했습니다.</p>
<p>Android N에서 저희는 자주 사용되는 세 가지 암시적 브로드캐스트인
{@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}, {@link
android.hardware.Camera#ACTION_NEW_PICTURE} 및 {@link
android.hardware.Camera#ACTION_NEW_VIDEO}를
제거하는 중입니다. 왜냐하면 이들은 여러 앱의 백그라운드 프로세스를 동시에 깨울 수 있으며 메모리와 배터리를 소모할 수 있기
때문입니다. 자신의 앱이 이러한 브로드캐스트를 수신한다면, N Developer Preview를
활용하여 <code>JobScheduler</code> 및 관련 API로 마이그레이션하세요. </p>
<p>
자세한 내용은 <a href="{@docRoot}preview/features/background-optimization.html">백그라운드
최적화</a> 문서를 참조하세요.
</p>
<h2 id="data_saver">Data Saver</h2>
<div class="col-5of12" style="margin-right:1.5em;">
<img src="{@docRoot}preview/images/datasaver.png" style="border:2px solid #ddd">
<p class="img-caption" style="padding-right:2em;">
<strong>그림 4.</strong> 설정에서의 Data Saver.
</p>
</div>
<p>모바일 기기의 수명에 있어서, 셀룰러 데이터 플랜의 비용은
일반적으로 기기 자체의 비용보다 더 많습니다.
많은 사용자들에게 셀룰러 데이터는 아껴야 하는 값비싼 리소스입니다. </p>
<p>Android N에서는 새로운 시스템 서비스인 Data Saver
모드를 소개합니다. 이 모드는 로밍 시나 결제 주기가 끝날 무렵,
또는 소액 선불 데이터 팩 사용 시에 앱이 소모하는 셀룰러
데이터 사용량을 줄여줍니다. Data Saver를 통해 사용자는 앱이
셀룰러 데이터를 사용하는 방식을 제어할 수 있으며, Data Saver가 켜져 있으면 개발자가 더 효율적인 서비스를 제공할 수 있습니다. </p>
<p>사용자가 <strong>Settings</strong>에서 Data Saver를 활성화하고
해당 기기가 데이터 통신 네트워크에 있는 경우, 시스템은 백그라운드
데이터 사용을 차단하고, 가능하면 스트리밍의
비트 속도를 제한하거나, 화질을 줄이거나, 낙관적 사전캐싱을
지연시키는 등의 방식으로 포그라운드에서
데이터를 더 적게 사용하도록 앱에게 신호를 보냅니다 . Data Saver가 켜진 경우에도 백그라운드 데이터 통신 연결을 허용하려면, 사용자가 특정 앱을 허용 목록에 추가할 수 있습니다.</p>
<p>Android N은 {@link android.net.ConnectivityManager}를 확장하여 <a href="{@docRoot}preview/features/data-saver.html#status">사용자의
Data Saver 기본 설정을 검색</a>하고 <a href="{@docRoot}preview/features/data-saver.html#monitor-changes">기본
설정 변경을 모니터링</a>하는 방법을 앱에게 제공합니다.
모든 앱은 사용자가 Data Saver를 활성화했는지 여부를 확인해야 하며
포그라운드 및 백그라운드 데이터 사용을 제한하도록 노력해야 합니다.</p>
<h2 id="tile_api">빠른 설정 타일 API</h2>
<div style="float:right;max-width:320px">
<img src="{@docRoot}preview/images/quicksettings.png" style="padding-left:1.5em;">
<p class="img-caption" style="padding-left:2em;">
<strong>그림 5.</strong> 알림 창의 빠른 설정 타일.
</p>
</div><p>빠른 설정은 알림 창에서 키 설정 및 작업을 직접 노출시키기
위해 널리 사용되는 간단한 방법입니다. 더욱 유용하고 편리한 설정을
위해 저희는 Android N에서 빠른 설정의 범위를 더욱 확장했습니다. </p>
<p>저희는 빠른 설정 타일에 필요한 공간을 더 추가했으며,
사용자가 페이지가 지정된 디스플레이 영역에서 왼쪽 또는 오른쪽으로 스와이프하여
이들 타일에 액세스할 수 있습니다. 또한 빠른 설정 타일이
어떻게 나타나는지와 어디에 표시되는지를 사용자가 제어할 수 있으며 사용자가 드래그 앤 드롭만으로 타일을 추가하거나 이동할 수 있습니다. </p>
<p>또한 Android N은 개발자를 위해 새로운 API도 추가했습니다.
이를 통해 자신만의 빠른 설정 타일을 정의할 수 있으며, 사용자가 앱에서 키 컨트롤 및 작업에 쉽게 액세스할 수 있습니다.</p>
<p>
빠른 설정 타일은 긴급하게 필요하거나 자주 사용되는 컨트롤 또는
작업을 위해 예약되어 있으며, 앱을 시작하기 위한 바로가기로
사용되어서는 안됩니다.
</p>
<p>
타일을 정의한 후에는 사용자에게 표시할 수 있으며, 사용자가
드래그 앤 드롭만으로 이 타일을 빠른 설정에 추가할 수 있습니다.
</p>
<p>
앱 타일 만들기에 대한 자세한 내용은,
다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>에서 <code>android.service.quicksettings.Tile</code>을 참조하세요.
</p>
<h2 id="number-blocking">번호 차단</h2>
<p>이제 Android N에서는 플랫폼에서 번호 차단을 지원하며,
서비스 제공자가 차단된 번호 목록을 유지관리할 수 있도록 프레임워크
API를 제공합니다. 기본 SMS 앱, 기본 전화 앱 및 제공자 앱은
차단된 번호 목록에 쓰기와 읽기가 가능합니다. 이 목록은 다른 앱에서는 액세스할 수 없습니다.</p>
<p>Android는 번호 차단을 플랫폼의 표준 기능으로 만들어
광범위한 기기에서 번호를 차단하기 위한 일관된 방식을 앱에
제공합니다. 앱에서 활용할 수 있는 기타 이점은 다음과 같습니다.</p>
<ul>
<li> 통화에서 차단된 번호가 문자에서도 차단됩니다.
<li> 차단된 번호는 재설정 시에도 백업 및 복원 기능을 통해
기기에서 유지될 수 있습니다.
<li> 여러 앱이 동일한 차단된 번호 목록을 사용할 수 있습니다.
</ul>
<p>또한 Android를 통한 통신사 앱 통합은 통신사들이 기기의
차단된 번호 목록을 읽고 서비스측 차단을 수행할 수 있음을 의미하며,
이를 통해 사용자들은 원치 않는 통화와 문자가
특정 매체(예: VOIP 엔드포인트 또는 착신 전화)를 통해 자신들에게 도달하는 것을 차단할 수 있습니다.</p>
<p>
자세한 내용은
다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API
참조</a>에서 <code>android.provider.BlockedNumberContract</code>를 참조하세요.
</p>
<h2 id="call_screening">통화 스크리닝</h2>
<p>
Android N에서는 기본 전화 앱이 수신 통화를 스크리닝하도록
허용합니다. 이를 위해 전화 앱에는 새로운 <code>CallScreeningService</code>가 구현되며 이를 통해 전화 앱은
수신 통화의 {@link android.telecom.Call.Details Call.Details}에 따라
다음과 같은 다양한 작업을 수행할 수 있습니다.
</p>
<ul>
<li> 수신 통화 거절
<li> 통화를 통화 기록에 허용하지 않음
<li> 통화 알림을 사용자에게 표시하지 않음
</ul>
<p>
자세한 내용은
다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API
참조</a>에서 <code>android.telecom.CallScreeningService</code>를 참조하세요.
</p>
<h2 id="multi-locale_languages">다중 로케일 지원, 더 많은 언어</h2>
<p>두 가지 언어로 된 사용 사례를 지원하기 위해 이제
Android N에서는 사용자가 설정에서 <strong>다중 로케일</strong>을 선택할 수
있습니다. 앱은 새로운 API를 사용하여 사용자의 로케일을 가져온
다음, 검색 결과를 여러 언어로 표시하거나 사용자가 이미 알고있는
언어로는 웹페이지를 번역하지 않는 등 다중 로케일 사용자를 위한 더욱 정교한 사용자 경험을
제공합니다.</p>
<p>다중 로케일 지원과 함께 Android N에서는 또한 사용자가
사용 가능한 언어의 범위를 더욱 넓혔습니다.
영어, 스페인어, 프랑스어, 아랍어 등 자주 사용되는 언어에 대해 각각 25가지
이상의 변형을 제공하며, 또한 100가지 이상의 새로운 언어에 대해 부분적인 지원도 추가했습니다.</p>
<p>앱은 사용자가 설정한 로케일 목록을 가져오기 위해
<code>LocaleList.GetDefault()</code>를 호출할 수 있습니다. 더 많은
수의 로케일을 지원하기 위해 Android N에서는 리소스 확인 방식이 바뀌고 있습니다. 새로운 리소스 확인 로직에서 앱이 예상대로 작동하는지 테스트하고 확인하세요.</p>
<p>새로운 리소스 확인 동작과 따라야 하는 모범 사례에 대해
알아보려면, <a href="{@docRoot}preview/features/multilingual-support.html">다국어 지원</a>을 참조하세요.</p>
<h2 id="icu4">Android의 ICU4J API</h2>
<p>
이제 Android N에서는 <code>android.icu</code> 패키지 아래 Android 프레임워크에 있는 <a href="http://site.icu-project.org/">ICU4J</a> API의
일부를 제공합니다. 마이그레이션이
용이하며, 대개는 <code>com.java.icu</code> 네임스페이스를
<code>android.icu</code>로 변경하는 것이 간단합니다. 앱에서 ICU4J 번들을
이미 사용 중인 경우, Android 프레임워크에서 제공되는 <code>android.icu</code>
API로 전환하면 APK 크기를 상당히 절약할 수 있습니다.
</p>
<p>
Android ICU4J API에 대해 자세히 알아보려면, <a href="{@docRoot}preview/features/icu4j-framework.html">ICU4J 지원</a>을 참조하세요.
</p>
<h2 id="gles_32">OpenGL&trade; ES 3.2 API</h2>
<p>Android N에서는 OpenGL ES 3.2용 프레임워크 인터페이스와 플랫폼 지원을 추가했습니다.</p>
<ul>
<li> <code>EXT_texture_sRGB_decode</code>를 제외한 <a class="external-link" href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">Android 확장 프로그램 팩</a></a>(AEP)의 모든 확장 프로그램.
<li> HDR 및 지연 셰이딩을 위한 부동 소수점 프레임 버퍼.
<li> 일괄처리 및 스트리밍 성능을 향상시키는 BaseVertex 그리기 호출.
<li> WebGL 오버헤드를 줄여주는 강력한 버퍼 액세스 제어.
</ul>
<p>Android N의 OpenGL ES 3.2용 프레임워크 API에는
<code>GLES32</code> 클래스가 제공됩니다. OpenGL ES 3.2를 사용 중인
경우, 반드시 <code>&lt;uses-feature&gt;</code> 태그와 <code>android:glEsVersion</code>
특성을 사용하여 요구사항을 매니페스트 파일에 선언하세요. </p>
<p>런타임에 기기의 지원 OpenGL ES 버전을 확인하는
방법을 비롯하여 OpenGL ES 사용에 대한 자세한 내용은, <a href="{@docRoot}guide/topics/graphics/opengl.html">OpenGL ES API 가이드</a>를 참조하세요.</p>
<h2 id="android_tv_recording">Android TV 녹화</h2>
<p>Android N에서는 새로운 녹화 API를 통해 Android TV 입력
서비스로부터 콘텐츠를 녹화하고 재생하는 기능을
추가했습니다. 기존의 타임 시프트 API를 기반으로 구축된 TV 입력
서비스는 녹화 가능한 채널 데이터 및 녹화된 세션의 저장 방식을 제어할 수 있으며, 녹화된 콘텐츠와의 사용자 상호작용을 관리할 수 있습니다. </p>
<p>자세한 내용은 <a href="{@docRoot}preview/features/tv-recording-api.html">Android TV Recording API</a>를 참조하세요.</p>
<h2 id="android_for_work">Android for Work</h2>
<p>Android for Work에서는 Android N이 실행되는 기기를
위해 여러 가지 새로운 기능과 API를 추가했습니다. 몇 가지 특징이
아래에 나와 있으며, Android N과 관련된 Android for Work 업데이트의 전체 목록에 대해서는 Android for Work 변경사항을 참조하세요.</p>
<h3 id="work_profile_security_challenge">작업 프로필 보안 과제 </h3>
<p>
프로필 소유자는 작업 프로필에서 실행 중인 앱에 대해
별도의 보안 과제를 지정할 수 있습니다. 작업 과제는 사용자가 작업
앱을 열려고 시도할 때 나타납니다. 보안 과제를 성공적으로 완료하면
작업 프로필의 잠금이 해제되고 필요한 경우 암호가 풀립니다.
프로필 소유자의 경우, <code>ACTION_SET_NEW_PASSWORD</code>는
작업 과제를 설정하라는 메시지를 사용자에게 표시하고, <code>ACTION_SET_NEW_PARENT_PROFILE_PASSWORD</code>는 기기
잠금을 설정하라는 메시지를 사용자에게 표시합니다.
</p>
<p>
프로필 소유자는 <code>setPasswordQuality()</code>, <code>setPasswordMinimumLength()</code> 및 관련 메서드를 사용하여
작업 과제에 대해 별개의 암호 정책을 설정할 수 있습니다. 프로필
소유자는 또한 새로운 <code>getParentProfileInstance()</code>에 의해
반환되는 <code>DevicePolicyManager</code> 인스턴스를 사용하여 기기
잠금을 설정할 수도 있습니다. 뿐만 아니라, 프로필 소유자는
새로운 <code>setOrganizationColor()</code> 및 <code>setOrganizationName()</code>
메서드를 사용하여
작업 과제에 대해 자격 증명 화면을
사용자 지정할 수 있습니다.
</p>
<h3 id="turn_off_work">작업 끄기 </h3>
<p>작업 프로필이 있는 기기에서, 사용자가 작업 모드를
전환할 수 있습니다. 작업 모드가 꺼진 경우, 관리되는 사용자가
일시적으로 종료되며 이 경우 작업 프로필 앱, 백그라운드
동기화 및 알림이 비활성화됩니다. 여기에는 프로필 소유자 애플리케이션이
포함됩니다. 작업 모드가 꺼진 경우, 작업 앱을 시작할 수 없음을 사용자에게 알려주는 상태 아이콘이 표시됩니다.
시작 관리자는 작업 앱과 위젯에 액세스할 수 없음을 나타냅니다. </p>
<h3 id="always_on_vpn">항상 켜진 VPN </h3>
<p>기기 소유자와 프로필 소유자는 지정된 VPN을 통해 작업 앱이
항상 연결되도록 보장할 수 있습니다. 시스템은 기기가 부팅된
후에 자동으로 VPN을 시작합니다.</p>
<p>
새로운 <code>DevicePolicyManager</code> 메서드는
<code>setAlwaysOnVpnPackage()</code> 및
<code>getAlwaysOnVpnPackage()</code>입니다.
</p>
<p>VPN 서비스는 앱 상호작용 없이 시스템에 의해 직접 바인드될
수 있으므로, VPN 클라이언트는 '항상 켜진 VPN'에 대해
새로운 진입점을 처리해야 합니다. 이전과 마찬가지로, 인텐트 필터
일치 작업 <code>android.net.VpnService</code>에 의해 서비스가 시스템에 나타납니다. </p>
<p>
사용자는 또한 <strong>Settings&gt;More&gt;Vpn</strong>을 사용하여 기본 사용자에서
<code>VPNService</code> 메서드를
구현하는 '항상 켜진 VPN' 클라이언트를 수동으로 설정할 수도 있습니다.
</p>
<h2 id="accessibility_enhancements">접근성 향상</h2>
<p>이제 Android N에서는 새로운 기기 설치 시 Welcome 화면에서
바로 Vision Settings를 제공합니다. 이렇게 하면 사용자가 자신의
기기에서 휠씬 더 쉽게 확대 제스처, 글꼴 크기,
디스플레이 크기 및 TalkBack 등과 같은 접근성 기능을 검색하고 구성할 수 있습니다. </p>
<p>이렇게 눈에 띄는 위치에 접근성 기능을 배치하면, 사용자가 이
기능을 활성화하여 앱을 사용할 가능성이 더욱 커집니다. 먼저 이들
설정을 활성화하고 앱을 테스트하도록 하세요. Settings &gt;
Accessibility에서 설정을 활성화할 수 있습니다.</p>
<p>Android N에서도 마찬가지로, 이제 운동 장애가 있는 사용자가
접근성 서비스를 통해 스크린을 터치할 수 있습니다. 새로운 API는 얼굴 추적, 시각 추적,
지점 스캐닝 등의 기능으로 서비스를 구축하여 이러한 사용자의
요구를 충족시킬 수 있습니다.</p>
<p>자세한 내용은
다운로드 가능한 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>에서 <code>android.accessibilityservice.GestureDescription</code>을 참조하세요.</p>
<h2 id="direct_boot">직접 부팅</h2>
<p>직접 부팅은 기기 시동 시간을 개선해주며, 예상치 못한 재부팅
후에도 등록된 앱이 제한된 기능을 유지하도록 해줍니다. 예를 들어,
사용자가 취침하는 동안에 암호화된 기기가 재부팅되는 경우,
이제는 등록되어 있는 알람, 메시지 및 수신 통화로 사용자에게 알려줄
수 있습니다. 즉, 재시작 직후에도 접근성 서비스를 바로
사용할 수 있습니다.</p>
<p>직접 부팅은 Android N의 파일 기반 암호화를 활용하여 시스템
및 앱 데이터에 대해 정밀한 암호화 정책을 활성화합니다. 이 시스템은
선택된 시스템 데이터와 명시적으로 등록된 앱
데이터에 대해 기기 암호화 스토어를 사용합니다. 기본적으로, 다른 모든
시스템 데이터, 사용자 데이터, 앱 및 앱 데이터에는 자격 증명 암호화 스토어가 사용됩니다. </p>
<p>부팅 시에 시스템은 제한된 모드에서 시작되며, 기기 암호화
데이터에만 액세스가 가능하고 앱 또는 데이터에는 액세스하지
못합니다. 이 모드에서 구성 요소를 실행하려는 경우,
매니페스트에 플래그를 설정하여 구성 요소를 등록할 수 있습니다.
재시작 후에는 시스템이 <code>LOCKED_BOOT_COMPLETED</code> 인텐트를
브로드캐스트하여 등록된 구성 요소를 활성화합니다. 잠금을 해제하기 전에, 시스템은 등록된 기기 암호화
앱 데이터가 있는지를 확인합니다. 사용자가 잠금 화면 자격 증명을 확인하여
암호화를 풀기 전까지는 다른 모든 데이터를 사용할 수 없습니다. </p>
자세한 내용은 <a href="{@docRoot}preview/features/direct-boot.html">직접 부팅</a>을 참조하세요.</p>
</p>
<h2 id="key_attestation">Key Attestation</h2>
<p>하드웨어 기반 키스토어는 Android 기기에서 암호화 키를
만들고 저장하고 사용하기 위한 훨씬 더 안전한 방법입니다. 이
키스토어는 Linux 커널, 잠재적 Android 취약점, 루팅된 기기의
공격으로부터 키를 보호해 줍니다.</p>
<p>하드웨어 기반 키스토어를 더욱 쉽고 안전하게 사용하도록
Android N에서는 Key Attestation을 도입합니다. Key Attestation을 사용하여 앱
및 기기는 RSA 또는 EC 키 쌍이 하드웨어 기반인지 여부를 결정할 수
있으며, 키 쌍의 속성에는 어떤 것이 있으며 어떠한 제약 조건이 사용
및 유효성에 적용되는지 결정할 수 있습니다. </p>
<p>앱 및 기기 서비스는 X.509 증명 인증서를 통해 키 쌍에 대한
정보를 요청할 수 있으며 이 인증서는 유효한 증명 키로 서명되어야
합니다. 증명 키는 공장에서 기기의 하드웨어 기반
키스토어에 주입되는 ECDSA 서명 키입니다. 따라서 올바른 증명서 키로
서명된 증명 인증서는 키스토어에 있는 키 쌍의
세부정보와 함께 하드웨어 기반 키스토어가 존재함을
확인해 줍니다.</p>
<p>안전한 공식 Android 공장 이미지가 기기에 사용 중인지
확인하기 위해, Key Attestation은
기기 <a class="external-link" href="https://source.android.com/security/verifiedboot/verified-boot.html#bootloader_requirements">부팅 로더</a>가 다음의 정보를 <a class="external-link" href="https://source.android.com/security/trusty/index.html">TEE(Trusted Execution Environment)</a>에
제공하도록 요구합니다.</p>
<ul>
<li>기기에 설치된 OS 버전 및 패치 수준</li>
<li><a href="https://source.android.com/security/verifiedboot/index.html" class="external-link">확인된 부팅</a> 공개 키 및 잠금 상태</li>
</ul>
<p>하드웨어 기반 키스토어 기능에 대한 자세한
내용은 <a href="https://source.android.com/security/keystore/" class="external-link">하드웨어 기반 키스토어</a> 가이드를 참조하세요.</p>
<p>Key Attestation 이외에도 Android N에서는 또한 지문 등록
시에 취소되지 않는 지문 바인드 키를 소개합니다.</p>
<h2 id="network_security_config">네트워크 보안 구성</h2>
<p>Android N에서 앱은 오류가 발생하기 쉬운 기존의 프로그래밍 방식
API(예: X509TrustManager)를 사용하는 대신 선언적
<em>네트워크 보안 구성</em>을 사용하여 보안(HTTPS, TLS) 연결의 동작을 코드
수정 없이 안전하게 사용자 지정할 수 있습니다.</p>
<p>지원되는 기능:</p>
<ul>
<li><b>트러스트 앵커 사용자 지정.</b> 보안 연결을 위해 어떤
인증 기관(CA)이 신뢰받는지를 애플리케이션이 사용자 지정할 수
있습니다(예: 자가 서명된 특정 인증서나 제한된 공개 CA 세트 신뢰).
</li>
<li><b>디버그 전용 재정의.</b> 설치된 베이스에 위험을 더하지
않고도, 애플리케이션 개발자가 애플리케이션의 보안 연결을 안전하게
디버그할 수 있습니다.
</li>
<li><b>일반 텍스트 트래픽 옵트아웃.</b> 일반 텍스트 트래픽을 실수로 사용하지
않도록 애플리케이션이 스스로를 보호합니다.</li>
<li><b>인증서 고정.</b> 보안 연결을 위해 어떤 서버 키가
신뢰받는지를 애플리케이션이 제한할 수 있는 고급 기능.</li>
</ul>
<p>자세한 내용은 <a href="{@docRoot}preview/features/security-config.html">네트워크 보안 구성</a>을
참조하세요.</p>
<h2 id="default_trusted_ca">신뢰받는 기본 인증 기관</h2>
<p>기본적으로, Android N을 대상으로 하는 앱은 시스템이
제공한 인증서만을 신뢰하며 사용자가 추가한 인증 기관(CA)은
더 이상 신뢰하지 않습니다. Android N을 대상으로 하는 앱이 사용자가
추가한 CA를 신뢰하려는 경우에는 <a href="{@docRoot}preview/features/security-config.html">네트워크 보안 구성</a>을 사용하여 어떤
사용자 CA를 신뢰할지 지정해야 합니다.</p>
<h2 id="apk_signature_v2">APK 서명 구성표 v2</h2>
<p>이제 PackageManager 클래스는 APK 서명 구성표 v2를
사용하는 앱 검사를 지원합니다. APK 서명 구성표 v2는 전체 파일의
서명 구성표이며, APK 파일의 불법적인 변경을 감지하여
검사 속도를 상당히 개선하고 무결성을 보장해 줍니다.</p>
<p>이전 버전과의 호환성을 유지하기 위해, APK는 v2 서명
구성표로 서명되기 전에 v1 서명 구성표(JAR 서명 구성표)로
서명되어야 합니다. v2 서명 구성표의 경우, v2 구성표로 서명한 후에 추가적인
인증서로 APK를 서명하는 경우 검사가 실패합니다. </p>
<p>APK 서명 구성표 v2 지원은 나중에 N Developer Preview에서
사용할 수 있습니다.</p>
<h2 id="scoped_directory_access">범위가 지정된 디렉터리 액세스</h2>
<p>Android N에서 앱은 새로운 API를 사용하여 특정한
<a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">외부 저장소</a> 디렉터리(SD 카드와 같은 이동식 미디어에 있는 디렉터리 포함)에
대한 액세스를 요청할 수 있습니다. 새로운 API는 애플리케이션이
표준 외부 저장소 디렉터리(예: <code>Pictures</code> 디렉터리)에
액세스하는 방식을 훨씬 단순화합니다.
사진 앱과 같은 앱은 모든 저장소 디렉터리에 대해 액세스 권한을 부여하는 <code>READ_EXTERNAL_STORAGE</code>를 사용하거나 사용자가
디렉터리를 탐색하도록 하는 SAF(Storage Access Framework)를
사용하는 대신 이들 API를 사용할 수 있습니다.</p>
<p>또한 새로운 API는 사용자가 앱에 외부 저장소 액세스 권한을
부여하는 단계를 단순화합니다. 새로운 API를 사용하는 경우,시스템이
어떤 디렉터리에 대한 액세스 권한을 애플리케이션이
요청하는지를 명확하게 설명하기 위해 단순 권한 UI를 사용합니다.</p>
<p>자세한 내용은
<a href="{@docRoot}preview/features/scoped-folder-access.html">범위가 지정된
디렉터리 액세스</a> 개발자 문서를 참조하세요.</p>

View File

@@ -0,0 +1,480 @@
page.title=동작 변경
page.keywords=preview,sdk,compatibility
meta.tags="프리뷰", "호환성"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-changes_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#perf">성능 향상</a>
<ol>
<li><a href="#doze">Doze</a></li>
<li><a href="#bg-opt">백그라운드 최적화</a></li>
</ol>
</li>
<li><a href="#perm">권한 변경</a></li>
<li><a href="#accessibility">접근성 향상</a>
<ol>
<li><a href="#screen-zoom">화면 확대/축소</a></li>
<li><a href="#vision-settings">설정 마법사에서의 비전 설정</a></li>
</ol>
</li>
<li><a href="#ndk">플랫폼 라이브러리에 연결되는 NDK 앱</a></li>
<li><a href="#afw">Android for Work</a></li>
</ol>
<h2>참고 항목</h2>
<ol>
<li><a href="{@docRoot}preview/api-overview.html">
Android N API 개요</a></li>
</ol>
</div>
</div>
<p>
Android N에는 새로운 기능 및 성능과 함께
시스템 및 API 동작의 다양한 변경사항이 포함되어 있습니다. 이 문서에서는
개발자 여러분이 숙지해야 하고 앱을 개발할 때 감안해야 하는 몇 가지
주요 변경 내용을 소개하겠습니다.
</p>
<p>
이전에 Android용 앱을 게시한 적이 있는 경우, 이와 같은
플랫폼 변경으로 인해 앱이 영향을 받을 수 있다는 점을 유의하세요.
</p>
<h2 id="perf">성능 향상</h2>
<p>
Android N에는 기기의 배터리 수명, RAM 사용량 및 앱 성능을
개선하기 위한 시스템 동작 변경이 포함됩니다. 이러한 변경은 시스템 리소스의
가용성과 앱에 대한 시스템 알림에 영향을 미칠 수 있습니다.
이러한 변경을 검토하고 이 변경에 맞게 앱을 조정하는 방법을
평가해야 합니다.
</p>
<h3 id="doze">Doze</h3>
<p>
Android 6.0(API 레벨 23)에서 소개된 Doze 기능은 사용자가 기기의
플러그를 뽑고 정지 상태에서 화면이 꺼져있을 때 CPU 및
네트워크 액티비티를 지연시켜서 배터리 수명을 개선해 줍니다.
Android N에서는 기기의 플러그를 뽑고 화면이 꺼져있는 동안
CPU 및 네트워크 제한의 일부를 적용하여 Doze의 기능을 더욱
향상시켜 주지만 반드시 정지 상태일 필요는 없습니다(예: 핸드셋을 사용자의 주머니에 넣고 다니는 경우).
</p>
<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" />
<p class="img-caption">
<strong>그림 1.</strong> Doze가 첫 번째 레벨의 시스템 액티비티 제한을
적용하여 배터리 수명을 개선하는 방법에 대한 그림.
</p>
<p>
기기가 배터리 전원에 연결되고 일정 시간 동안 화면이 꺼져있는 경우,
기기가 Doze로 진입하고 첫 번째 하위 세트의 제한을 적용합니다. 기기는 앱
네트워크 액세스를 차단하고, 작업 및 동기화를
지연시킵니다. 기기가 Doze로 진입한 후 일정 시간 동안 정지 상태에
있으면, 시스템은 Doze 제한의 나머지를 {@link android.os.PowerManager.WakeLock},
{@link android.app.AlarmManager} 알람, GPS 및 Wi-Fi 스캔에 적용합니다.
일부 Doze 제한이 적용되든 모든 Doze 제한이 적용되든 간에
시스템은 잠시 동안의 유지관리 기간 중에 기기를 깨우며, 이 기간 중에
애플리케이션의 네트워크 액세스가 허용되고 지연된 작업/동기화가 실행됩니다.
</p>
<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
<p class="img-caption">
<strong>그림 2.</strong> 기기가 일정 시간 동안 정지 상태에 있은 후에
Doze가 두 번째 레벨의 시스템 액티비티 제한을 적용하는 방법에 대한 그림.
</p>
<p>
참고로, 화면을 활성화하거나 기기의 플러그를 꽂으면 Doze 모드가
종료되고 이러한 처리 제한이 제거됩니다. <a href="{@docRoot}training/monitoring-device-state/doze-standby.html">Doze 및 앱 대기
모드 최적화</a>에서 설명한 대로, Android 6.0(API 레벨 23)에서 소개된
이전 버전의 Doze에 앱을 적용시킬 때는, 이러한 추가적인 동작이
권장사항과 모범
사례에 영향을 미치지 않습니다.
하지만 여전히 해당 권장사항을 따라야 합니다. 예를 들어, GCM(Google Cloud Messaging)을 사용하여 메시지를
송수신하고, 추가적인 Doze 동작을 수용하기 위한 업데이트 계획을
시작해야 합니다.
</p>
<h3 id="bg-opt">Project Svelte: 백그라운드 최적화</h3>
<p>
Android N에서는 메모리 사용량 및 전원 소비량을 최적화하기 위해
세 가지 암시적 브로드캐스트를 제거합니다. 이러한 변경이 필요한
이유는 암시적 브로드캐스트는 백그라운드에서 브로드캐스트를
수신하도록 등록된 앱을 자주 시작하기 때문입니다. 이 브로드캐스트를
제거하면 기기 성능과 사용자 경험이 상당히 향상될 수 있습니다.
</p>
<p>
모바일 기기의 경우 연결 변경이 빈번하게 나타납니다(예: Wi-Fi와
모바일 데이터 간의 이동 시). 현재는 매니페스트에서
암시적 {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} 브로드캐스트의 수신기를
등록하는 방식으로 앱이 이러한 연결 변경을 모니터링할 수 있습니다. 많은 앱들이 이 브로드캐스트를 수신하도록
등록하기 때문에, 단일 네트워크 스위치가 모든 앱들을 깨울 수 있으며 브로드캐스트를
동시에 처리할 수 있습니다.
</p>
<p>
마찬가지로, 앱은 다른 앱(예: 카메라)에서 암시적 {@link
android.hardware.Camera#ACTION_NEW_PICTURE} 및 {@link
android.hardware.Camera#ACTION_NEW_VIDEO} 브로드캐스트를 수신하도록 등록할 수 있습니다. 사용자가
카메라 앱으로 사진을 찍으면, 이들 앱이 깨어나고 브로드캐스트를
처리합니다.
</p>
<p>
이러한 문제를 완화하기 위해, Android N은 다음과 같은 최적화를
적용합니다.
</p>
<ul>
<li>Android N을 대상으로 하는 앱은 해당 이벤트의 알림을 요청하는 매니페스트 항목이 있더라도 {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} 브로드캐스트를 수신하지 않습니다. 포그라운드에서 실행되는 앱은 {@link
android.content.BroadcastReceiver}로
알림을 요청하면
여전히 메인 스레드에서 {@code CONNECTIVITY_CHANGE}를
수신할 수 있습니다.
</li>
<li>앱은 {@link
android.hardware.Camera#ACTION_NEW_PICTURE} 또는 {@link
android.hardware.Camera#ACTION_NEW_VIDEO}
브로드캐스트를 송수신할 수 없습니다. 이 최적화는 Android N을 대상으로 하는 앱 뿐만 아니라 모든 앱에 영향을 미칩니다.
</li>
</ul>
<p>
차기 Android 릴리스에서는 바인딩이 해제된 백그라운드 서비스
뿐만 아니라 추가적인 암시적 브로드캐스트가 사용 중단될 수도 있습니다.
이러한 이유로, 백그라운드 서비스에 대한 종속성 뿐만
아니라 암시적 브로드캐스트의 매니페스트-선언 수신기에 대한 종속성을 피하거나 제거해야 합니다.
</p>
<p>
Android 프레임워크는 암시적 브로드캐스트 또는 백그라운드
서비스의 필요성을 줄이기 위한 여러 가지 해결책을 제공합니다. 예를 들어, {@link
android.app.job.JobScheduler} API는 지정된 조건(예: 비 데이터 통신 네트워크에 연결)이 충족될 경우 네트워크 운영을 예약할 수 있는 강력한 메커니즘을 제공합니다. 심지어는 {@link
android.app.job.JobScheduler}를
사용하여 콘텐츠 제공자의
변경에 대응할 수도 있습니다.
</p>
<p>
이러한 동작 변경과 앱을 적용하는 방법에 대한 자세한 내용은
<a href="{@docRoot}preview/features/background-optimization.html">백그라운드 최적화</a>를
참조하세요.
</p>
<h2 id="perm">권한 변경</h2>
<p>
Android N에는 사용자 계정 권한 및 외부 저장소에 쓰기 위한 새 권한을 비롯하여
앱에 영향을 미칠 수도 있는 권한 변경이 포함되어 있습니다.
다음은 프리뷰에서 변경된 권한의
간추린 내용입니다.
</p>
<ul>
<li>{@code GET_ACCOUNTS} (사용 중단)
<p>
GET_ACCOUNTS 권한은 이제 사용 중단되었습니다. 시스템은 Android
N을 대상으로 하는 앱에서 이 권한을 무시합니다.
</p>
</li>
</ul>
<h2 id="accessibility">접근성 향상</h2>
<p>
Android N에는 시력이 안좋거나 손상된 사용자를 위해 플랫폼의
가용성을 개선하려는 변경이 포함됩니다. 이러한 변경은 일반적으로
앱의 코드 변경을 요구하지는 않지만, 사용자 경험에
미치는 잠재적인 영향을 평가하기 위해 이러한 기능을 검토하고
앱으로 테스트해야 합니다.
</p>
<h3 id="screen-zoom">화면 확대/축소</h3>
<p>
Android N에서는 사용자가 <strong>Display size</strong>를 설정할 수
있습니다. 이 설정은 화면의 모든 요소를 확대하거나 축소하므로, 시력이
안좋은 사용자의 기기 접근성이 향상됩니다. 최소 화면 너비가 <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">sw320dp</a>를 초과하는 화면은 사용자가 확대/축소할
수 없으며, 이는 일반적인 중간 사이즈 전화기인 Nexus 4의
너비입니다.
</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>그림 3.</strong> 오른쪽 화면은 Android N 시스템 이미지가
실행 중인 기기의 Display size를 늘릴 때의 효과를 보여줍니다.
</p>
<p>
기기 밀도가 변경되면, 시스템은 다음과 같은 방식으로 실행 중인
앱에게 알립니다.
</p>
<ul>
<li>앱이 API 레벨 23 이하를 대상으로 하는 경우, 시스템은 모든
백그라운드 프로세스를 자동으로 종료합니다. 즉, 사용자가 이러한
앱으로부터 전환하여 <em>Settings</em> 화면을
열고 <strong>Display size</strong> 설정을 변경하면, 시스템은 저용량 메모리
상황에서와 동일한 방식으로 앱을 종료합니다. 앱에 포그라운드 프로세스가
있는 경우, <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리</a>에 설명된 대로, 시스템은
마치 기기의 방향이 변경된
것처럼 구성 변경을 해당 프로세스에게 알립니다.
</li>
<li>앱이 Android N을 대상으로 하는 경우,
<a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리</a>에 설명된
대로 모든 프로세스(포그라운드 및 백그라운드)에게
구성 변경을 알립니다.
</li>
</ul>
<p>
앱이 Android 모범 사례를 따르기만 한다면, 대부분의 앱은 이 기능을
지원하기 위해 어떠한 변경도 할 필요가 없습니다. 확인할 사항:
</p>
<ul>
<li>화면 너비가 <code><a href=
"{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>인 기기에서 앱을 테스트하고 적절하게 작동하는지
확인합니다.
</li>
<li>기기 구성이 변경되는 경우, 모든 밀도 종속형 캐시된
정보(예: 캐시된 비트맵 또는 네트워크에서 로드된 리소스)를 업데이트합니다.
앱이 일시 정지 상태에서 다시 시작하는 경우 구성
변경을 확인합니다.
<p class="note">
<strong>참고:</strong> 구성 종속형 데이터를 캐시하는 경우,
해당 데이터의 적절한 화면 크기 또는 픽셀 밀도와 같은 관련 메타데이터를
포함시키는 것이 좋습니다. 이 메타데이터를 저장해 놓으면,
구성이 변경된 후에 캐시된 데이터의 새로 고침 여부를
결정할 수 있습니다.
</p>
</li>
<li>픽셀 단위로 치수를 지정하지 마세요. 이 단위는 화면 밀도에 따라
변하지 않습니다. 그 대신, <a href="{@docRoot}guide/practices/screens_support.html">밀도 독립형 픽셀</a> (<code>dp</code>) 단위로
치수를 지정하세요.
</li>
</ul>
<h3 id="vision-settings">설정 마법사에서의 비전 설정</h3>
<p>
Android N에는 Welcome 화면에 Vision Settings가 포함되어 있으며, 여기서 사용자가 새 기기에 다음과 같은 접근성 설정을 구성할 수 있습니다:
<strong>Magnification gesture</strong>, <strong>Font size</strong>,
<strong>Display size</strong>
및 <strong>TalkBack</strong>. 이 변경은 다른 화면 설정에서 발생하는 버그의 가시성을 높여줍니다. 이 기능이
미치는 영향을 평가하려면, 이
설정을 활성화하여 앱을 테스트해야 합니다. 이 설정은 <strong>Settings &gt;
Accessibility</strong> 아래에
있습니다.
</p>
<h2 id="ndk">플랫폼 라이브러리에 연결되는 NDK 앱</h2>
<p>
비공개 API가 로드되는 것을 막기 위해 Android N에는 네임스페이스
변경이 포함되어 있습니다. NDK를 사용하는 경우에는, Android 플랫폼에서
공개 API를 사용해야만 합니다. 차기 Android 공식 릴리스에서 비공개 API를 사용하면 앱 작동이 중단될 수
있습니다.
</p>
<p>
비공개 API의 사용을 경고하기 위해, Android N 기기에서 실행
중인 앱은 어떤 앱이 비공개 API를 호출하면 logcat 출력에 오류를 생성합니다.
또한 이러한 상황을 인식할 수 있도록
이 오류가 메시지로 기기 화면에 표시됩니다. 그러면 앱 코드를 검토하여
비공개 플랫폼 API의 사용을 제거해야 하며 프리뷰 기기 또는
에뮬레이터를 사용하여 앱을 철저히 테스트해야 합니다.
</p>
<p>
앱이 플랫폼 라이브러리에 종속된 경우, 개인 API를 동등한
공개 API로 교체하기 위한 일반적인 수정사항은 NDK 문서를 참조하세요.
또한 자신도 모르는 사이에 플랫폼 라이브러리에
연결되어 있을 수가 있습니다(특히 앱이 사용하는 라이브러리가 플랫폼의
일부(예: <code>libpng</code>)이지만 NDK의 일부는 아닌 경우). 이 경우에는
연결에 필요한 모든 .so 파일이 APK에 포함되어 있는지 확인하세요.
</p>
<p class="caution">
<strong>주의:</strong> 일부 타사 라이브러리는 비공개 API에
연결될 수도 있습니다. 앱이 이러한 라이브러리를 사용하는 경우 차기 Android
공식 릴리스에서 실행할 때 앱 작동이 중단될 수 있습니다.
</p>
<p>
앱은 NDK에 포함되지 않은 고유 라이브러리를 사용하거나
이에 종속되어서는 안 됩니다. 왜냐하면 이 라이브러리는 특정
Android 릴리스에서 다른 릴리스로 변경되거나 제거될 수 있기 때문입니다.
OpenSSL에서 BoringSSL로의 전환은 이러한 변경의 한 예입니다. 또한 NDK에 포함되지 않은 플랫폼 라이브러리에는 호환성 요구사항이 없기
때문에 다른 장치에서 호환성 레벨이 다를 수도 있습니다.
구형 기기에 있는 비-NDK 라이브러리에 액세스해야 하는 경우,
Android API 레벨에 따라 로드하세요.
</p>
<p>
이러한 유형의 문제를 진단하는 데 도움을 주기 위해, 여기서는
Android N으로 앱을 작성할 때 발생할 수 있는 Java 및 NDK 오류의 몇 가지 예를 보여줍니다.
</p>
<p>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>NDK 오류의 예:</p>
<pre class="no-pretty-print">
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
</pre>
<p>
다음은 이러한 유형의 오류가 발생한 앱의 몇 가지 일반적인 수정사항입니다.
</p>
<ul>
<li>libandroid_runtime.so에서 getJavaVM 및 getJNIEnv 사용은 표준
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>{@code libcutils.so}에서 {@code property_get} 기호 사용은 공개 대체
{@code __system_property_get}으로 교체될 수 있습니다.
이렇게 하려면, include와 함께 {@code __system_property_get}을 사용합니다.
<pre>
#include &lt;sys/system_properties.h&gt;
</pre>
</li>
<li>{@code libcrypto.so}에서 {@code SSL_ctrl} 기호 사용은 앱 로컬
버전으로 교체되어야 합니다. 예를 들어, {@code .so} 파일에서
{@code libcyrpto.a}를 정적으로 링크하거나 BoringSSL 또는 OpenSSL에서
{@code libcrypto.so}를 동적으로 앱에 포함시켜야 합니다.
</li>
</ul>
<h2 id="afw">Android for Work</h2>
<p>
Android N에는 Android for Work를 대상으로 하는 앱에 대한 변경이
포함됩니다. 이러한 변경으로는 인증서 설치, 암호 재설정,
보조 사용자 관리, 기기 식별자 액세스 등에 대한
변경이 있습니다. Android for Work 환경용 앱을 작성하는 경우에는 이러한
변경을 검토하고 그에 따라 앱을 수정해야 합니다.
</p>
<ul>
<li>DPC가 인증서를 설정하기 전에, 위임된 인증서 설치 관리자를 먼저
설치하셔야 합니다. N SDK를 대상으로 하는 프로필 소유자
앱 및 기기 소유자 앱의 경우, 기기 정책 컨트롤러(DPC)가 <code>DevicePolicyManager.setCertInstallerPackage()</code>를 호출하기
전에, 위임된 인증서 설치 관리자를 설치해야 합니다. 아직 설치 관리자가
설치되지
않은 경우, 시스템이 <code>IllegalArgumentException</code>을
발생시킵니다.
</li>
<li>이제 기기 관리자의 암호 재설정 제한이 프로필 소유자에게도
적용됩니다. 기기 관리자는 이미 설정된 암호를 변경하거나 암호를
지우기 위해 <code>DevicePolicyManager.resetPassword()</code>를 더 이상 사용할
수 없습니다. 기기 관리자가 여전히 암호를 설정할 수 있지만
기기에 암호, PIN 또는 패턴이 없는 경우에만 암호를 설정할 수 있습니다.
</li>
<li>제한이 설정되어 있더라도 기기 소유자와 프로필 소유자는
계정을 관리할 수 있습니다. <code>DISALLOW_MODIFY_ACCOUNTS</code> 사용자
제한이 있더라도 기기 소유자와 프로필 소유자가 계정 관리 API를 호출할 수 있습니다.
</li>
<li>기기 소유자는 보다 쉽게 보조 사용자를 관리할 수 있습니다.
기기가 기기 소유자 모드에서 실행 중인 경우 <code>DISALLOW_ADD_USER</code>
제한이 자동으로 설정됩니다. 이렇게 하면 사용자는
비관리 보조 사용자를 생성할 수가 없습니다. 또한 <code>CreateUser()</code>
및 <code>createAndInitial()</code> 메서드가 사용 중단되었으며,
새로운 <code>DevicePolicyManager.createAndManageUser()</code> 메서드로 대체되었습니다.
</li>
<li>기기 소유자는 기기 식별자에 액세스할 수 있습니다. 기기
소유자는 <code>DevicePolicyManagewr.getWifiMacAddress()</code>를 사용하여 기기의
Wi-Fi MAC 주소에 액세스할 수 있습니다.
기기에서 Wi-Fi가 활성화되지 않은 경우 이 메서드는 {@code null} 값을 반환합니다.
</li>
</ul>
<p>
Android N에서 Android for Work의 변경에 대한 자세한 내용은,
<a href="{@docRoot}preview/features/afw.html">Android for Work 업데이트</a>를 참조하세요.
</p>
<h2 id="other">기타 중요한 사항</h2>
<ul>
<li>앱이 Android N에서 실행 중일 때 API 레벨이 낮고 사용자가 디스플레이
크기를 변경한 경우, 해당 앱 프로세스가 종료됩니다. 앱은 이
시나리오를 매끄럽게 처리할 수 있어야 합니다. 그렇지 않으면
사용자가 Recents에서 앱을 복원할 때 앱 작동이 중단됩니다.
<p>
이러한 동작이 발생하지 않도록 앱을 테스트해야 합니다.
DDMS를 통해 수동으로 앱을 종료할 때
동일한 작동 중단을 유발시키는 방식으로 테스트할
수 있습니다.
</p>
<p>
N 이상을 대상으로 하는 앱은 밀도 변경 시에 자동으로 종료되지 않지만
구성 변경에는 제대로 응답하지 못할 수도 있습니다.
</p>
</li>
<li>
Android N에서 앱은 구성 변경을 매끄럽게 처리할 수 있어야 하며,
이후의 시작 시에도 작동이 중단되어서는 안 됩니다. 글꼴 크기(<strong>Setting</strong> &gt;
<strong>Display</strong> &gt;
<strong>Font size</strong>)를 변경하여 앱 동작을 검사한 다음, Recents에서
앱을 복원할 수 있습니다.
</li>
</ul>

View File

@@ -0,0 +1,541 @@
page.title=기기에서 테스트
meta.tags="프리뷰", "nexus","시스템 이미지"
page.tags="preview", "androidn"
page.image=images/cards/card-n-downloads_2x.png
@jd:body
<div style="position:relative; min-height:600px">
<div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
<p class="sdk-terms-intro">Android Preview SDK의 구성 요소를
다운로드하고 설치하기 전에 우선 다음과 같은
사용 약관에 동의해야 합니다.</p>
<h2 class="norule">사용 약관</h2>
<div class="sdk-terms" onfocus="this.blur()" style="width:678px">
이것은 Android SDK Preview 라이선스 계약서입니다(이하 "라이선스 계약").
1. 개요
1.1 Android SDK Preview(본 라이선스 계약에서는 "Preview"라고 칭하며, 구체적으로 Android 시스템 파일, 패키지 API 및 Preview 라이브러리 파일이 이용 가능한 경우 및 이용 가능하게 전환된 경우 이를 포함한 것을 가리킴)는 본 라이선스 계약 조건에 따라 계약자에게 사용을 허여합니다. 본 라이선스 계약은 Preview 사용과 관련하여 계약자와 Google 간에 법적 구속력이 있는 계약을 체결합니다.
1.2 "Android"는 기기를 위한 Android 소프트웨어 스택을 의미합니다. 이는 http://source.android.com/ URL에 위치하며 수시로 업데이트되는 Android 오픈 소스 프로젝트에서 제공됩니다.
1.3 “Android 호환”은 (i) Android 호환성 웹사이트(http://source.android.com/compatibility)에서 찾을 수 있고 간혹 업데이트되는 Android 호환성 정의 문서를 준수하며; (ii) Android CTS(Compatibility Test Suite)를 성공적으로 통과한 모든 Android 구현을 의미합니다.
1.4 "Google"은 미국 1600 Amphitheatre Parkway, Mountain View, CA 94043에 본사를 두고 있는 델라웨어주 법인인 Google Inc.를 의미합니다.
2. 라이선스 계약에 동의
2.1 이 Preview를 사용하려면, 먼저 라이선스 계약에 동의해야 합니다. 이 라이선스 계약에 동의하지 않고 Preview를 사용해서는 안 됩니다.
2.2 수락을 클릭하고/거나 Preview를 사용하면 본 라이선스 계약 조건에 동의하는 것으로 간주됩니다.
2.3 미국법 또는 현재 거주 중이거나 Preview를 사용하는 국가를 포함하여 다른 국가의 법에 따라 Preview를 받는 것이 금지된 경우, Preview를 사용할 수 없으며 본 라이선스 계약을 수락할 수 없습니다.
2.4 회사 또는 단체 내에서 내부적으로 Preview를 사용하며 고용주 또는 기타 단체를 대신하여 본 라이선스 계약 준수에 동의하는 경우, 계약자의 고용주나 그 단체에 본 라이선스 계약에 대한 구속력을 부여할 수 있는 모든 법적 권한을 계약자가 갖고 있음을 진술하고 보증합니다. 구속력을 부여할 수 있는 법적 권한이 없을 경우, 고용주 또는 기타 단체를 대신하여 본 라이선스 계약에 동의하거나 Preview를 사용할 수 없습니다.
3. Google의 Preview 라이선스
3.1 본 라이선스 계약의 조건에 따라 Google은 계약자에게 한정적이며 전 세계적으로 무료로 사용이 가능하고 양도할 수 없고 비독점적이며 2차 라이선스를 불허하는 Preview 사용 라이선스를 부여합니다. 이 라이선스 하에서 계약자는 Android 플랫폼에서 실행되는 애플리케이션을 개발하는 경우에만 Preview를 사용할 수 있습니다.
3.2 이 Preview를 사용하여 다른 플랫폼용 애플리케이션을 개발하거나(Android 비호환 구현 포함) 다른 SDK를 개발할 수 없습니다. 물론 이 Preview가 이러한 목적에 사용되지 않는 경우 Android의 비호환 구현을 포함한 다른 플랫폼용 애플리케이션을 자유롭게 개발할 수 있습니다.
3.3 계약자는 Preview에 존재하는 지적 재산권을 포함하여 Preview에 대한 모든 법적인 권리, 소유권 및 이익이 Google 또는 제3자에게 있음에 동의합니다. "지적 재산권"은 모든 특허법, 저작권법, 영업비밀법, 상표법 하의 모든 권리 및 기타 모든 소유권을 의미합니다. Google은 계약자에게 명시적으로 부여하지 않은 모든 권리를 보유합니다.
3.4 본 라이선스 계약에 명시적으로 허용된 용도 외에는 Preview를 사용할 수 없습니다. 해당 제3자 라이선스 요건이 허용하는 범위를 제외하고 계약자는 Preview의 파생 제품이나 Preview의 일부분을 (a) 복사(백업 목적 제외), 수정, 개작, 재배포, 역컴파일, 리버스 엔지니어링, 분해하거나 이를 통해 파생물을 생성하거나 (b) 개인 컴퓨터를 제외한 모바일 단말기 또는 기타 모든 하드웨어 기기에 Preview의 일부를 로드하거나, Preview의 일부를 다른 소프트웨어와 결합하거나 Preview의 일부가 통합된 일체의 소프트웨어나 기기를 배포해서는 안 됩니다.
3.5 오픈 소스 소프트웨어 라이선스에 의거한 Preview 구성요소의 사용, 재생산, 배포에는 본 라이선스 계약이 아닌, 해당 오픈 소스 소프트웨어 라이선스의 조건이 적용됩니다. 계약자는 허용된 모든 권한 하에서 그러한 오픈 소스 소프트웨어 라이선스에 관해 충실한 피허가자로서의 자세를 견지할 것이며 그러한 권한을 종료, 일시 중단 또는 침해하는 행위를 삼갈 것을 동의합니다.
3.6 계약자는 Google이 제공하는 SDK의 형태 및 특성이 사전 통지 없이 변경될 수 있음에 동의하며, 이전 버전의 Preview에서 개발된 애플리케이션이 이후 버전의 SDK와 호환되지 않을 수 있음에 동의합니다. 계약자는 계약자 또는 사용자에게 사전 통지 없이 SDK(또는 SDK에 포함된 기능) 제공을(영구적 또는 일시적으로) 중단할 수 있는 권한이 Google에게 있음에 동의합니다.
3.7 본 라이선스 계약은 계약자에게 Google의 상표명, 상표, 서비스 표시, 로고, 도메인 이름, 기타 독특한 브랜드 특징에 대한 사용 권한을 부여하지 않습니다.
3.8 계약자는 SDK에 부착되어 있거나 포함되어 있는 모든 소유권 고지 사항(저작권 및 상표 고지 사항 포함)을 제거, 변경 또는 불분명하게 만들지 않을 것에 동의합니다.
4. 계약자의 Preview 사용
4.1 Google은 본 라이선스 계약의 어떤 조항도 계약자(또는 계약자의 사용 허가자)가 Preview를 사용하여 개발한 소프트웨어 애플리케이션에 대한 권리, 소유권 또는 이익, 그리고 해당 애플리케이션에 존재하는 모든 지적 재산권을 부여하지 않는다는 점에 동의합니다.
4.2 계약자는 (a) 본 라이선스 계약 그리고 (b) 모든 준거법, 규정 또는 관련 관할권 내에서 일반적으로 수용되는 관행 또는 지침(미국 또는 기타 관련 국가로/에서의 데이터 또는 소프트웨어 수출과 관련된 모든 법률 포함)에서 허용하는 용도에 한하여 Preview를 사용하고 애플리케이션을 작성하는 것에 동의합니다.
4.3 계약자는 일반 대중 사용자를 대상으로 Preview를 사용하여 애플리케이션을 개발하는 경우, 해당 사용자의 프라이버시 및 법적 권리를 보호하는 것에 동의합니다. 사용자가 계약자에게 사용자 이름, 비밀번호 또는 기타 로그인 정보나 개인 정보를 제공하는 경우, 계약자는 제공된 정보가 자신의 애플리케이션에 제공된다는 사실을 사용자에게 알려야 하며, 반드시 법적으로 적절한 개인정보 보호정책 고지 및 보호를 해당 사용자에게 제공해야 합니다. 애플리케이션에서 사용자가 제공한 개인 정보나 민감한 정보를 저장하는 경우, 이를 안전하게 처리해야 합니다. 사용자들이 애플리케이션에 Google 계정 정보를 제공하는 경우, 애플리케이션은 해당 사용자의 Google 계정에 액세스하는 목적으로만, 그리고 각 사용자가 허용한 범위 내의 한정된 목적으로만 이러한 정보를 사용해야 합니다.
4.4 계약자는 Google 또는 기타 모든 타사의 서버, 네트워크 또는 기타 모든 재산 또는 서비스를 허가 없이 방해, 교란, 손상 또는 액세스하는 애플리케이션의 개발 또는 배포를 포함한 하등의 행위에 Preview를 이용하지 않을 것임을 동의합니다.
4.5 계약자는 자신이 Android 및/또는 Android용 애플리케이션을 통해 생성, 전송 또는 표시하는 모든 데이터, 콘텐츠 또는 리소스 그리고 그로 인한 결과(Google이 입을 수 있는 모든 피해나 손실 포함)에 대해 전적으로 책임이 있다는 것(그리고 Google은 계약자 또는 모든 제3자에 대한 책임이 없다는 것)에 동의합니다.
4.6 계약자는 본 라이선스 계약, 모든 해당 제3자 계약 또는 서비스 약관, 또는 모든 준거법 또는 규정에 의거한 계약자 의무 위반, 그리고 그로 인한 결과(Google 또는 제3자가 입을 수 있는 모든 피해나 손실 포함)에 전적으로 책임이 있다는 것(그리고 Google은 계약자 또는 모든 제3자에 대한 책임이 없다는 것)에 동의합니다.
4.7 이 Preview는 현재 개발 단계에 있으며, 계약자의 테스트와 피드백은 그러한 개발 과정에 중요한 부분을 차지합니다. Preview를 사용함으로써 계약자는 일부 기능의 구현은 아직 개발 중인 상태이며 Preview가 안정된 릴리스처럼 완벽하게 기능할 것이라 믿고 사용해서는 안 된다는 점을 인지하는 것으로 간주합니다. 계약자는 이 Preview를 사용한 애플리케이션을 공개적으로 배포 또는 배송하지 않기로 동의합니다. 이 Preview는 공식 Android SDK가 출시된 이후에는 더 이상 지원되지 않기 때문입니다.
5. 계약자의 개발자 자격 증명
5.1 계약자는 Google이 발급했거나 자신이 선택한 모든 개발자 자격 증명에 대한 기밀성을 유지할 책임이 있으며 계약자의 개발자 자격 증명 하에 개발된 모든 애플리케이션에 대한 전적인 책임이 있음에 동의합니다.
6. 개인정보 보호정책 및 정보
6.1 Preview를 지속적으로 혁신하고 개선하기 위해, Google은 고유 식별자, 관련 IP 주소, 소프트웨어 버전 번호, Preview에서 사용 중인 도구 및/또는 서비스와 도구의 사용법에 대한 정보를 포함하되 이에 국한되지 않고 소프트웨어에서 특정 사용량 통계 정보를 수집할 수 있습니다. 그러한 정보를 수집하기 전에 Preview는 계약자에게 이를 통지하고 동의를 구할 것입니다. 계약자가 동의하지 않을 경우 정보를 수집하지 않습니다.
6.2 수집된 데이터는 모두 취합된 형태로 Preview 개선을 위해 검토되며, Google의 개인정보 보호정책에 따라 유지 관리됩니다. 이 정보는 http://www.google.com/policies/privacy/를 참조하십시오.
7. 제3자 애플리케이션
7.1 제3자가 개발한 애플리케이션을 실행하거나 제3자가 제공한 데이터, 콘텐츠 또는 리소스에 액세스하기 위해 Preview를 사용하는 경우, 계약자는 Google이 그러한 애플리케이션, 데이터, 콘텐츠 또는 리소스에 대한 책임이 없음에 동의합니다. 계약자는 그러한 제3자 애플리케이션을 통해 자신이 액세스한 모든 데이터, 콘텐츠 또는 리소스에 대한 책임은 그것을 만든 사람에게 있음에 동의합니다. 또한 계약자가 그러한 모든 제3자 애플리케이션, 데이터, 콘텐츠 또는 리소스를 사용하거나 액세스함으로써 비롯된 모든 피해나 손실에 대한 책임이 Google에게 없음에 동의합니다.
7.2 그러한 제3자 애플리케이션을 통해 계약자에게 제공된 데이터, 콘텐츠 그리고 리소스는 그것을 제공한 제공자(또는 제공자를 대신하는 기타 개인 또는 기업)가 소유한 지적 재산권에 의해 보호될 수 있음을 유의해야 합니다. 그러한 데이터, 콘텐츠 또는 리소스(전부 또는 일부)를 수정, 임대, 리스, 대여, 판매, 배포하거나 이를 기반으로 파생물을 생성해서는 안 됩니다. 단, 관련 소유자로부터 그러한 작업을 수행해도 좋다는 허락을 받은 경우에는 예외입니다.
7.3 계약자는 그러한 제3자 애플리케이션, 데이터, 콘텐츠 또는 리소스의 사용은 계약자와 관련 제3자 간에 체결하는 별도의 계약 조건의 적용을 받는다는 것을 인정합니다.
8. Google API 사용
8.1 Google Data API
8.1.1 Google에서 데이터를 검색하기 위해 API를 사용하는 경우, 그러한 데이터가 Google 또는 데이터를 제공하는 당사자(또는 당사자를 대신하는 기타 개인 또는 기업)가 소유한 지적 재산권에 의해 보호될 수 있음을 인정합니다. 그러한 API를 사용하는 경우, 추가적인 서비스 약관의 적용을 받을 수 있습니다. 관련 서비스 약관에 허용되지 않은 한, 그러한 데이터(전부 또는 일부)를 변경, 임대, 리스, 대여, 판매, 배포하거나 이를 기반으로 파생물을 생성해서는 안 됩니다.
8.1.2 Google에서 사용자 데이터를 검색하기 위해 API를 사용하는 경우, 계약자는 사용자로부터 명시적인 동의를 얻은 경우에 한하여, 그리고 해당 사용자가 허용한 범위 내의 한정된 목적으로만 데이터를 검색해야 합니다.
9. 라이선스 계약 종료
9.1 본 라이선스 계약은 계약자 또는 Google에 의해 아래와 같은 조건 하에 종료될 때까지 계속 적용됩니다.
9.2 계약자가 라이선스 계약을 종료하고자 하는 경우, Preview 및 관련 개발자 자격 증명 일체의 사용을 중단하는 것으로 그러한 의사를 피력할 수 있습니다.
9.3 Google은 언제든 이유 여하를 불문하고 계약자에게 통고하여 라이선스 계약을 종료할 수 있습니다.
9.4 본 라이선스 계약은 통보 또는 여타의 행위 없이도 자동으로 종료됩니다. 이에 해당되려면 다음과 같은 조건이 수반되어야 합니다.
(A) Google이 계약자가 거주하는 국가 또는 계약자가 서비스를 사용하는 지역에서 Preview 또는 Preview의 특정 부분 제공을 중지하는 경우 및
(B) Google이 Android SDK의 최종 릴리스 버전을 발행하는 경우.
9.5 본 라이선스 계약이 종료되면 라이선스 계약으로 계약자에게 허용한 라이선스가 취소되며, 이에 따라 계약자는 Preview 사용을 즉시 모두 중단해야 하고 제 10, 11, 12 및 14절의 조항이 기한 없이 유지됩니다.
10. 면책 조항
10.1 계약자는 Preview 이용에 대한 위험 부담이 전적으로 본인에게 있으며, Google이 일체의 보증 없이 Preview를 "있는 그대로" 그리고 "이용 가능한" 상태로 제공한다는 것을 분명히 이해하고 동의합니다.
10.2 Preview 이용 및 이용 과정에서 다운로드하거나 얻게 되는 모든 자료를 사용하는 것은 본인의 재량에 따르며 이에 대한 위험 부담이 전적으로 본인에게 있으며, 그러한 사용으로 인해 발생하는 컴퓨터 시스템 또는 다른 기기의 손상 또는 데이터 손실에 대한 책임은 전적으로 본인에게 있습니다. 전술한 조항을 제한하지 않는 범위 내에서 계약자는 Preview가 안정된 릴리스가 아니며 오류, 결함 및 보안 취약성이 포함되어 있을 수 있어 그 결과로 중대한 손상을 유발할 수 있다는 점을 이해하는 것으로 간주합니다. 여기에는 계약자의 컴퓨터 시스템 또는 기타 기기의 완전하고 돌이킬 수 없는 손실도 포함됩니다.
10.3 더 나아가, Google은 상품성, 특정 목적에 대한 적합성 및 비침해의 묵시적 보증 등을 포함하되 이에 국한되지 않고 명시적이든 묵시적이든 모든 종류의 보증 및 조건을 명시적으로 부인합니다.
11. 책임 한계
11.1 계약자는 계약자에게 발생할 수 있는 직접, 간접, 부수적, 특별, 결과적 또는 징벌적 손해에 대해 그 어떤 책임 이론에 근거해서도 Google, 해당 자회사, 계열사 및 사용 허가자가 어떠한 책임도 지지 아니함을 분명히 이해하고 동의합니다. 이러한 손해에는 Google 또는 해당 대리자가 이러한 손실 발생 가능성에 대해 통지를 받았거나 이러한 사항을 인식했는지에 상관없이 모든 데이터 손실이 포함됩니다.
12. 면책
12.1 법률에 의해 허용되는 최대한의 범위 안에서 계약자는 (a) Preview 사용, (b) 계약자가 Preview에서 개발한 일체의 애플리케이션에서 초래된 모든 사람의 저작권, 상표, 영업비밀, 트레이드 드레스, 특허 또는 기타 지적 재산권의 침해, 또는 어떤 사람의 명예를 훼손하거나 초상권 또는 개인정보 보호정책을 침해함 또는 (C)계약자 본인이 본 라이선스 계약을 위반함으로써 발생하거나 생기는 모든 청구, 조치, 소송 또는 절차, 그리고 모든 손실, 책임, 손해, 경비(합리적인 변호사 비용 포함)로부터 Google을 옹호하고, 면책시키고, Google이 손해를 입지 않도록 하는 데 동의합니다.
13. 라이선스 계약 변경
13.1 Preview의 새로운 버전을 배포할 때, Google은 본 라이선스 계약의 내용을 변경할 수 있습니다. 그러한 변경이 이뤄진 경우, Google은 Preview가 제공되는 웹사이트에 새로운 라이선스 계약 버전을 게재할 것입니다.
14. 일반 법적 조건
14.1 본 라이선스 계약은 계약자와 Google 간의 모든 법적 계약을 구성하며, 계약자의 Preview 사용을 규제하고(별도의 서면 계약을 통해 Google이 계약자에게 제공하는 모든 서비스는 제외), Preview와 관련하여 이전에 계약자와 Google이 맺은 모든 계약을 완전히 대체합니다.
14.2 계약자는 Google이 라이선스 계약에 포함된(또는 관련 법률에 의해 Google이 향유하는) 법적 권리 또는 구제수단을 행사하거나 집행하지 않더라도, Google이 권리를 공식적으로 포기한 것으로 간주하지 않으며, Google이 계속해서 그러한 권리 또는 구제수단을 이용할 수 있음에 동의합니다.
14.3 본 라이선스 계약의 조항이 무효라고 이 사안에 관한 판결을 할 수 있는 관할권을 가진 법원이 판결할 경우, 그 조항은 라이선스 계약의 나머지 조항에 영향을 미치지 않는 형태로 라이선스 계약에서 제거됩니다. 본 라이선스 계약의 나머지 조항은 여전히 유효하며 집행 가능합니다.
14.4 계약자는 Google이 모회사가 되는 회사 그룹에 속한 각 회사가 본 라이선스 계약의 제3수익자이며, 그러한 다른 회사들이 그들에게 이익(또는 유리한 권리)을 부여하는 본 라이선스 계약의 모든 조항을 직접 행사하고 적용할 수 있는 권리를 가진다는 데 동의합니다. 그 외에는 다른 어떤 개인이나 회사도 본 라이선스 계약의 제3수익자가 될 수 없습니다.
14.5 수출 규제. Preview는 미국의 수출법과 규정의 적용을 받습니다. 계약자는 Preview에 적용되는 모든 국내 및 국제 수출법과 규정을 준수해야 합니다. 그러한 법에는 수출 대상국, 최종 사용자 및 최종 용도에 대한 제한이 포함됩니다.
14.6 계약자 또는 Google은 상대 당사자의 사전 서면 승인 없이 본 라이선스 계약에서 부여된 권리를 제3자에게 양도하거나 이전할 수 없으며, 그러한 승인 없이 이루어진 양도 시도는 모두 무효입니다. 계약자는 Google의 사전 승인 없이 본 라이선스 계약 상의 책임 또는 의무를 위임할 수 없습니다.
14.7 본 라이선스 계약, 그리고 본 라이선스 계약 상의 계약자와 Google의 관계는 법률 조항 간의 충돌과는 무관하게 캘리포니아주법에 의한 규제를 받습니다. 계약자와 Google은 본 라이선스 계약으로부터 발생하는 모든 법적 문제 해결을 캘리포니아주 산타 클라라(Santa Clara) 카운티 내에 소재한 전속 관할 법원에 의뢰하는 것에 동의합니다. 위 규정에도 불구하고, 계약자는 Google이 여전히 모든 관할권에서 강제 구제책(또는 동등한 유형의 긴급 법적 구제)을 신청할 수 있음에 동의합니다.
</div><!-- sdk terms -->
<div id="sdk-terms-form">
<p>
<input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
<label id="agreeLabel" for="agree">본인은 상기 사용 약관을 읽었으며 이에 동의합니다.</label>
</p>
<p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
</div>
</div><!-- end TOS -->
<div id="landing">
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#device-preview">하드웨어 기기 설정</a>
<ol>
<li><a href="#ota">OTA 업데이트</a></li>
<li><a href="#flash">수동 기기 플래시</a></li>
<li><a href="#revertDevice">제거</a></li>
</ol>
</li>
<li><a href="#setupAVD">에뮬레이터 설정</a></li>
</ol>
</div>
</div>
<p>
새로운 플랫폼에서 앱을 테스트하려면 Android N
런타임 환경을 설정해야 합니다. 다음 두 가지 방법 중 하나를 사용할 수 있습니다.
</p>
<ul>
<li>지원되는 하드웨어 기기에서 Android N 설치</li>
<li>Android N을 실행하는 Android 에뮬레이터 설정</li>
</ul>
<p>
새로운 플래폼에서 앱의 기본적 호환성을 테스트할 환경을 원할 경우
현재 APK와 하드웨어 기기 또는
에뮬레이터만 있으면 됩니다. 기본 테스트를 위해 전체 개발 환경을
업데이트할 필요가 없습니다.
</p>
<p>
Android N을 대상으로 하도록 앱을 수정하거나 새로운 Android N API를 사용하고 싶다면,
Android N을 지원하도록
업데이트된 개발 환경을 설정해야 합니다. 자세한 내용은 <a href="{@docRoot}preview/setup-sdk.html">Android N용 개발
설정</a>을 참조하세요.
</p>
<h2 id="device-preview">하드웨어 기기 설정</h2>
<p>
N Developer Preview는 전화에서 태블릿, TV에 이르기까지 앱을 테스트하는 데 사용할 수 있는
다양한 하드웨어 기기의 시스템 업데이트를 제공합니다.
</p>
<p>
지원되는 기기에 액세스할 수 있다면 다음 방법 중 하나를 사용하여 Developer Preview 마일스톤 빌드로
업데이트할 수 있습니다.
</p>
<ul>
<li>
<a href="https://g.co/androidbeta">Android 베타 프로그램</a>을 통해 <strong>자동 OTA 시스템 업데이트에 기기를 등록</strong>합니다. 기기를 등록하면 N Developer Preview에서
모든 마일스톤 빌드에 대해 정기적으로 OTA 업데이트를 받을 수 있습니다.
현재 환경을 다양한 N Developer Preview 릴리스로 매끄럽게 전환할 수 있으므로
이 방법을 권장합니다.</li>
<li><strong>Developer Preview 시스템 이미지를 다운로드하고 기기를 플래시합니다</strong>.
수동으로 플래시하는 기기에는 OTA 업데이트가 자동으로 제공되지 않지만
Android 베타 프로그램에 기기를 등록하면 OTA 업데이트를 받을 수 있습니다. </li>
</ul>
<h3 id="ota">자동 OTA 업데이트에 기기 등록</h3>
<p>
지원되는 기기에 액세스할 수 있다면(아래 다운로드 표
참조),
<a href="https://g.co/androidbeta">Android 베타 프로그램</a>에 등록해서 Android 프리뷰 버전에 대해 OTA 업데이트를 받을 수 있습니다. 이 업데이트는
자동으로 다운로드되고 공식 시스템 업데이트처럼
기기를 업데이트합니다.
</p>
<p>
기기는 언제든 등록을 해제할 수 있습니다. 기기는
해당 기기에 제공되는 가장 최신 Android 프로덕션 버전으로 OTA 업데이트를 받게 됩니다
(예: Android 6.0 Marshmallow). 업데이트 시 기기가 완전히 초기화되므로
기기의 사용자 데이터는 삭제됩니다. 기기 등록을 해제하기 전에 <strong>
중요한 데이터는 백업</strong>하세요.
</p>
<p>
자세한 정보를 확인하고 기기를 등록하려면
<a href="https://g.co/androidbeta">Android 베타 프로그램</a> 웹사이트를 참조하세요.
</p>
<p class="note"><strong>참고:</strong>
등록을 해제하면 기기가 완전히 초기화됩니다. 중요한 데이터를
먼저 백업하세요.
</p>
<h3 id="flash">기기 수동 플래시</h3>
<p>
언제든 최신 Developer Preview 시스템 이미지를 다운로드하고
기기에 수동으로 플래시할 수 있습니다. 아래 표를 참조하여 기기 테스트용 시스템 이미지를
다운로드하세요. 기기 수동 플래시는
테스트 환경을 정확히 제어해야 하거나 자동 테스트 등을 위해 자주 플래시해야 할 경우
유용합니다.
</p>
<!-- You can flash by ota or system image --><p>
기기에 시스템 이미지를 설치하면 <strong>기기에서 모든 데이터가
삭제</strong>되므로 데이터를 먼저 백업하는 것이 좋습니다.
</p>
<p>
기기 데이터를 백업하고 기기에 맞는 아래의 시스템 이미지를 다운로드한 뒤,
<a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
의 지침에 따라 기기에 이미지를 플래시합니다.
</p>
<p>
수동으로 플래시한 시스템 이미지는 최신 Developer Preview 마일스톤 빌드에 대한 <strong>
OTA 업데이트를 자동으로 수신하지 않습니다</strong>.
각 Developer Preview 마일스톤에서 환경을 최신으로 유지하고 새 시스템 이미지를
플래시하세요.
</p>
<p>
기기를 수동으로 플래시한 후 OTA 업데이트를 받으려면
<a href="https://g.co/androidbeta">Android
베타 프로그램</a>에 기기를 등록하기만 하면 됩니다. 언제든 기기를 등록하고 다음 Preview
업데이트를 무선으로 받을 수 있습니다.
</p>
<table>
<tr>
<th scope="col">기기</th>
<th scope="col">다운로드/체크섬</th>
</tr>
<tr id="bullhead">
<td>Nexus 5X <br>"bullhead"</td>
<td><a href="#top" onclick="onDownload(this)">bullhead-npc56p-preview-6c877a3d.tgz</a><br>
MD5: b5cf874021023b398f5b983b24913f5d<br>
SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a
</td>
</tr>
<tr id="shamu">
<td>Nexus 6 <br>"shamu"</td>
<td><a href="#top" onclick="onDownload(this)">shamu-npc56p-preview-54b13c67.tgz</a><br>
MD5: af183638cf34e0eb944a1957d7696f60<br>
SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973
</td>
</tr>
<tr id="angler">
<td>Nexus 6P <br>"angler"</td>
<td><a href="#top" onclick="onDownload(this)">angler-npc56p-preview-85ffc1b1.tgz</a><br>
MD5: bc4934ea7bd325753eee1606d3725a24<br>
SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588
</td>
</tr>
<tr id="volantis">
<td>Nexus 9 <br>"volantis"</td>
<td><a href="#top" onclick="onDownload(this)">volantis-npc56p-preview-0e8ec8ef.tgz</a><br>
MD5: c901334c6158351e945f188167ae56f4<br>
SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4
</td>
</tr>
<tr id="volantisg">
<td>Nexus 9G <br>"volantisg"</td>
<td><a href="#top" onclick="onDownload(this)">volantisg-npc56p-preview-1bafdbfb.tgz</a><br>
MD5: 7bb95bebc478d7257cccb4652899d1b4<br>
SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6
</td>
</tr>
<tr id="fugu">
<td>Nexus Player <br>"fugu"</td>
<td><a href="#top" onclick="onDownload(this)">fugu-npc56r-preview-7027d5b6.tgz</a><br>
MD5: f5d3d8f75836ccfe4c70e8162e498be4<br>
SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b
</td>
</tr>
<tr id="ryu">
<td>Pixel C <br>"ryu"</td>
<td><a href="#top" onclick="onDownload(this)">ryu-npc56p-preview-335a86a4.tgz</a><br>
MD5: 4e21fb183bbbf467bee91598d587fd2e<br>
SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92
</td>
</tr>
<tr id="seed">
<td>General Mobile 4G (Android One) <br>"seed"</td>
<td><a href="#top" onclick="onDownload(this)">seed_l8150-npc56p-preview-82472ebc.tgz</a><br>
MD5: 983e083bc7cd0c4a2d39d6ebaa20202a<br>
SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127
</td>
</tr>
</table>
<h3 id="revertDevice">기기에서 Preview 제거</h3>
<p>
기기에서 Preview를 제거하려면
다음 중 한 가지 방법을 사용할 수 있습니다. </p>
<ul>
<li><strong>공장 사양 시스템 이미지</strong>를 획득한 다음 기기에 수동으로
플래시합니다.
<ul>
<li><strong>Nexus 기기와 Pixel C 기기</strong>의 경우,
<a href="http://developers.google.com/android/nexus/images">Nexus 기기용
공장 이미지</a> 페이지에서 다운로드하세요. </li>
<li><strong>다른 기기</strong>의 경우, 기기 제조업체에 직접
문의하세요. 또는, Android 베타 프로그램에서 지원되는
기기라면
프로그램에 기기를 등록한 다음 등록을 해제할 수 있습니다(아래 참조).</li>
</ul>
</li>
<li><strong>Android 베타 프로그램에서 기기 등록을 해제합니다</strong>.
기기가 <a href="https://g.co/androidbeta">Android 베타
프로그램</a>에 등록되었다면 기기와 관계없이 프로그램에서 등록을 해제하기만 하면 됩니다.
<p>
기기는해당 기기에 제공되는 가장 최신 Android 프로덕션 버전으로
OTA 업데이트를 받게 됩니다(예: Android 6.0 Marshmallow).
업데이트 시 기기가 완전히 초기화되므로 기기의 사용자 데이터는 삭제됩니다
기기 등록을 해제하기
전에 <strong>중요한 데이터는 백업</strong>하세요.
</p>
</li>
</ul>
<p class="note"><strong>참고:</strong>
프로그램이 끝나기 전에 Developer Preview 시스템 이미지를 삭제하려면
기기를 완전히 초기화하고 기기에서 모든 사용자 데이터를
삭제해야 합니다.
</p>
<h2 id="setupAVD">에뮬레이터 설정</h2>
<p>Android 에뮬레이터를 사용하여 Android N Preview를 실행하려면
Android N Preview SDK를 다운로드하고 에뮬레이터용 가상 기기를
생성해야 합니다.</p>
<p>먼저 다음과 같이 Android N Preview SDK를 다운로드합니다(
<a href="{@docRoot}preview/setup-sdk.html">Android N용 개발 설정
</a> 시 이미 다운로드했다면 이 부분은 건너뛸 수 있습니다).
<ol>
<li>Android Studio에서 Settings 대화 상자를 엽니다
(Windows/Linux에서 <strong>File &gt; Settings</strong>, Mac에서는
<strong>Android Studio &gt; Preferences</strong>). 왼쪽 창에서
<strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>를 선택합니다.
<li><strong>SDK Platforms</strong> 탭을 클릭한 다음,
<strong>Android N Preview</strong> 확인란을 선택합니다.</li>
<li><strong>SDK Tools</strong> 탭을 클릭한 다음,
<strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong>, <strong>Android SDK Tools</strong> 확인란을
선택합니다.
</li>
<li><strong>OK</strong>를 클릭하고 설치할 패키지의
사용권 계약에 동의합니다.
</li>
</ol>
<p>이제 <strong>Android SDK Built-Tools 24.0 0 rc1</strong>,
<strong>Platform-Tools 24.0.0 rc1</strong> 및 <strong>SDK Tools
25.0.9</strong>를 다운로드했습니다. SDK 도구를 25.0.9로 업데이트하지 않으면
Android N에서 x86_64 시스템 이미지를 실행할 수 없습니다.</p>
<p>Android N 시스템 이미지로 가상 기기 생성:</p>
<ol>
<li><strong>Tools &gt; Android &gt;
AVD Manager</strong>를 선택하여 AVD Manager를 엽니다.</li>
<li><strong>Create Virtual Device</strong>를 클릭합니다.</li>
<li>Nexus 5X, Nexus 6P, Nexus 9, Android TV 등의 기기를 선택하고
<strong>Next</strong>를 클릭합니다.</li>
<li><strong>N</strong> 시스템 이미지(
<strong>x86</strong> ABI)를 선택하고 <strong>Next</strong>를 클릭합니다.
(현재 x86 시스템 이미지만 Android N Preview용 Android 에뮬레이터에서
지원됩니다.)
<li>나머지 AVD 구성을 완료하고
<strong>Finish</strong>를 클릭합니다.</li>
</ol>
<p>이제 Android N Preview AVD로 Android 에뮬레이터를 시작할 수 있습니다.</p>
<p>
Android 에뮬레이터에서 최상의 경험을 얻으려면
Android Studio 2.1 Preview를 설치하세요. Android Studio 1.5의 에뮬레이터에 비해 더욱 빠른 성능을 제공하는 <a href="http://tools.android.com/tech-docs/emulator">Android Emulator 2.0 Beta</a>가
지원됩니다.
</p>
<p class="note"><strong>참고:</strong>
현재 Android Studio 2.0 Beta를 사용하는 경우
N Preview 시스템 이미지로 AVD를 생성할 수 없는 문제가 보고되었습니다.
따라서 지금은 Android Studio 2.1 Preview를 사용하여 AVD를 생성해야 합니다.
</p>
<p>가상 기기 생성에 대한 자세한 내용은 <a href="{@docRoot}tools/devices/index.html">가상 기기 관리</a>를 참조하세요.
</p>
</div><!-- landing -->
</div><!-- relative wrapper -->
<script>
var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
function onDownload(link) {
$("#downloadForRealz").html("Download " + $(link).text());
$("#downloadForRealz").attr('href', urlRoot + $(link).text());
$("#tos").fadeIn('fast');
$("#landing").fadeOut('fast');
return true;
}
function onAgreeChecked() {
/* verify that the TOS is agreed */
if ($("input#agree").is(":checked")) {
/* reveal the download button */
$("a#downloadForRealz").removeClass('disabled');
} else {
$("a#downloadForRealz").addClass('disabled');
}
}
function onDownloadForRealz(link) {
if ($("input#agree").is(':checked')) {
/*
$("#tos").fadeOut('fast');
$("#landing").fadeIn('fast');
*/
ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
/*
location.hash = "";
*/
return true;
} else {
return false;
}
}
$(window).hashchange( function(){
if (location.hash == "") {
location.reload();
}
});
</script>

View File

@@ -0,0 +1,388 @@
page.title=백그라운드 최적화
page.metaDescription=암시적 브로드캐스트에 대한 새로운 제한.
page.keywords="android N", "implicit broadcasts", "job scheduler"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>
이 문서의 내용
</h2>
<ol>
<li>
<a href="#connectivity-action">CONNECTIVITY_ACTION에 대한 제한</a>
</li>
<li>
<a href="#sched-jobs">비 데이터 통신 연결에서 네트워크 작업
예약</a>
</li>
<li>
<a href="#monitor-conn">앱이 실행되는 중에 네트워크
연결 모니터링</a>
</li>
<li>
<a href="#media-broadcasts">NEW_PICTURE 및
NEW_VIDEO에 대한 제한</a>
</li>
<li>
<a href="#new-jobinfo">새로운 JobInfo 메서드</a>
</li>
<li>
<a href="#new-jobparam">새로운 JobParameter 메서드</a>
</li>
<li>
<a href="#further-optimization">추가적인 앱 최적화</a>
</li>
</ol>
</div>
</div>
<p>
백그라운드 프로세스는 메모리와 배터리를 많이 소모할 수 있습니다. 예를 들어, 암시적 브로드캐스트는
이 브로드캐스트를 수신하도록 등록된 많은 백그라운드 프로세스를 시작할 수 있지만
해당 프로세스가 많은 작업을 수행하지 못할 경우가 있습니다. 이로 인해 기기 성능과
사용자 경험에 상당한 영향을 미칠 수 있습니다.
</p>
<p>
이 문제를 완화하기 위해, N Developer Preview
는 다음과 같은 제한을 적용합니다.
</p>
<ul>
<li>브로드캐스트를 수신하도록 매니페스트에 등록되어 있더라도, Preview를 대상으로 하는 앱은 {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION}
브로드캐스트를 수신하지 않습니다. 포그라운드에서 실행되는 앱은 {@link
android.content.Context#registerReceiver Context.registerReceiver()}로 {@link android.content.BroadcastReceiver}를
등록하여 여전히 메인 스레드에서 {@code CONNECTIVITY_CHANGE}를 수신할
수 있습니다.
</li>
<li>앱은 {@link
android.hardware.Camera#ACTION_NEW_PICTURE} 또는 {@link
android.hardware.Camera#ACTION_NEW_VIDEO} 브로드캐스트를 송수신할 수 없습니다. 이 최적화는 Preview를 대상으로
하는 앱 뿐만 아니라 모든 앱에 영향을 미칩니다.
</li>
</ul>
<p>
Android 프레임워크는 이러한 암시적 브로드캐스트의
필요성을 줄이기 위한 여러 가지 해결책을 제공합니다. 예를 들어, {@link android.app.job.JobScheduler}
및 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a>는 지정된
조건(예: 비 데이터 통신 네트워크에 연결)이 충족될 경우 네트워크 작업을
예약할 수 있는 강력한 메커니즘을 제공합니다. 이제 {@link android.app.job.JobScheduler}를
사용하여 콘텐츠 제공자의 변경에 대응할 수도 있습니다. {@link android.app.job.JobInfo}
객체는 {@link android.app.job.JobScheduler}가
작업 예약에 사용하는 매개변수를 캡슐화합니다. 작업 조건이 충족되면 시스템은
이 작업을 앱의 {@link android.app.job.JobService}에서 실행합니다.
</p>
<p>
이 문서에서는 대체 메서드(예: {@link android.app.job.JobScheduler})를
사용하여 이러한 새로운 제한에 맞게 앱을 적용하는 방법에 대해
배워보겠습니다.
</p>
<h2 id="connectivity-action">
CONNECTIVITY_ACTION에 대한 제한
</h2>
<p>
브로드캐스트를 수신하도록 매니페스트에 등록되어
있더라도, N Developer Preview를 대상으로 하는 앱은 {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} 브로드캐스트를 수신하지 않으며, 이 브로드캐스트에 종속되는 프로세스는
시작되지 않습니다. 이 경우 네트워크 변경을 수신하려는 앱이나,
기기가 비 데이터 통신 네트워크에 연결될 때 대량 네트워크 액티비티를
수행하려는 앱에서 문제가 발생할 수 있습니다. 이 제한을 해결하기 위한 여러 가지
해결책이 Android 프레임워크에 이미 있지만, 올바른 해결책을 선택하는 것은
앱의 용도에 따라 다릅니다.
</p>
<p class="note">
<strong>참고:</strong> {@link android.content.Context#registerReceiver Context.registerReceiver()}로
등록된 {@link android.content.BroadcastReceiver}는 앱이
포그라운드에 있는 동안 계속해서 이 브로드캐스트를 수신합니다.
</p>
<h3 id="sched-jobs">
비 데이터 통신 연결에서 네트워크 작업 예약
</h3>
<p>
{@link android.app.job.JobInfo.Builder JobInfo.Builder} 클래스를
사용하여 {@link android.app.job.JobInfo} 객체를 빌드하는 경우, {@link
android.app.job.JobInfo.Builder#setRequiredNetworkType
setRequiredNetworkType()} 메서드를 적용하고 {@link android.app.job.JobInfo
JobInfo.NETWORK_TYPE_UNMETERED}를 작업 매개변수로 전달합니다. 다음의 코드 샘플에서는 기기가 비 데이터 통신
네트워크에 연결되어 충전 중일 때 실행할 서비스를
예약합니다.
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
js.schedule(job);
}
</pre>
<p>
작업의 조건이 충족되면, 앱은
{@link android.app.job.JobService#onStartJob onStartJob()} 메서드를 지정된 {@code JobService.class}에서 실행하기 위한 콜백을
수신합니다. {@link
android.app.job.JobScheduler} 구현의 더 많은 예를 보려면, <a href="{@docRoot}samples/JobScheduler/index.html">JobScheduler 샘플 앱</a>을 참조하세요.
</p>
<p>
GMSCore 서비스를 사용하고 Android 5.0(API 레벨 21) 이하를 대상으로 하는 앱은 <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a>를 사용하고 {@code Task.NETWORK_STATE_UNMETERED}를
지정할 수 있습니다.
</p>
<h3 id="monitor-conn">
앱이 실행되는 중에 네트워크 연결 모니터링
</h3>
<p>
포그라운드에서 실행되는 앱은 여전히 등록된 {@link
android.content.BroadcastReceiver}로 {@code
CONNECTIVITY_CHANGE}를 수신할 수 있습니다. 그러나, {@link
android.net.ConnectivityManager} API는 지정된 네트워크 조건이 충족될 경우에만 콜백을 요청하는
더욱 강력한 메서드를 제공합니다.
</p>
<p>
{@link android.net.NetworkRequest} 객체는 {@link android.net.NetworkCapabilities}의
관점에서 네트워크 콜백의 매개변수를 정의합니다. {@link
android.net.NetworkRequest.Builder NetworkRequest.Builder} 클래스로 {@link android.net.NetworkRequest} 객체를
생성합니다. 이어서 {@link
android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
이 {@link android.net.NetworkRequest} 객체를 시스템에 전달합니다. 네트워크 조건이 충족되면, 앱은 {@link
android.net.ConnectivityManager.NetworkCallback} 클래스에 정의된 {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
onAvailable()} 메서드를
실행하기 위한 콜백을
수신합니다.
</p>
<p>
앱이 종료되거나 앱이 {@link android.net.ConnectivityManager#unregisterNetworkCallback
unregisterNetworkCallback()}을 호출할 때까지 계속해서
콜백을 수신합니다.
</p>
<h2 id="media-broadcasts">
NEW_PICTURE 및 NEW_VIDEO에 대한 제한
</h2>
<p>
N Developer Preview에서 앱은 {@link
android.hardware.Camera#ACTION_NEW_PICTURE} 또는 {@link
android.hardware.Camera#ACTION_NEW_VIDEO} 브로드캐스트를 송수신할 수 없습니다. 이 제한은 새로운 이미지나
동영상을 처리하기 위해 여러 앱을 깨워야 하는 경우, 성능 및 사용자 경험에
미치는 영향을 줄여줍니다. N Developer Preview는
{@link android.app.job.JobInfo} 및 {@link
android.app.job.JobParameters}를 확장하여 대체 해결책을 제공합니다.
</p>
<h3 id="new-jobinfo">
새로운 JobInfo 메서드
</h3>
<p>
콘텐츠 URI 변경에 대한 작업을 트리거하기 위해, N Developer Preview
는 다음과 같은 메서드로 {@link android.app.job.JobInfo} API를 확장합니다.
</p>
<dl>
<dt>
{@code JobInfo.TriggerContentUri()}
</dt>
<dd>
콘텐츠 URI 변경에 대한 작업을 트리거하는 데 필요한 매개변수를 캡슐화합니다.
</dd>
<dt>
{@code JobInfo.Builder.addTriggerContentUri()}
</dt>
<dd>
{@code TriggerContentUri} 객체를 {@link
android.app.job.JobInfo}에 전달합니다. {@link android.database.ContentObserver}는
캡슐화된 콘텐츠 URI를 모니터링합니다. 하나의 작업과 연관된 여러 {@code
TriggerContentUri} 객체가 있는 경우, 콘텐츠 URI 중 하나에서만 변경이 보고되더라도 시스템이
콜백을 제공합니다.
</dd>
<dd>
지정된 URI의 하위 항목이 하나라도 변경되면, {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} 플래그를
추가하여 작업을 트리거합니다. 이 플래그는
{@link
android.content.ContentResolver#registerContentObserver
registerContentObserver()}로 전달된 {@code notifyForDescendants} 매개변수에 해당합니다.
</dd>
</dl>
<p class="note">
<strong>참고:</strong> {@code TriggerContentUri()}는 {@link android.app.job.JobInfo.Builder#setPeriodic
setPeriodic()} 또는 {@link android.app.job.JobInfo.Builder#setPersisted
setPersisted()}와
조합으로 사용될 수 없습니다. 콘텐츠 변경을 계속해서 모니터링하려면, 앱의 {@link
android.app.job.JobService}가 가장 최근 콜백의 처리를 완료하기 전에 새로운
{@link android.app.job.JobInfo}를 예약하세요.
</p>
<p>
다음 샘플 코드에서는 콘텐츠 URI, {@code MEDIA_URI}의
변경을 시스템이 보고할 때 트리거할 작업을 예약합니다.
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MediaContentJob.class));
builder.addTriggerContentUri(
new JobInfo.TriggerContentUri(MEDIA_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
js.schedule(builder.build());
}
</pre>
<p>
지정된 콘텐츠 URI에서의 변경을 시스템이 보고할 때,
앱이 콜백을 수신하고 {@link android.app.job.JobParameters} 객체가
{@code MediaContentJob.class}의 {@link android.app.job.JobService#onStartJob onStartJob()}메서드에
전달됩니다.
</p>
<h3 id="new-jobparam">
새로운 JobParameter 메서드
</h3>
<p>
N Developer Preview에서는 또한 어떤 콘텐츠 기관과
URI가 작업을 트리거했는지에 대한 유용한 정보를 앱이
수신할 수 있도록 {@link android.app.job.JobParameters}를 확장합니다.
</p>
<dl>
<dt>
{@code Uri[] getTriggeredContentUris()}
</dt>
<dd>
작업을 트리거한 URI의 배열을 반환합니다. 작업을 트리거한
URI가 없거나(예: 시한 또는 기타 이유로 인해 작업이 트리거된 경우) 또는
변경된 URI의 수가 50보다 크면 {@code
null}이 됩니다.
</dd>
<dt>
{@code String[] getTriggeredContentAuthorities()}
</dt>
<dd>
작업을 트리거한 콘텐츠 기관의 문자열 배열을 반환합니다.
반환된 배열이 {@code null}이 아닌 경우, {@code getTriggeredContentUris()}를
사용하여 변경된 URI의 세부정보를 검색합니다.
</dd>
</dl>
<p>
다음 샘플 코드에서는 {@link
android.app.job.JobService#onStartJob JobService.onStartJob()} 메서드를 재정의하고
, 작업을 트리거한 콘텐츠 기관과 URI를 기록합니다.
</p>
<pre>
&#64;Override
public boolean onStartJob(JobParameters params) {
StringBuilder sb = new StringBuilder();
sb.append("Media content has changed:\n");
if (params.getTriggeredContentAuthorities() != null) {
sb.append("Authorities: ");
boolean first = true;
for (String auth :
params.getTriggeredContentAuthorities()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(auth);
}
if (params.getTriggeredContentUris() != null) {
for (Uri uri : params.getTriggeredContentUris()) {
sb.append("\n");
sb.append(uri);
}
}
} else {
sb.append("(No content)");
}
Log.i(TAG, sb.toString());
return true;
}
</pre>
<h2 id="further-optimization">
추가적인 앱 최적화
</h2>
<p>
저용량 메모리 기기나 저용량 메모리 조건에서
앱이 실행되도록 최적화하면 성능과 사용자 경험을 개선할 수 있습니다. 백그라운드 서비스에 대한 종속성과 정적으로 등록된
암시적 브로드캐스트 수신기에 대한 종속성을 제거하면 기기에서 앱을
더욱 빨리 실행할 수 있습니다. N Developer Preview는 이러한 문제 중 일부를 줄이기 위한
조치를 취하고 있지만, 백그라운드
프로세스를 전혀 사용하지 않고 앱이 실행되도록
최적화하는 것이 좋습니다.
</p>
<p>
N Developer Preview에서는 백그라운드 프로세스를
비활성화하고 앱 동작을 테스트하는 데 사용할 수 있는 몇 가지 추가적인 <a href="{@docRoot}tools/help/adb.html">ADB(Android Debug Bridge)</a> 명령을 소개합니다.
</p>
<ul>
<li>암시적 브로드캐스트와 백그라운드 서비스를 사용할
수 없는 조건을 시뮬레이션하려면, 다음 명령을 입력합니다.
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
</pre>
</li>
<li>암시적 브로드캐스트와 백그라운드 서비스를 다시 활성화하려면,
다음 명령을 입력합니다.
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
</pre>
</li>
</ul>

View File

@@ -0,0 +1,180 @@
page.title=직접 부팅
page.keywords=preview,sdk,direct boot
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#run">직접 부팅 시 실행하기 위한 액세스 요청</a></li>
<li><a href="#access">기기 암호화 저장소 액세스</a></li>
<li><a href="#notification">사용자 잠금 해제 알림 수신</a></li>
<li><a href="#migrating">기존 데이터 마이그레이션</a></li>
<li><a href="#testing">암호화 인식 앱 테스트</a></li>
</ol>
</div>
</div>
<p>Android N은 기기에 전원이 들어와 있지만<i>사용자가 잠금을 해제하지 않았을 때</i>안전한
직접 부팅
모드에서 실행됩니다. 이를 지원하기 위해 시스템에서 두 가지 데이터 저장소 위치를 제공합니다.</p>
<ul>
<li><i>자격증명 암호화 저장소:</i>기본 저장소 위치이며, 사용자가 기기의 잠금을 해제한 후에만
사용할 수 있습니다.</li>
<li><i>기기 암호화 저장소:</i>직접 부팅 모드와 사용자가 기기의 잠금을 해제한 후에
모두 사용할 수 있는 저장소 위치입니다.</li>
</ul>
<p>기본적으로 직접 부팅 모드 시 앱이 실행되지 않습니다.
직접 부팅 모드에서 조치가 필요한 경우,
이 모드에서 실행되어야 하는 앱 구성 요소를 등록할 수 있습니다. 직접 부팅 모드 시 실행되어야 하는 앱의
몇 가지 공통 사용 사례:</p>
<ul>
<li>알람 시계 앱과 같이 예약된 알림이 있는
앱.</li>
<li>SMS 앱처럼 중요한 사용자 알림을 제공하는 앱.</li>
<li>Talkback처럼 접근성 서비스를 제공하는 앱.</li>
</ul>
<p>앱이 직접 부팅 모드에서 실행되는 동안 데이터에 액세스해야 하는 경우
기기 암호화 저장소를 사용합니다. 기기 암호화 저장소에는
기기가 성공적으로 확인된 부팅을 수행한 후에만
사용할 수 있는 키로 암호화된 데이터가 포함됩니다.</p>
<p>PIN이나 암호와 같이 사용자 자격증명과 연관된 키로 암호화해야 하는 데이터는
자격증명 암호화 저장소를 사용합니다.
자격증명 암호화 저장소는 사용자가 기기의 잠금을 해제한 뒤부터
기기를 다시 시작할 때까지 사용할 수 있습니다. 사용자가
기기의 잠금을 해제한 뒤 잠금 화면을 활성화해도
자격증명 암호화 저장소가 잠기지 않습니다.</p>
<h2 id="run">직접 부팅 시 실행하기 위한 액세스 요청</h2>
<p>앱은 직접 부팅 모드에서 실행되거나
기기 암호화 저장소에 액세스하기 전까지
시스템에 구성 요소를 등록해야 합니다. 앱은 구성 요소를
<i>암호화 인식</i>으로 표시하여 시스템에 등록합니다. 구성 요소를 암호화 인식으로 표시하려면 매니페스트에서
<code>android:encryptionAware</code> 특성을 true로 설정합니다.<p>
<p>암호화 인식 구성 요소로 등록하면 기기가 다시 시작되었을 때 시스템에서
<code>LOCKED_BOOT_COMPLETED</code> 브로드캐스트 메시지를
수신할 수 있습니다. 이 시점에서 기기 암호화 저장소를
사용할 수 있고, 여러분의 구성 요소는
예약된 알람 트리거 등과 같이 직접 부팅 모드에서 실행해야 하는 작업을 실행할 수 있습니다.</p>
<p>다음 코드 조각은
{@link android.content.BroadcastReceiver}를 암호화 인식으로 등록하고 앱 매니페스트에
<code>LOCKED_BOOT_COMPLETED</code>의 인텐트 필터를 추가하는 예시입니다.</p>
<pre>
&lt;receiever
android:encryptionAware="true" &gt;
...
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>사용자가 기기의 잠금을 해제하면 모든 구성 요소가
기기 암호화 저장소와 자격증명 암호화 저장소에 액세스할 수 있습니다.</p>
<h2 id="access">기기 암호화 저장소 액세스</h2>
<p>기기 암호화 저장소에 액세스하려면
<code>Context.createDeviceEncryptedStorageContext()</code>를 호출하여 두 번째
{@link android.content.Context} 인스턴스를 생성합니다. 이 컨텍스트를 사용하여 호출한 모든 저장소 API는
기기 암호화 저장소에 액세스합니다. 다음은
기기 암호화 저장소에 액세스하고 기존
앱 데이터 파일을 여는 예시입니다.</p>
<pre>
Context directBootContext = Context.createDeviceEncryptedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...
</pre>
<p>직접 부팅 모드에서 액세스해야 하는 정보에만
기기 암호화 저장소를 사용합니다.
기기 암호화 저장소를 범용 암호화 저장소로 사용하지 마십시오.
개인적인 사용자 정보 또는 직접 부팅 모드에서 필요하지 않은 암호화 데이터는
자격증명 암호화 저장소를 사용합니다.</p>
<h2 id="notification">사용자 잠금 해제 알림 수신</h2>
<p>사용자가 재시작 후 기기의 잠금을 해제하면
앱이 자격증명 암호화 저장소 액세스로 전환하고,
사용자 자격증명을 따르는 일반 시스템 서비스를 사용할 수 있습니다.</p>
<p>사용자가 재부팅 후 기기의 잠금을 해제할 때 알림을 받으려면
실행 중인 구성 요소에서 {@link android.content.BroadcastReceiver}를 등록하고
<code>ACTION_USER_UNLOCKED</code> 메시지를 수신합니다. 또는,
기존 {@link android.content.Intent#ACTION_BOOT_COMPLETED
ACTION_BOOT_COMPLETED} 메시지를 수신할 수 있습니다. 이 메시지는 기기가 부팅되었으며 사용자가 기기의 잠금을
해제했음을 나타냅니다.</p>
<p>사용자가
<code>UserManager.isUserUnlocked()</code>를 호출하여 기기 잠금을 해제했는지 직접 쿼리할 수 있습니다.</p>
<h2 id="migrating">기존 데이터 마이그레이션</h2>
<p>사용자가 기기를 직접 부팅 모드를 사용하도록 업데이트하면
기존 데이터를 기기 암호화 저장소로 마이그레이션해야 할 수도 있습니다.
<code>Context.migrateSharedPreferencesFrom()</code>와
<code>Context.migrateDatabaseFrom()</code>를 사용하여 자격증명 암호화 저장소와 기기 암호화 저장소 간에
기본 설정과 데이터베이스 데이터를 마이그레이션합니다.</p>
<p>자격증명
암호화 저장소에서 기기 암호화 저장소로 마이그레이션할 데이터는 신중히 결정하세요. 암호나 인증 토큰 등의
개인 사용자 정보는 기기 암호화 저장소로
마이그레이션해서는 안됩니다. 일부 시나리오에서
두 가지 암호화 저장소에 있는 별도의 데이터 세트를 관리해야 할 수 있습니다.</p>
<h2 id="testing">암호화 인식 앱 테스트</h2>
<p>새로운 직접 부팅 모드로 암호화 인식 앱을 테스트하세요. 직접 부팅을
활성화하는 방법은 두 가지가 있습니다.</p>
<p class="caution"><strong>주의:</strong> 직접 부팅을 활성화하면
기기에서 모든 사용자 데이터가 삭제됩니다.</p>
<p>Android N이 설치된 지원 기기에서
직접 부팅을 활성화하는 방법:</p>
<ul>
<li><b>Developer options</b>가 활성화되어 있지 않으면 기기에서
<b>Settings &gt; About phone</b>으로 이동하여 <b>Build number</b>를
7번 탭하여 활성화합니다. 개발자 옵션 화면이 나오면
<b>Settings &gt; Developer options</b>로 이동해서
<b>Convert to file encryption</b>을 선택합니다.</li>
<li>다음 adb shell 명령을 사용하여 직접 부팅 모드를 활성화합니다.
<pre class="no-pretty-print">
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
</pre>
</li>
</ul>
<p>테스트 기기에서 모드를 전환해야 할 경우
에뮬레이션된 직접 부팅 모드도 사용할 수 있습니다. 에뮬레이션된 모드는 개발 시에만 사용해야 하며
데이터가 손실될 수 있습니다. 에뮬레이션된 직접 부팅 모드를 활성화하려면
기기에서 잠금 패턴을 설정합니다. 잠금 패턴을 설정할 때 안전 모드 화면으로 시작할지 묻는 메시지가 나오면 "No thanks"를
선택한 뒤 다음
adb shell 명령을 사용합니다.</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe true
</pre>
<p>에뮬레이션된 직접 부팅 모드를 끄려면 다음 명령을 사용합니다.</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe false
</pre>
<p>이 명령을 사용하면 기기가 재부팅됩니다.</p>

View File

@@ -0,0 +1,158 @@
page.title=ICU4J Android 프레임워크 API
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#relation">ICU4J와의 관계</a></li>
<li><a href="#migration">android.icu API에서 ICU4J로 마이그레이션</a></li>
<li><a href="#licence">라이선스</a></li>
</ol>
<h2>참고 항목</h2>
<ol>
<li>
<a class="external-link" href="http://userguide.icu-project.org">ICU4J 문서</a>
</li>
<li>
<a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">
ICU4J가 지원하는 최신 표준</a>
</li>
</ol>
</div>
</div>
<p>
ICU4J는 오픈 소스이며 널리 사용되는 Java 라이브러리 세트로, 소프트웨어 애플리케이션에 유니코드와
세계화 지원을 제공합니다. Android N은
Android 프레임워크에서 앱 개발자가
{@code android.icu} 패키지에서 사용할 수 있는 ICU4J API의 하위 세트를 노출합니다. 이 API는
기기의 현지화 데이터를 사용합니다. 따라서 ICU4J 라이브러리를 APK로 컴파일하지 않고
프레임워크에서 호출하여APK
풋프린트를 줄일 수 있습니다. (이 경우, Android N 이하 버전의 Android를
실행하는 사용자가 ICU4J 라이브러리를 포함한 앱 버전을 다운로드할 수 있도록
<a href="{@docRoot}google/play/publishing/multiple-apks.html">여러 버전의
APK</a>를 제공해야 할 수도 있습니다.)
</p>
<p>
이 문서에서는 먼저 이 라이브러리 지원에 필요한 최소
Android API 레벨과 관련된 몇 가지 기본 정보를 제공합니다. 그 후,
각 Android에서 ICU4J를 구현하는 데 무엇이 필요한지 설명합니다. 마지막으로,
Android 프레임워크에서 ICU4J API를 사용하는 방법을 설명합니다.
</p>
<h2 id="relation">ICU4J와의 관계</h2>
<p>
Android N은
<code>com.ibm.icu</code>가 아니라 <code>android.icu</code> 패키지를 통해 ICU4J API의 하위 세트를 노출합니다.
Android 프레임워크는 여러 가지 이유로
ICU4J API를 노출하지 않을 수 있습니다. 예컨대 Android N은
일부 사용 중단된 API나 ICU팀에서 안정적이라고 선언하지 않은 API를
노출하지 않습니다. ICU팀이 이후 API의 사용을 중단하면, Android도
이를 사용 중단됨으로 표시하지만 계속 포함합니다.
</p>
<p class="table-caption"><strong>표 1.</strong>
Android N에서 사용된 ICU 및 CLDR 버전.</p>
<table>
<tr>
<th>Android API 레벨</th>
<th>ICU 버전</th>
<th>CLDR 버전</th>
</tr>
<tr>
<td>Android N</td>
<td>56</td>
<td>28</td>
</tr>
</table>
<p>중요한 참고 사항:</p>
<ul>
<li>ICU4J Android 프레임워크 API에는 모든 ICU4J API가 포함되지 않습니다.</li>
<li>NDK 개발자는 Android ICU4C가 지원되지 않는다는 것을 알아야 합니다.</li>
<li>Android 프레임워크의 API는 Android의
<a href="{@docRoot}guide/topics/resources/localization.html">리소스로
현지화</a> 지원을 대체하지 못합니다.</li>
</ul>
<h2 id="migration">com.ibm.icu에서 android.icu 패키지로 마이그레이션</h2>
<p>
앱에서 이미 ICU4J API를 사용하고 있고
<code>android.icu</code> API가 요구사항을 충족한다면
프레임워크 API로 마이그레이션할 때 Java 가져오기를
<code>com.ibm.icu</code>에서 <code>android.icu</code>로 변경해야 합니다. 그러면 APK에서
ICU4J 파일 사본을 삭제할 수 있습니다.
</p>
<p class="note">
<b>참고</b>: ICU4J 프레임워크 API는 {@code com.ibm.icu} 대신 {@code android.icu}
네임스페이스를 사용합니다. 이는 자체 {@code com.ibm.icu} 라이브러리가 포함된 APK에서
네임스페이스 충돌을 피하기 위해서입니다.
</p>
<h3 id="migrate-from-android">
다른 Android SDK API에서 android.icu API로 마이그레이션
</h3>
<p>
<code>java</code>와 <code>android</code> 패키지의 일부 클래스는
ICU4J의 클래스와 같습니다. 그러나 ICU4J는 종종 더욱 폭넓은
표준과 언어를 지원합니다.
</p>
<p>시작하기 위한 몇 가지 예시:</p>
<table>
<tr>
<th>클래스</th>
<th>대체</th>
</tr>
<tr>
<td><code>java.lang.Character</code> </td>
<td><code>android.icu.lang.UCharacter</code> </td>
</tr>
<tr>
<td><code>java.text.BreakIterator</code> </td>
<td><code>android.icu.text.BreakIterator</code> </td>
</tr>
<tr>
<td><code>java.text.DecimalFormat</code> </td>
<td><code>android.icu.text.DecimalFormat</code> </td>
</tr>
<tr>
<td><code>java.util.Calendar</code></td>
<td>
<code>android.icu.util.Calendar</code></td>
</tr>
<tr>
<td><code>android.text.BidiFormatter</code>
</td>
<td><code>android.icu.text.Bidi</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateFormat</code>
</td>
<td><code>android.icu.text.DateFormat</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateUtils</code> </td>
<td><code>android.icu.text.DateFormat</code>
<code>android.icu.text.RelativeDateTimeFormatter</code>
</td>
</tr>
</table>
<h2 id="licence">라이선스</h2>
<p>
ICU4J는 ICU 라이선스에 따라 배포됩니다. 자세한 내용은 <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">ICU
사용자 가이드</a>를 참조하세요.
</p>

View File

@@ -0,0 +1,582 @@
page.title=다중 창 지원
page.metaDescription=Android N에서 한 번에 둘 이상의 앱을 표시하도록 지원.
page.keywords="multi-window", "android N", "split screen", "free-form"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#overview">개요</a></li>
<li><a href="#lifecycle">다중 창 수명 주기</a></li>
<li><a href="#configuring">앱을 다중 창
모드로 구성</a></li>
<li><a href="#running">앱을 다중 창 모드에서 실행</a></li>
<li><a href="#testing">앱의 다중 창 지원 테스트</a></li>
</ol>
<h2>참고 항목</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">다중 창
플레이그라운드 샘플 앱</a></li>
</ol>
</div>
</div>
<p>
Android N에서는 동시에 둘 이상의 앱을 표시하도록
지원합니다. 핸드헬드 기기에서 두 개의 앱을 <em>화면 분할</em> 모드에서
나란히 또는 상하로 실행할 수 있습니다. TV 기기에서 앱이
<em>PIP</em> 모드를 사용하는 경우 사용자가 다른 앱과 상호작용하는
동안에 계속 동영상을 재생할 수 있습니다.
</p>
<p>
N Preview SDK로 앱을 빌드하는 경우, 앱이 다중 창
표시를 처리하는 방식을 구성할 수 있습니다. 예를 들어, 액티비티의
최소 허용 치수를 지정할 수 있습니다. 또한 앱에
대해 다중 창 표시를 비활성화할 수도 있으며, 이 경우 시스템은 앱을 전체 화면 모드에서만
표시합니다.
</p>
<h2 id="overview">개요</h2>
<p>
Android N에서는 여러 앱이 동시에 화면을 공유할 수 있습니다. 예를 들어, 사용자가 화면을 분할하여 왼쪽에서는 웹페이지를
보면서 오른쪽에서는 이메일을 작성할
수 있습니다. 사용자 경험은 기기에 따라
달라집니다.
</p>
<ul>
<li>Android N에서 실행되는 핸드헬드 기기는 화면 분할
모드를 제공합니다. 이 모드에서 시스템은 화면을 두 개의 앱으로 채우고, 이
앱을 나란히 또는 상하로 표시합니다. 사용자가 두 앱을 구분하는 분할선을 끌어서 한 앱을 다른 앱보다
더 크게 만들 수 있습니다.
</li>
<li>Android N을 실행하는 Nexus Player에서, 앱이
<a href="picture-in-picture.html">PIP 모드</a>로 배치될 수 있으므로, 사용자가 검색을
수행하거나 다른 앱과 상호작용하는 중에도 앱이 계속해서 콘텐츠를
표시할 수 있습니다.
</li>
<li>더 큰 기기를 제조하는 업체는 자유형식
모드를 선택할 수 있으며, 이 경우 사용자가 각 액티비티의 크기를 자유롭게 조정할 수 있습니다. 제조업체가 이 기능을 활성화하면, 기기는 화면 분할 모드 뿐만
아니라 자유형식 모드를
제공합니다.
</li>
</ul>
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
{@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong>그림 1.</strong> 화면 분할 모드에서 나란히 실행 중인 두 앱.
</p>
<p>
사용자가 다음과 같이 다중 창 모드로 전환할 수 있습니다.
</p>
<ul>
<li>사용자가 <a href="{@docRoot}guide/components/recents.html">Overview
화면</a>을 열고 액티비티 제목을 길게 누르면,
이 액티비티를 화면의 강조 표시된 부분으로 끌어서
다중 창 모드에 둘 수 있습니다.
</li>
<li>사용자가 Overview 버튼을 길게 누르면, 기기가 현재 액티비티를
다중 창 모드에 두고 Overview 화면을 열며, 이 화면에서 사용자는 화면을
공유하기 위한 또 다른 액티비티를 선택할 수 있습니다.
</li>
</ul>
<p>
사용자는 여러 액티비티가 화면을 공유하는 동안 한 액티비티에서
또 다른 액티비티로 데이터를 <a href="{@docRoot}guide/topics/ui/drag-drop.html">끌어서 놓을</a>
수 있습니다. (이전에는, 사용자가 단일 액티비티 내에서만
데이터를 끌어서 놓을 수 있었습니다.)
</p>
<h2 id="lifecycle">다중 창 수명 주기</h2>
<p>
다중 창 모드는 <a href="{@docRoot}training/basics/activity-lifecycle/index.html">액티비티
수명 주기</a>를 변경하지 않습니다.
</p>
<p>
다중 창 모드에서는, 사용자가 가장 최근에 상호작용했던 액티비티만
지정된 시간에 활성화됩니다. 이 액티비티는 <em>최상위</em>로 간주됩니다.
다른 모든 액티비티는 표시되어 있더라도 일시 정지된 상태입니다.
그러나 시스템은 이러한 일시 정지되었지만 표시된 액티비티에게 표시되지
않은 액티비티보다 더 높은 우선 순위를 부여합니다. 사용자가 일시 정지된 액티비티 중 하나와 상호작용하면, 해당
액티비티가 재개되고 이전의 최상위 액티비티가 일시
정지됩니다.
</p>
<p class="note">
<strong>참고:</strong> 다중 창 모드에서는 앱이 일시 정지된 상태에서도 여전히
사용자에게 표시될 수 있습니다. 앱이 일시 정지된 동안에도 액티비티를
계속해야 하는 경우도 있습니다. 예를 들어, 일시 정지 모드이지만 표시된
동영상 재생 앱은 계속해서 동영상을 보여줘야 합니다. 이러한 이유로, 동영상을
재생하는 액티비티는 {@link android.app.Activity#onPause onPause()} 핸들러에서
동영상을 일시 정지하지 <em>않는</em> 것이 좋습니다.
그 대신, {@link android.app.Activity#onStop
onStop()}에서 동영상을 일시 정지하고, {@link android.app.Activity#onStart
onStart()}에서 재생을 재개해야 합니다.
</p>
<p>
사용자가 앱을 다중 창 모드에 놓으면,
시스템은 <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리</a>에 지정된 대로, 구성 변경을 액티비티에게
알려줍니다. 기본적으로, 이 변경의 액티비티-수명 주기 관계는 기기의 모드가
세로 모드에서 가로 모드로 전환되었음을
시스템이 앱에 알려줄 때와 동일합니다(단순 스왑 대신
기기 치수가 변경되는 경우는 제외). <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경 처리</a>에서 설명한
대로, 액티비티 스스로 구성 변경을 처리하거나, 시스템이 액티비티를 소멸시키고
새 치수로 다시 액티비티를 생성하도록 할 수
있습니다.
</p>
<p>
사용자가 창의 크기를 조정하여 한쪽 치수를 더 크게 만드는
경우, 시스템은 사용자 작업에 맞게 액티비티의 크기를 조정하고 필요한
경우 <a href="{@docRoot}guide/topics/resources/runtime-changes.html">런타임 변경</a>을 수행합니다. 앱이 새로 노출되는 영역에 그릴 때 지연이 발생하는 경우, 시스템은 {@link
android.R.attr#windowBackground windowBackground} 특성 또는 기본
<code>windowBackgroundFallback</code> 스타일 특성에 의해
지정된 색으로 이 영역을 임시로 채웁니다.
</p>
<h2 id="configuring">앱을 다중 창 모드로 구성</h2>
<p>
앱이 Android N을 대상으로 하는 경우, 앱의 액티비티가 다중
창 표시를 지원하는지 여부와 지원 방법을 구성할 수 있습니다. 매니페스트에서 특성을 설정하여 크기와 레이아웃을 제어할
수 있습니다.
루트 액티비티의 특성 설정은 작업 스택 내의 모든
액티비티에 적용됩니다.
</p>
<p class="note">
<strong>참고:</strong> Android N보다 더 낮은 버전의 SDK로 다중 방향 앱을 작성하는 경우
사용자가 앱을 다중 창 모드에서 사용하면, 시스템이
이 앱의 크기를 강제로 조정합니다. 앱이 예상치 못하게 동작할 수 있음을 사용자에게 경고하는
대화 상자가 표시됩니다. 시스템은 고정
방향 앱의 크기는 조정하지 <em>않습니다</em>. 사용자가
다중 창 모드 하에서 고정 방향 앱을 열려고 시도하면,
앱이 전체 화면을 차지합니다.
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
매니페스트의 <code>&lt;activity&gt;</code> 또는
<code>&lt;application&gt;</code> 노드에서 이 특성을 설정하여 다중 창
표시를 활성화하거나 비활성화합니다.
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
이 특성을 true로 설정하면, 액티비티를 분할 화면 모드와 자유형식
모드로 시작할 수 있습니다. 이 특성을 false로 설정하면, 액티비티가 다중 창 모드를 지원하지
않습니다. 이 값이 false이고 사용자가
다중 창 모드에서 액티비티를 시작하려고 시도하면, 액티비티가 전체 화면을
차지합니다.
</p>
<p>
앱이 Android N을 대상으로 하지만 이 특성에 값을 지정하지
않은 경우, 이 특성의 기본값은 true가 됩니다.
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
이 특성을 매니페스트의 <code>&lt;activity&gt;</code> 노드에 설정하여
액티비티가 PIP 표시를 지원하는지 여부를 나타냅니다. <code>android:resizeableActivity</code>가 false인 경우 이 특성이
무시됩니다.
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">레이아웃 특성</h3>
<p>
Android N에서 <code>&lt;layout&gt;</code> 매니페스트 요소는
다중 창 모드에서 액티비티가 동작하는 방식에 영향을 미치는
여러 특성을 지원합니다.
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
자유형식 모드에서 시작될 때 액티비티의 기본 너비.
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
자유형식 모드에서 시작될 때 액티비티의 기본 높이.
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
자유형식 모드에서 시작될 때 액티비티의 초기 배치. 적합한 값은
{@link android.view.Gravity} 참조를 참조하세요.
</dd>
<dt>
<code>android:minimalSize</code>
</dt>
<dd>
화면 분할
및 자유형식 모드에서 액티비티의 최소 높이 및 최소 너비. 사용자가 화면 분할 모드에서 디바이더를 이동하여 액티비티를
지정된 최소값보다 더 작게 만드는 경우, 시스템은
이 액티비티를 사용자가 요청한 크기로 자릅니다.
</dd>
</dl>
<p>
예를 들어, 다음 코드는 액티비티가 자유형식 모드로 표시될
때 이 액티비티의 기본 크기와 위치 및 최소 크기를
지정하는 방법을 보여줍니다.
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalSize="450dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">앱을 다중 창 모드에서 실행</h2>
<p>
Android N에서는 다중 창 모드에서 실행 가능한 앱을 지원하는 새로운
기능을 제공합니다.
</p>
<h3 id="disabled-features">다중 창 모드에서 비활성화되는 기능</h3>
<p>
기기가 다중 창 모드에 있는 경우 일부 기능이 비활성화되거나
무시되는데, 그 이유는 이들 기능은 기기 화면을 다른 액티비티
또는 앱과 공유하는 액티비티에는 적합하지 않기 때문입니다. 이러한 기능에는 다음이 포함됩니다.
<ul>
<li>일부 <a href="{@docRoot}training/system-ui/index.html">시스템 UI</a>
사용자 지정 옵션이 비활성화됩니다. 예를 들어, 앱이 전체 화면 모드에서 실행되지
않을 경우에는 상태 표시줄을 숨길 수 없습니다.
</li>
<li>시스템이 <code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code> 특성의 변경을 무시합니다.
</li>
</ul>
<h3 id="change-notification">다중 창 변경 알림 및 쿼리</h3>
<p>
다중 창 표시를 지원하기 위해 다음과 같은 새 메서드가 {@link android.app.Activity}
클래스에 추가되었습니다. 각 메서드에 대한 자세한 내용은,
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">N Preview SDK 참조</a>를 참조하세요.
</p>
<dl>
<dt>
<code>Activity.inMultiWindow()</code>
</dt>
<dd>
액티비티가 다중 창 모드에 있는지를 알아내려면 호출합니다.
</dd>
<dt>
<code>Activity.inPictureInPicture()</code>
</dt>
<dd>
액티비티가 PIP 모드에 있는지를 알아내려면 호출합니다.
<p class="note">
<strong>참고:</strong> PIP 모드는 다중 창 모드의 특별한
케이스입니다. <code>myActivity.inPictureInPicture()</code>가
true를 반환하면, <code>myActivity.inMultiWindow()</code>도 또한
true를 반환합니다.
</p>
</dd>
<dt>
<code>Activity.onMultiWindowChanged()</code>
</dt>
<dd>
시스템은 액티비티가 다중 창 모드로 들어가거나
이 모드에서 나올 때마다 이 메서드를 호출합니다. 시스템은 액티비티가 다중 창 모드로
들어갈 때는 true 값을 메서드에 전달하고, 액티비티가 다중 창 모드에서
나올 때는 false를 전달합니다.
</dd>
<dt>
<code>Activity.onPictureInPictureChanged()</code>
</dt>
<dd>
시스템은 액티비티가 PIP 모드로 들어가거나
이 모드에서 나올 때마다 이 메서드를 호출합니다. 시스템은 액티비티가 PIP 모드로 들어갈 때는
true 값을 메서드에 전달하고, 액티비티가 PIP에서 나올 때는
false를 전달합니다.
</dd>
</dl>
<p>
또한 이들 각 메서드의 {@link android.app.Fragment} 버전이
있습니다(예: <code>Fragment.inMultiWindow()</code>).
</p>
<h3 id="entering-pip">PIP 모드로 들어가기</h3>
<p>
액티비티를 PIP 모드에 두려면, 새로운 메서드인
<code>Activity.enterPictureInPicture()</code>를 호출합니다. 기기가 PIP 모드를 지원하지 않으면 이 메서드는
영향이 없습니다. 자세한 내용은
<a href="picture-in-picture.html">PIP</a> 문서를 참조하세요.
</p>
<h3 id="launch">다중 창 모드에서 새 액티비티 시작</h3>
<p>
새 액티비티를 시작하는 경우, 가능하면 이 새 액티비티가 현재
액티비티에 인접하여 표시되어야 함을 시스템에게 알려줄 수 있습니다. 이를 위해
, 플래그
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>를 사용합니다. 이 플래그를 전달하면
다음과 같은 동작이 요청됩니다.
</p>
<ul>
<li>기기가 화면 분할 모드에 있는 경우,
시스템은 시작한 액티비티 옆에 새 액티비티를 만들려고 시도하므로, 두 액티비티가
화면을 공유합니다. 시스템이 이 작업을 수행할 수 있다고
보장되지는 않지만, 가능하면 액티비티를 인접하게 만듭니다.
</li>
<li>기기가 화면 분할 모드에 있으면, 이 플래그가 영향을 미치지 않습니다.
</li>
</ul>
<p>
기기가 자유형식 모드에 있고 새 액티비티를 시작 중인 경우,
<code>ActivityOptions.setLaunchBounds()</code>를 호출하여 이 새 액티비티의 치수와 화면 위치를
지정할 수 있습니다. 기기가 다중 창 모드에 있지 않으면, 이 메서드가 영향을
미치지 않습니다.
</p>
<p class="note">
<strong>참고:</strong> 작업 스택 내에서 액티비티를 시작하는 경우,
이 액티비티는 화면상의 액티비티를 대체하여, 모든 다중 창 속성을
상속합니다. 새 액티비티를 다중 창 모드에서 별도 창으로 시작하려면,
새 작업 스택에서 액티비티를 시작해야 합니다.
</p>
<h3 id="dnd">끌어서 놓기 지원</h3>
<p>
사용자는 두
액티비티가 화면을 공유하는 동안 한 액티비티에서 다른 액티비티로 데이터를 <a href="{@docRoot}guide/topics/ui/drag-drop.html">끌어서 놓을</a>
수 있습니다. (이전에는, 사용자가 단일 액티비티 내에서만 데이터를 끌어서
놓을 수 있었습니다.) 이러한 이유로, 앱이 현재 지원하지 않는 경우에는 끌어서 놓기
기능을 앱에 추가하는 것이 좋습니다.
</p>
<p>
N Preview SDK는 앱 간의 끌어서 놓기를 지원하기 위해 <a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a>
패키지를 확장합니다. 다음과 같은 클래스와 메서드에 대한 자세한
내용은, <a href="{@docRoot}preview/setup-sdk.html#docs-dl">N Preview
SDK 참조</a>를 참조하세요.
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
놓기를 수신하는 앱에 부여되는 권한을 지정하기
위한 토큰 객체.
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
{@link android.view.View#startDrag View.startDrag()}의 새 별칭. 액티비티 간의 끌어서 놓기를 활성화하려면, 새 플래그
<code>View.DRAG_FLAG_GLOBAL</code>을
전달합니다. 수신자 액티비티에게 URI 권한을
부여해야 하는 경우, 새 플래그
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> 또는
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code>를 적절하게 전달합니다.
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
현재 진행 중인 끌기 작업을 취소합니다. 끌기 작업을 발생시킨
앱에 의해서만 호출될 수 있습니다.
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
현재 진행 중인 끌기 작업의 끌기 그림자를 대체합니다. 끌기 작업을 발생시킨
앱에 의해서만 호출될 수 있습니다.
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
{@link android.view.DragEvent}에 포함된 {@link
android.content.ClipData}로 전달되는 콘텐츠 URI의 권한을 요청합니다.
</dd>
</dl>
<h2 id="testing">앱의 다중 창 지원 테스트</h2>
<p>
앱을 Android N용으로 업데이트하든 안하든 간에,
Android N이 실행 중인 기기에서 사용자가 앱을 다중 창 모드로
시작하려고 시도하는 경우, 앱이 다중 창 모드에서 어떻게 작동하는지 확인해야 합니다.
</p>
<h3 id="configuring">테스트 기기 구성</h3>
<p>
기기에 Android N을 설치하면, 화면 분할 모드가
자동으로 지원됩니다.
</p>
<h3 id="test-non-n">앱이 N Preview SDK로 작성되지 않은 경우</h3>
<p>
앱을 N Preview SDK로 작성하지 않았는데 사용자가
앱을 다중 창 모드에서 사용하려고 시도하는 경우, 이 앱이 고정 방향을 선언하지
않으면 시스템이 앱의 크기를 강제로 조정합니다.
</p>
<p>
앱이 고정 방향을 선언하지 않은 경우, Android N이
실행 중인 기기에서 앱을 시작해야 하며, 앱을 화면 분할 모드에
두도록 시도해야 합니다. 앱의 크기를 강제로 조정하는 경우 사용자 경험이
적절한지 확인하세요.
</p>
<p>
앱이 고정 방향을 선언하는 경우, 앱을 다중 창 모드에
두도록 시도해야 합니다. 이 때 앱이 전체 화면 모드에 남아있는지
확인하세요.
</p>
<h3 id="test-mw">다중 창 모드를 지원하는 경우</h3>
<p>
N Preview SDK로 앱을 작성했는데 다중 창 지원을 비활성화하지
않은 경우, 화면 분할 및 자유형식 모드에서 다음과
같은 동작을 확인하세요.
</p>
<ul>
<li>앱을 전체 화면 모드에서 시작한 다음, Overview 버튼을 길게 눌러서
다중 창 모드로 전환합니다. 앱이 적절히 전환되는지 확인합니다.
</li>
<li>앱을 다중 창 모드에서 직접 시작하고, 이 앱이 적절히
시작되는지 확인합니다. 다중 창 모드에서 앱을 시작하려면, Overview 버튼을
누르고 앱의 제목 표시줄을 길게 누른 다음 화면의 강조 표시된 영역 중
하나로 제목 표시줄을 끌어서 놓습니다.
</li>
<li>분할선을 끌어서 화면 분할 모드에서 앱의 크기를 조정합니다.
작동 중단 없이 앱 크기가 조정되는지 확인하고, 필요한
UI 요소가 표시되는지 확인합니다.
</li>
<li>앱에 최소 치수를 지정한 경우, 이 치수 아래로 앱 크기를
조정해 봅니다. 지정된 최소값보다 더 작게 앱 크기를 조정할 수
없는지 확인합니다.
</li>
<li>모든 테스트를 통해 앱의 성능이 적절한지 확인합니다. 예를 들어,
앱 크기를 조정한 후에, 업데이트하기에 지연이
너무 길지 않은지 확인합니다.
</li>
</ul>
<h4 id="test-checklist">테스트 검사 목록</h4>
<p>
다중 창 모드에서 앱의 성능을 확인하려면, 다음
작업을 시도해 보세요. 별다른 설명이 없는 한, 화면 분할 및 다중 창 모드
에서 모두 이들 작업을 시도해야 합니다.
</p>
<ul>
<li>다중 창 모드에 들어갔다 나갑니다.
</li>
<li>자신의 앱에서 다른 앱으로 전환하고, 앱이 표시는 되지만
활성화되지 않은 동안에 적절히 동작하는지 확인합니다. 예를 들어, 앱이 동영상을 재생 중인 경우, 사용자가
다른 앱과 상호작용하는 동안에 이 동영상이 계속 재생되는지
확인합니다.
</li>
<li>화면 분할 모드에서, 분할선을 이동하여 앱을 더 크거나
작게 만들어 봅니다. 앱을 나란히 또는 상하로 놓은 구성에서 이러한
작업을 시도해 봅니다. 앱의 작동이 중단되지 않는지, 필수 기능이
표시되는지, 그리고 크기 조정 작업이 너무 오래 걸리지 않는지
확인합니다.
</li>
<li>빠르게 연속해서 여러 가지 크기 조정 작업을 수행합니다. 앱의 작동이 중단되거나 메모리가 누수되지
않는지 확인합니다. 앱의 메모리 사용량을 확인하는
방법에 대해서는 <a href="{@docRoot}tools/debugging/debugging-memory.html">RAM 사용량
검사</a>를 참조하세요.
</li>
<li>여러 가지 다른 창 구성에서 앱을 정상적으로
사용하고, 이 앱이 제대로 작동하는지 확인합니다. 텍스트를 읽을 수 있는지 확인하고, 해당
UI 요소가 상호작용하기에 너무 작지 않은지 확인합니다.
</li>
</ul>
<h3 id="test-disabled-mw">다중 창 지원을 비활성화한 경우</h3>
<p>
<code>android:resizableActivity="false"</code>를 설정하여
다중 창 지원을 비활성화한 경우, Android N을 실행 중인 기기에서
앱을 시작해야 하며, 앱을 자유형식 및 화면
분할 모드로 둬야 합니다. 이 때 앱이 전체 화면 모드에 남아있는지
확인하세요.
</p>

View File

@@ -0,0 +1,214 @@
page.title=언어 및 로케일
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#preN">언어 리소스 결정에서의 과제</a></li>
<li><a href="#postN">리소스 결정 전략 개선</a></li>
<li><a href="#design">추가 로케일 지원을 위한
앱 설계</a></li>
</ol>
</div>
</div>
<p>Android N은 다국어 사용자를 위한 지원을 개선해서
설정에서 여러 로케일을 선택할 수 있습니다. Android N은
지원되는 로케일 수를 대폭 확대하고
시스템이 리소스를 결정하는 방식을 변경하여 이 기능을 제공합니다. 새로 도입된 리소스 결정 방법은
더욱 안정적이고 기존 APK와 호환되도록 설계되어 있지만
예상치 못한 동작이 없는지 신중히 살펴봐야 합니다. 예를 들어,
앱이 예상 언어로 기본 설정되어 있는지 테스트해야 합니다. 또한,
앱이 여러 언어를 지원한다면
원하는 대로 작동하는지 확인해야 합니다. 마지막으로
앱이 지원하도록 명시하지 않은 언어를 무리 없이 처리하는지 확인해야 합니다.</p>
<p>이 문서에서는
Android N 이전의 리소스 결정 전략을 설명한 뒤에, Android N의 개선된
리소스 결정 전략을 설명합니다. 마지막으로
더 많은 다국어 사용자를 지원하기 위해 확장된 로케일을 활용하는 방법을 설명합니다.</p>
<h2 id="preN">언어 리소스 결정에서의 과제</h2>
<p>Android N 이전의 Android는
앱과 시스템 로케일을 매칭하지 못하는 경우도 있었습니다. 예를 들어, 앱의 기본 언어가
미국 영어지만 {@code es_ES}
리소스 파일에 스페인어 문자열도 현지화되어 있습니다.</p>
<p>Java 코드가 문자열을 참조할 때 다음과 같이 문자열 언어를
결정합니다.</p>
<ul>
<li>기기가 {@code es_MX}(멕시코 스페인어)로 설정되어 있으면 Android는
{@code es_ES} 리소스 파일에서 문자열을 로드합니다.</li>
<li>기기가 {@code en_AU}로 설정되어 있으면 Android는 {@code
en_US}로 돌아갑니다. 또한, 사용자가 앱에서 전혀 지원하지 않는 언어(예: 프랑스어)를 선택하면 시스템이 기본값을 {@code en_US}로
설정합니다.</li>
</ul>
<p>시스템이 정확한 일치를 찾지 못하면
로케일의 국가 코드를 삭제하기 때문에 이러한 결정 문제가 발생합니다. 예:</p>
<p class="table-caption" id="t-resource-res">
<strong>표 1.</strong> 정확한 로케일 일치가 없는 경우 리소스 결정.
</p>
<table>
<tbody>
<tr>
<th>사용자 설정</th>
<th>앱 리소스</th>
<th>리소스 결정</th>
</tr>
<tr>
<td>fr_CH</td>
<td>
기본값(en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
fr_CH 시도 =&gt; 실패<br>
fr 시도 =&gt; 실패<br>
기본값(en) 사용
</td>
</tr>
</tbody>
</table>
<p>이 예시에서 시스템은
사용자가 영어를 이해할 수 있는지 여부와 관계없이 영어 문자열을 표시합니다. 현재 이러한 동작이 상당히
일반적입니다. Android N은 이런
결과가 나타나는 빈도를 상당히 낮추었습니다.</p>
<h2 id="postN">리소스 결정 전략 개선</h2>
<p>Android N은 더욱 안정적인 리소스 결정을 사용하고
자동으로 더욱 알맞은 대안책을 찾습니다. 그러나 결정 속도를 높이고
관리성을 개선하려면 가장 일반적인 상위 방언에 리소스를 저장해야 합니다.
예를 들어, 전에 {@code es-US} 디렉터리에
스페인어 리소스를 저장했다면 남미 스페인어가 있는 {@code es-419} 디렉터리로 이동합니다.
마찬가지로 {@code en-GB}란 폴더에 리소스 문자열이 있다면
폴더 이름을 {@code en-001}(국제 영어)로 변경합니다.
<code>en-GB</code> 문자열의 가장 일반적인 상위 리소스는 {@code en-001}이기 때문입니다.
다음은 이러한 방법이
성능과 리소스 결정의 신뢰성을 개선하는 이유를 설명하는 예시입니다.</p>
<h3>리소스 결정 예시</h3>
<p>Android N의 경우, <strong>표 1</strong>의 사례는
다르게 결정됩니다.</p>
<p class="table-caption" id="t-improved-res">
<strong>표 2.</strong> 정확한 로케일 일치가 없을 경우
개선된 결정 전략.</p>
<table>
<tr>
<th>사용자 설정</th>
<th>앱 리소스</th>
<th>리소스 결정</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
기본값(en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
fr_CH 시도 =&gt; 실패<br>
fr 시도 =&gt; 실패<br>
Fr의 하위 리소스 시도 =&gt; fr_FR<br>
fr_FR 사용
</td>
</tr>
</table>
<p>이제 사용자는 영어 대신 프랑스어 리소스를 보게 됩니다. 이 예시는
Android N에서 프랑스어 문자열을 {@code fr_FR}
이 아니라 {@code fr}에 저장해야 하는 이유를 알 수 있습니다. 이러한 동작을 통해 가장 가까운 상위 방언과 일치시켜서
더욱 빠르고 예측 가능하게 결정합니다.</p>
<p>Android는 이러한 결정 논리를 개선했을 뿐만 아니라
선택 가능한 언어를 더 많이 제공합니다. 위의 예시에 이탈리아어가 추가 사용자 언어로 지정되었지만
앱에서 프랑스어를 지정하지 않는 경우를 적용해 보겠습니다. </p>
<p class="table-caption" id="t-2d-choice">
<strong>표 3.</strong> 앱이 사용자의 두 번째 선호 로케일 설정에만 일치할 때
리소스 결정.</p>
<table>
<tr>
<th>사용자 설정</th>
<th>앱 리소스</th>
<th>리소스 결정</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
<li> it_CH</li>
</ol>
</td>
<td>
기본값(en)<br>
de_DE<br>
es_ES<br>
it_IT<br>
</td>
<td>
fr_CH 시도 =&gt; 실패<br>
fr 시도 =&gt; 실패<br>
fr의 하위 리소스 시도 =&gt; 실패<br>
it_CH 시도 =&gt; 실패<br>
it 시도 =&gt; 실패<br>
it의 하위 리소스 시도 =&gt; it_IT<br>
it_IT 사용
</td>
</tr>
</table>
<p>앱이 프랑스어를 지원하지 않지만
사용자는 여전히 자신이 이해하는 언어를 볼 수 있습니다.</p>
<h2 id="design">추가 로케일 지원을 위한 앱 설계</h2>
<h3>LocaleList API</h3>
<p>Android N에서는 앱이 사용자가 지정한 언어 목록을 직접 쿼리할 수 있는 새로운 API {@code LocaleList.GetDefault()}
가 추가되었습니다. 이 API는
앱 동작을 더욱 정교하게 해주고
콘텐츠 표시 최적화를 개선합니다. 예를 들어, 검색 시
사용자 설정에 따라 여러 언어로 결과를 표시할 수 있습니다. 브라우저 앱은
사용자가 이미 알고 있는 언어로
번역 페이지를 제공하지 않고, 키보드 앱은 모든 적절한 레이아웃을 자동 활성화할 수 있습니다. </p>
<h3>포맷터</h3>
<p>Android 6.0(API 레벨 23)까지 Android는 많은 공통 언어(en, es, ar, fr, ru)에 대해
1~2개의 로케일만
지원했습니다. 각 언어의 변종은 몇 개뿐이기 때문에
리소스 파일에 하드코딩된 문자열로 몇 개의 숫자와 날짜를 저장하는 것만으로
충분했습니다. 그러나 Android에서 지원되는 로케일 세트가 확장되면서
단일 로케일 내에서조차
날짜, 시간, 통화 및 유사 정보에
큰 차이가 생길 수 있게 되었습니다. 형식 하드코딩은
최종 사용자에게 혼란을 줄 수 있습니다. 그러므로 Android N을 개발할 때는
숫자와 날짜 문자열을 하드코딩하는 대신 포맷터를 사용하도록 하세요.</p>
<p>가장 좋은 예시로는 아랍어가 있습니다. Android N에서 아랍어 지원이
{@code ar_EG} 1개에서 27개 아랍어 로케일로 확장되었습니다. 이러한 로케일은 대부분의 리소스를 공유할 수 있지만
어떤 로케일은 ASCII 숫자를 선호하고 어떤 로케일은 네이티브 숫자를 선호합니다. 예를 들어,
"4자리 핀 선택"과 같은 숫자 변수가 포함된 문장을 생성하려면
아래와 같이 포맷터를 사용합니다.</p>
<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>

View File

@@ -0,0 +1,328 @@
page.title=알림
page.tags=notifications
helpoutsWidget=true
page.image=/preview/images/notifications-card.png
trainingnavtop=true
@jd:body
<div id="qv-wrapper">
<div id="qv">
<!-- table of contents -->
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#direct">직접 회신</a></li>
<li><a href="#bundle">묶음 알림</a></li>
<li><a href="#custom">사용자 지정 뷰</a></li>
</ol>
</div>
</div>
<p>Android N에서는 앱이 가시성과 상호작용이 뛰어난 알림을
게시할 수 있도록 여러 새로운 API를 소개합니다.</p>
<p>Android N에서는 핸드셋에서 인라인 회신을 지원하기 위해 기존의 {@link android.support.v4.app.RemoteInput}
알림 API를 확장합니다. 이 기능을 사용하면 앱을 방문하지 않고도 알림 창에서
신속하게 응답할 수 있습니다.</p>
<p>
Android N에서는 또한 비슷한 알림을 묶어서 단일 알림으로
표시할 수도 있습니다. 이것이 가능하도록, Android N에서는 기존의 {@link
android.support.v4.app.NotificationCompat.Builder#setGroup
NotificationCompat.Builder.setGroup()} 메서드를 사용합니다. 사용자가 각 알림을 확장할 수 있으며, 각 알림에 대해 회신 및
닫기와 같은 동작을 알림 창에서 개별적으로 수행할
수 있습니다.
</p>
<p>마지막으로, Android N에서는 또한 앱의 사용자 지정된 알림
뷰에서 시스템 장식을 활용할 수 있는 새 API를 추가합니다. 이들 API는 표준 템플릿을 통해 알림 뷰가
일관된 프레젠테이션을 공유하도록 보장해
줍니다.</p>
<p>이 문서에서는 새 알림 기능을 앱에서 사용할 때 고려해야
하는 몇 가지 주요 변경 사항을 중점적으로 다룹니다.</p>
<h2 id="direct">직접 회신</h2>
<p>Android N에 있는 직접 회신 기능을 사용하여, 사용자가 문자
메시지에 신속하게 응답하거나 알림 인터페이스 내에서 직접
작업 목록을 업데이트할 수 있습니다. 핸드헬드에서 인라인 회신 동작은 알림에 연결된 추가적인
버튼으로 나타납니다. 사용자가 키보드를 통해 회신하면,
시스템은 여러분이 알림 동작에 지정했던
인텐트에 텍스트 응답을 첨부하고 이 인텐트를
핸드헬드 앱으로 보냅니다.
<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
{@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
<p class="img-caption">
<strong>그림 1.</strong> Android N이 <strong>회신</strong>
동작 버튼을 추가합니다.
</p>
<h3>인라인 회신 동작 추가</h3>
<p>직접 회신을 지원하는 알림 동작을 만들려면:
</p>
<ol>
<li>알림 동작에 추가할 수 있는 {@link android.support.v4.app.RemoteInput.Builder}의
인스턴스를
만듭니다. 이 클래스의 생성자는 시스템이 문자 입력의 키로
사용하는 문자열을 수락합니다. 나중에 핸드헬드 앱은 이 키를 사용하여 입력 텍스트를
검색합니다.
<pre>
// Key for the string that's delivered in the action's intent
private static final String KEY_TEXT_REPLY = "key_text_reply";
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
</pre>
</li>
<li><code>addRemoteInput()</code>을 사용하여 {@link android.support.v4.app.RemoteInput}
객체를 동작에 첨부합니다.
<pre>
// Create the reply action and add the remote input
Notification.Action action =
new Notification.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
.build();
</pre>
</li>
<li>동작을 알림에 적용하고 알림을 발생합니다.
<pre>
// Build the notification and add the action
Notification notification =
new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.content))
.addAction(action))
.build();
// Issue the notification
NotificationManager notificationManager =
NotificationManager.from(mContext);
notificationManager.notify(notificationId, notification);
</pre>
</li>
</ol>
<p> 시스템이 사용자에게 알림 동작이 트리거될 때 응답을 입력하라는
메시지를 표시합니다. </p>
<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
{@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
<p class="img-caption">
<strong>그림 2.</strong> 사용자가 알림 창에서 텍스트를 입력합니다.
</p>
<h3>인라인 회신에서 사용자 입력 검색</h3>
<p>회신 동작의 인텐트에 선언한 액티비티에 대해 알림
인터페이스로부터 사용자 입력을 수신하려면:</p>
<ol>
<li> 알림 동작의 인텐트를 입력 매개변수로서 전달하여 {@link android.support.v4.app.RemoteInput#getResultsFromIntent
getResultsFromIntent()}를
호출합니다. 이 메서드는 텍스트 응답이 포함된 {@link android.os.Bundle}을
반환합니다.
</li>
<pre>
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
</pre>
<li>({@link
android.support.v4.app.RemoteInput.Builder} 생성자에 제공된) 결과 키를 사용하여 번들을 쿼리합니다.
</li>
</ol>
<p>다음 코드 조각에서는 메서드가 번들로부터 입력 텍스트를
검색하는 방법을 보여줍니다.</p>
<pre>
// Obtain the intent that started this activity by calling
// Activity.getIntent() and pass it into this method to
// get the associated string.
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
return null;
}
</pre>
<p>검색된 텍스트에 어떤 동작을 취할지를 결정하기 위해
앱이 로직을 적용할 수 있습니다.
채팅과 같은 대화형 앱은 알림 자체에서 더 많은 컨텍스트를
제공하므로(예: 사용자 자신의 메시지를 포함한 여러 줄의 채팅 기록)
사용자가 적절하게 응답할 수 있습니다.
사용자가 {@link android.support.v4.app.RemoteInput}을 통해 응답하는 경우, {@code setRemoteInputHistory()}
메서드로 텍스트를 회신 기록에
포함시킵니다.</p>
<h2 id="bundle">묶음 알림</h2>
<p>Android N에서는 일련의 알림을 표시하기 위한 새로운 방식을
개발자에게 제공합니다. <i>묶음 알림</i>. 이것은
Android Wear의 <a href="{@docRoot}training/wearables/notifications/stacks.html">알림
스택</a> 기능과 유사합니다. 예를 들어, 수신된 메시지에 대해 앱이 알림을 생성하는 경우,
둘 이상의 메시지가 수신되면 그 알림을 하나의
단일 그룹으로 묶습니다. 기존의
{@link android.support.v4.app.NotificationCompat.Builder#setGroup
Builder.setGroup()} 메서드를 사용하여 유사한 알림을 묶을 수 있습니다.</p>
<p>
알림 그룹은 이 그룹을 구성하는 알림을 계층 구조로 만듭니다 .
계층 구조의 맨 위는 그룹의 요약 정보가 표시되는 상위
알림입니다. 사용자는 알림 그룹을 점진적으로 확장할 수 있으며, 시스템은
사용자가 더 깊이 파고들수록 더 많은 정보를
표시합니다. 사용자가 번들을 확장하면 시스템은 모든 하위 알림에 대해
더 많은 정보를 표시하며, 사용자가 이들 알림 중 하나를 확장하면
시스템은 알림의 전체 콘텐츠를 표시합니다.
</p>
<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
{@docRoot}preview/images/bundles_2x.png 2x" width="300">
<p class="img-caption">
<strong>그림 3.</strong> 사용자는 알림 그룹을 점진적으로 확장할 수
있습니다.
</p>
<p>알림을 그룹에 추가하는 방법을 알아보려면,
<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">각
알림을 그룹에 추가</a>를 참조하세요.</p>
<h3 id="best-practices">묶음 알림의 모범 사례</h3>
<p>이 섹션에서는 이전 버전의 Android 플랫폼에서
사용되었던 {@link android.app.Notification.InboxStyle InboxStyle} 알림 대신에
알림 그룹을 사용할 때의 지침을
제공합니다.</p>
<h3>묶음 알림을 사용하는 경우</h3>
<p>자신의 사용 사례에서 다음의 모든 조건이 충족되는 경우에만
알림 그룹을 사용해야 합니다.</p>
<ul>
<li>하위 알림은 완전한 알림이며 그룹 요약이 필요 없이
개별적으로 표시될 수 있습니다.</li>
<li>다음은 하위 알림을 개별적으로 표시할 때의 이점입니다. 예:
</li>
<ul>
<li>알림이 실행 가능하며, 각 하위 알림에 맞는 동작이 있습니다.</li>
<li>사용자가 읽고 싶어하는 하위 알림에 더 많은 정보가 있습니다.</li>
</ul>
</ul>
<p>알림 그룹의 사용 사례에 대한 좋은 예로는, 수신 메시지의
목록을 표시하는 메시징 앱이나 수신된 이메일의 목록을 표시하는
이메일 앱이 있습니다.</p>
<p>
단일 알림이 바람직한 사례의 예로는, 한 사람이 보낸
개별 메시지나 1줄 텍스트 항목의 목록 표시가
있습니다. 이를 수행하기 위해
({@link android.app.Notification.InboxStyle InboxStyle} 또는
{@link android.app.Notification.BigTextStyle BigTextStyle})을 사용할
수 있습니다.
</p>
<h3 id ="post">묶음 알림 표시</h3>
<p>
그룹에 하나의 하위 항목만 포함되어 있더라도 앱은
항상 그룹 요약을 게시해야 합니다. 하나의 알림만 포함된 경우에는 시스템이 요약을
억제하고 하위 알림을 직접 표시합니다. 이렇게 하면 사용자가 그룹의
하위 항목을 스와이프할 때 시스템이 일관된 경험을 제공할 수
있습니다.
</p>
<p class="note">
<strong>참고:</strong> 이 버전의 Android N에서는 아직 단일 하위
항목이 포함된 알림 그룹에 대해 요약을 억제하지 않습니다. 이
기능은 이후 버전의 Android N에 추가될 것입니다.
</p>
<h3>피킹 알림</h3>
<p>시스템은
일반적으로 하위 알림을 그룹으로 표시하지만,
이 알림이 일시적으로 <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">헤드업 알림</a>으로
나타나도록 설정할 수 있습니다. 이 기능을 사용하면 가장 최근의 하위 항목과 이에
관련된 동작에 즉시 액세스할 수 있으므로 특히 유용합니다.
</p>
<h3>이전 버전과의 호환성</h3>
<p>
Android 5.0 (API 레벨 21) 이후로, 알림 그룹과
원격 입력은 Android Wear 기기를 지원하기 위한 {@link
android.app.Notification} API의 일부였습니다. 이미 이들 API로 알림을 작성한 경우 수행할 조치는,
앱 동작이 위에 설명된 지침과 일치하는지 확인하고 {@code
setRemoteInputHistory()} 구현을
고려하는 것입니다.
</p>
<p>
이전 버전과의 호환성을 지원하기 위해,
지원 라이브러리의 {@link android.support.v4.app.NotificationCompat} 클래스로 동일한
API를 사용할 수 있으며, 이전 Android 버전에서 작동하는 알림을 작성할
수 있습니다. 핸드헬드와 태블릿에서는 요약 알림만 사용자에게 보이므로,
앱은 해당 그룹의 전체 정보 콘텐츠에 대해 받은편지함
스타일이나 이와 동등한 알림 표시를 계속 가져야 합니다. Android
Wear 기기에서는 구형 플랫폼 레벨에서도
사용자가 모든 하위 알림을 볼 수 있으므로, API 레벨에 상관없이 하위 알림을
작성해야 합니다.
</p>
<h2 id="custom"> 사용자 지정 뷰</h2>
<p>Android N부터는 알림 뷰를 사용자 지정할 수 있으며
알림 헤더, 동작 및 확장 가능한 레이아웃과 같은 시스템 장식을 계속
획득할 수 있습니다.</p>
<p>이 기능을 활성화하기 위해, Android N에서는 다음과
같은 API를 추가하여 사용자 지정 뷰의 스타일을 지정합니다.</p>
<dl>
<dt>
{@code DecoratedCustomViewStyle()}</dt>
<dd> 미디어 알림 이외의 스타일
알림.</dd>
<dt>
{@code DecoratedMediaCustomViewStyle()}</dt>
<dd> 스타일 미디어 알림.</dd>
</dl>
<p>이 새로운 API를 사용하려면, {@code setStyle()} 메서드를 호출하여,
원하는 사용자 지정 뷰 스타일에 전달합니다.</p>
<p>이 코드 조각은
{@code DecoratedCustomViewStyle()} 메서드로 사용자 지정 알림 객체를 구성하는 방법을 보여줍니다.</p>
<pre>
Notification noti = new Notification.Builder()
.setSmallIcon(R.drawable.ic_stat_player)
.setLargeIcon(albumArtBitmap))
.setCustomContentView(contentView);
.setStyle(new Notification.DecoratedCustomViewStyle())
.build();
</pre>

View File

@@ -0,0 +1,186 @@
page.title=PIP
page.keywords=preview,sdk,PIP,Picture-in-picture
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#declaring">액티비티의
PIP 지원 선언</a></li>
<li><a href="#pip_button">액티비티를 PIP로 전환</a>
</li>
<li><a href="#handling_ui">PIP에서 UI 처리</a>
</li>
<li><a href="#continuing_playback">
PIP에서 동영상 재생 지속</a></li>
<li><a href="#best">모범 사례</a></li>
</ol>
<h2>참고 항목</h2>
<ol>
<li><a href="{@docRoot}preview/features/multi-window.html">다중 창
지원</a></li>
</ol>
</div>
</div>
<p>Android N에서 Android TV 사용자는
앱 안에서 탐색할 때 화면 모서리의 고정 창에서
동영상을 볼 수 있습니다. PIP(Picture-in-picture) 모드를 사용하면
앱의 백그라운드에서 다른 액티비티를 계속하면서
고정 창에서 동영상 액티비티를 실행할 수 있습니다. PIP 창에서 사용자는 앱을 사용하는 동안 멀티태스킹이 가능하므로
생산성이 향상됩니다.</p>
<p>앱이 PIP 모드를 실행할 시기를 결정할 수 있습니다. PIP 모드로 진입하는 시기와 관련된 몇 가지
예시:</p>
<ul>
<li>사용자가 동영상에서 다른 콘텐츠를 탐색하러 이동할 때 앱이
동영상을 PIP 모드로 이동할 수 있습니다.</li>
<li>사용자가 콘텐츠 에피소드의 끝부분을 볼 때 앱이
동영상을 PIP 모드로 전환할 수 있습니다. 메인 화면은 시리즈 다음 에피소드의
홍보 또는 요약 정보를 표시합니다.</li>
<li>사용자가 동영상을 보는 동안 앱이
추가 콘텐츠를 대기열에 올릴 수 있는 방법을 제공할 수 있습니다. 메인 화면에 콘텐츠 선택 액티비티가 표시되는 동안
동영상이 PIP 모드에서 계속 재생됩니다.</li>
</ul>
<p>PIP 창은 240x135dp이고
화면 모서리 4개 중 하나에서 가장 위쪽 레이어에 표시되며, 시스템이 선택합니다. 사용자는
리모컨의 <b>Home</b> 버튼을 눌러
PIP 창을 전체 화면으로 전환하거나 PIP를 닫는 PIP 메뉴를 불러올 수 있습니다. 다른 동영상이
메인 화면에서 재생되기 시작하면 PIP 창이
자동으로 닫힙니다. 사용자가 Recents를 통해서 PIP 창을 닫을 수도 있습니다.</p>
<img src="{@docRoot}preview/images/pip-active.png" />
<p class="img-caption"><strong>그림 1.</strong> 사용자가 메인 화면에서 콘텐츠를 탐색하는 동안
화면 모서리에 표시되는 PIP 동영상.
</p>
<p>PIP는 Android N에서 사용할 수 있는 다중 창 API를 사용하여
고정된 동영상 오버레이 창을 제공합니다. 앱에 PIP를 추가하려면
PIP를 지원하는 액티비티를 등록하고 필요한 경우 액티비티를 PIP 모드로 전환해야 합니다. 또한
액티비티가 PIP 모드에 있을 때 UI 요소가 숨겨지고 동영상 재생이
계속되는지 확인해야 합니다.</p>
<h2 id="declaring">액티비티의 PIP 지원 선언</h2>
<p>기본적으로 시스템은 앱에 대해 PIP를 자동으로 지원하지 않습니다.
앱에서 PIP를 지원하려면
<code>android:supportsPictureInPicture</code>와
<code>android:resizeableActivity</code>를 <code>true</code>로 설정하여 매니페스트에서 동영상 액티비티를
등록합니다. 또한,
PIP 모드 전환 시 레이아웃 변경이 일어날 때 액티비티가 다시 시작되지 않도록
액티비티가 레이아웃 구성 변화를 처리하게 지정합니다.</p>
<pre>
&lt;activity android:name="VideoActivity"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
</pre>
<p>액티비티를 등록할 때는 PIP 모드에서
액티비티가 TV 화면의 작은 오버레이 창에 표시된다는 것을 기억하세요. 최소 UI를 포함한
동영상 재생 액티비티가 가장 좋은 사용자 경험을 제공합니다. 작은 UI 요소를 포함한
액티비티는 PIP 모드로 전환할 때
사용자가 PIP 창의 UI 요소를 상세히 볼 수 없으므로
좋은 사용자 경험을 제공하지 못할 수 있습니다.</p>
<h2 id="pip_button">액티비티를 PIP로 전환</h2>
액티비티를 PIP 모드로 전환해야 하는 경우
<code>Activity.enterPictureInPicture()</code>를 호출합니다. 다음은 사용자가 미디어 컨트롤 막대에서 전용 PIP 버튼을 선택했을 때
PIP 모드로 전환하는 예시입니다.
</p>
<pre>
&#64;Override
public void onActionClicked(Action action) {
if (action.getId() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPicture();
return;
}
...
</pre>
<p>미디어 제어 막대에 PIP 버튼을 추가하면
사용자가 동영상 재생을 제어하면서 PIP 모드로 쉽게 전환할 수 있습니다.</p>
<img src="{@docRoot}preview/images/pip-button.png" />
<p class="img-caption"><strong>그림 1.</strong> 미디어 컨트롤 막대의 PIP
버튼.</p>
<p>Android N에는 컨트롤 막대 PIP 동작을 정의하고 PIP 아이콘을 사용하는 새로운
<code>PlaybackControlsRow.PictureInPictureAction</code> 클래스가 포함되어 있습니다.
</p>
<h2 id="handling_ui">PIP에서 UI 처리</h2>
<p>액티비티가 PIP 모드로 들어가면
동영상 재생만 표시됩니다. 액티비티가 PIP 모드로 들어가기 전에 UI 요소를 제거하고
액티비티가 다시 전체 화면이 되었을 때 이 요소를 복원합니다.
필요에 따라 <code>Activity.onPictureInPictureChanged()</code> 또는
<code>Fragment.onPictureInPictureChanged()</code>을 재정의하고
UI 요소를 활성화/비활성화합니다. 예:</p>
<pre>
&#64;Override
public void onPictureInPictureChanged(boolean inPictureInPicture) {
if (inPictureInPicture) {
// Hide the controls in picture-in-picture mode.
...
} else {
// Restore the playback UI based on the playback status.
...
}
}
</pre>
<h2 id="continuing_playback">
PIP에서 동영상 재생 지속</h2>
<p>액티비티가 PIP 모드로 전환되면 시스템은
액티비티가 일시 정지된 상태에 있다고 간주하고 액티비티의 <code>onPause()</code> 메서드를 호출합니다. 동영상
재생은 일시 정지되어서는 안되며 PIP 모드로 인해 액티비티가 일시 정지되었다면
계속 재생되어야 합니다. 액티비티의
<code>onPause()</code> 메서드에서 PIP를 확인하고 적절히 재생을 처리합니다. 예:
</p>
<pre>
&#64;Override
public void onPause() {
// If called due to PIP, do not pause playback
if (inPictureInPicture()) {
// Continue playback
...
}
// If paused but not in PIP, pause playback if necessary
...
}
</pre>
<p>액티비티가 PIP 모드에서 전체 화면 모드로 전환되면,
시스템이 액티비티를 재시작하고 <code>onResume()</code> 메서드를 호출합니다.</p>
<h2 id="best">모범 사례</h2>
<p>PIP는 전체 화면 동영상을 재생하는 액티비티용입니다. 액티비티를
PIP 모드로 전환할 때는 동영상 콘텐츠만 표시하세요.
<a href="#handling_ui">PIP에서 UI 처리</a>에서 설명한 바와 같이 액티비티가 PIP 모드로 들어갈 때
추적하고 UI 요소를 숨깁니다.</p>
<p>PIP 창이 화면 모서리에 떠 있는 창으로 표시되므로
PIP 창으로 가려질 수 있는 영역에는 메인 화면에서
중요한 정보를 표시하지 말아야 합니다.</p>
<p>액티비티가 PIP 모드일 때는 기본적으로 입력 포커스를 받지 않습니다. PIP 모드에서
입력 이벤트를 수신하려면
<code>MediaSession.setMediaButtonReceiver()</code>를 사용합니다.</p>

View File

@@ -0,0 +1,124 @@
page.title=범위가 지정된 디렉터리 액세스
page.keywords=preview,sdk,scoped directory access
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#accessing">외부 저장소 디렉터리 액세스</a></li>
<li><a href="#removable">이동식 미디어의 디렉터리 액세스</a></li>
<li><a href="#best">모범 사례</a></li>
</ol>
</div>
</div>
<p>일반적으로 사진 앱과 같은 앱은
<code>Pictures</code> 디렉터리 등 외부 저장소의 특정 디렉터리에만 액세스하면 됩니다. 기존 외부 저장소 액세스 방식은
이런 유형의 앱에 대상화된 디렉터리 액세스를 쉽게
제공하지 못합니다. 예:</p>
<ul>
<li>매니페스트에서 {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
또는 {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE}를 요청하면
외부 저장소의 모든 공개 디렉터리에 액세스할 수 있습니다.
이는 앱에 필요한 것보다 과도한 액세스를 제공할 수 있습니다.</li>
<li>일반적으로,
<a href="{@docRoot}guide/topics/providers/document-provider.html">저장소
액세스 프레임워크</a>를 사용하면 시스템 UI를 통해 사용자가 디렉터리를
선택할 수 있습니다. 앱이 항상 동일한 외부 디렉터리에 액세스한다면
필요 없는 동작입니다.</li>
</ul>
<p>Android N은 일반 외부 저장소 디렉터리에 액세스하기 위한
단순화된 새로운 API를 제공합니다. </p>
<h2 id="accessing">외부 저장소 디렉터리 액세스</h2>
<p><code>StorageManager</code> 클래스를 사용하여 적절한
<code>StorageVolume</code> 인스턴스를 가져옵니다. 그 후, 해당 인스턴스의
<code>StorageVolume.createAccessIntent()</code> 메서드를 호출하여 인텐트를 생성합니다.
이 인텐트로 외부 저장소 디렉터리에 액세스합니다. 이동식 미디어 볼륨을 포함한
모든 이용 가능한 볼륨 목록을 가져오려면
<code>StorageManager.getVolumesList()</code>를 사용합니다.</p>
<p>다음 코드 조각은 기본 공유 저장소의
<code>Pictures</code> 디렉터리를 여는 방법에 대한 예시입니다.</p>
<pre>
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<p>시스템이 외부 디렉터리에 액세스 권한을 부여하고자 시도하고,
필요에 따라 단순화된 UI를 사용하는 사용자의 액세스를 확인합니다.</p>
<img src="{@docRoot}preview/images/scoped-folder-access-framed.png" srcset="{@docRoot}preview/images/scoped-folder-access-framed.png 1x,
{@docRoot}preview/images/scoped-folder-access-framed_2x.png 2x" />
<p class="img-caption"><strong>그림 1.</strong> Pictures 디렉터리에
액세스를 요청하는 애플리케이션.</p>
<p>사용자가 액세스 권한을 부여하면, 시스템이
<code>Activity.RESULT_OK</code>의 결과 코드가 포함된
<code>onActivityResult()</code> 재정의와 URI가 포함된 인텐트 데이터를 호출합니다. 제공된
URI를 사용하여 디렉터리 정보에 액세스합니다.
<a href="{@docRoot}guide/topics/providers/document-provider.html">저장소
액세스 프레임워크</a>가
반환한 URI를 사용하는 것과 유사합니다.</p>
<p>사용자가 액세스 권한을 부여하지 않으면 시스템이
<code>Activity.RESULT_CANCELED</code>의 결과 코드가 포함된
<code>onActivityResult()</code> 재정의와 null 인텐트 데이터를 호출합니다.</p>
<p class="note"><b>참고</b>: 특정 외부 디렉터리에 대한 액세스 권한을 얻으면
해당 디렉터리의 하위 디렉터리에 대한 액세스 권한도 얻게 됩니다.</p>
<h2 id="removable">이동식 미디어의 디렉터리 액세스</h2>
<p>범위가 지정된 디렉터리 액세스를 사용하여 이동식 미디어의 디렉터리에 액세스하려면
먼저 다음과 같은
{@link android.os.Environment#MEDIA_MOUNTED} 알림을 수신하는 {@link android.content.BroadcastReceiver}를 추가합니다.</p>
<pre>
&lt;receiver
android:name=".MediaMountedReceiver"
android:enabled="true"
android:exported="true" &gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MEDIA_MOUNTED" /&gt;
&lt;data android:scheme="file" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>사용자가 SD 카드 등의 이동식 미디어를 장착하면 시스템이
{@link android.os.Environment#MEDIA_MOUNTED} 알림을 보냅니다. 이 알림은
이동식 미디어 디렉터리에 액세스하는 데 사용할 수 있는 인텐트 데이터의 <code>StorageVolume</code> 객체를
제공합니다. 다음은
이동식 미디어의 <code>Pictures</code> 디렉터리에 액세스하는 예시입니다.</p>
<pre>
// BroadcastReceiver has already cached the MEDIA_MOUNTED
// notification Intent in mediaMountedIntent
StorageVolume volume = (StorageVolume)
mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<h2 id="best">모범 사례</h2>
<p>가능하면, 사용자에게 액세스 권한을 반복적으로 요청하지 않도록 외부 디렉터리 액세스 URI를
변경하지 마세요. 사용자가 액세스 권한을 부여하면 디렉터리 액세스 URI로
<code>getContentResolver().takePersistableUriPermssion()</code>를
호출합니다. 시스템이 URI를 유지하고 이후 액세스 요청에서는
<code>RESULT_OK</code>를 반환하고 사용자에게 확인 UI를
표시하지 않습니다.</p>
<p>사용자가 외부 디렉터리 액세스를 거부하면
다시 즉시 액세스를 요청하지 마세요. 액세스를 반복적으로 요청하는 것은
나쁜 사용자 경험을 제공하게 됩니다.</p>

View File

@@ -0,0 +1,744 @@
page.title=네트워크 보안 구성
page.keywords=preview,security,network
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#manifest">보안 구성 파일 추가</a></li>
<li><a href="#CustomTrust">신뢰할 수 있는 CA 사용자 지정</a>
<ol>
<li><a href="#ConfigCustom">신뢰할 수 있는 사용자 지정 CA 구성</a></li>
<li><a href="#LimitingCas">신뢰할 수 있는 CA 세트 제한</a></li>
<li><a href="#TrustingAdditionalCas">추가 CA 신뢰</a></li>
</ol>
</li>
<li><a href="#TrustingDebugCa">디버그 전용 CA</a></li>
<li><a href="#UsesCleartextTraffic">일반 텍스트 트래픽 옵트아웃</a></li>
<li><a href="#CertificatePinning">인증서 고정</a></li>
<li><a href="#ConfigInheritance">구성 상속 동작</a></li>
<li><a href="#FileFormat">구성 파일 형식</a></li>
</ol>
</div>
</div>
<p>
Android N에는 앱 코드를 수정하지 않고 앱이 안전한 선언
구성 파일에서 네트워크 보안 설정을 사용자 지정할 수 있는
네트워크 보안 구성 기능이 포함되어 있습니다. 이 설정은
특정 도메인과 특정 앱에 대해 구성할 수 있습니다. 이 기능의
핵심 기능:
</p>
<ul>
<li>
<b>사용자 지정 신뢰 앵커:</b> 앱의 보안 연결에 대해 신뢰할 수 있는 인증 기관(CA)을
사용자 지정합니다. 예를 들어,
특정한 자체 서명 인증서를 신뢰하거나
앱이 신뢰하는 공개 CA 세트를 제한합니다.
</li>
<li>
<b>디버그 전용 재정의:</b> 설치된 기반에 위험을 더하지 않고도, 앱의 보안 연결을 안전하게
디버그할 수 있습니다.
</li>
<li>
<b>일반 텍스트 트래픽 옵트아웃:</b> 일반 텍스트 트래픽을 실수로 사용하지
않도록 앱을 보호합니다.
</li>
<li>
<b>인증서 고정:</b> 앱의 안전한 연결을 특정 인증서로
제한합니다.
</li>
</ul>
<h2 id="manifest">보안 구성 파일 추가</h2>
<p>
네트워크 보안 구성 기능은 XML 파일을 사용해서
앱의 설정을 지정합니다. 앱 매니페스트에 이 파일을 가리키는 항목을
포함해야 합니다. 매니페스트에서 발췌한 다음 코드는
이 항목을 생성하는 방법을 보여줍니다.
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
...
&lt;app ...&gt;
&lt;meta-data android:name="android.security.net.config"
android:resource="@xml/network_security_config" /&gt;
...
&lt;/app&gt;
</pre>
<h2 id="CustomTrust">신뢰할 수 있는 CA 사용자 지정</h2>
<p>
앱에서 플랫폼 기본값 대신 사용자 지정 CA 세트를
신뢰하고자 할 수 있습니다. 가장 일반적인 이유는 다음과 같습니다.
</p>
<ul>
<li>사용자 지정 인증 기관(자체 서명한 인증서,
국제 기업 CA에서 발급한 인증서 등)을 포함한 호스트에 연결.
</li>
<li>모든 사전 설치된 CA 대신 신뢰할 수 있는 CA로만
CA 세트를 제한.
</li>
<li>시스템에 포함되지 않은 추가 CA 신뢰.
</li>
</ul>
<p>
기본적으로 모든 앱으로부터 안전한(예: TLS, HTTPS) 연결은 사전 설치된 시스템 CA를 신뢰하고,
API 레벨 23(Android M)
이하를 대상으로 하는 앱도 사용자가 추가한 CA 스토어를 기본적으로 신뢰합니다. 앱은
{@code base-config}(앱
전체 사용자 지정) 또는 {@code domain-config}(도메인별
사용자 지정)를 사용하여 연결을 사용자 지정할 수 있습니다.
</p>
<h3 id="ConfigCustom">사용자 지정 CA 구성</h3>
<p>
자체 서명된
인증서를 사용하는 호스트나 신뢰할 수 있는 비공개 CA(예: 사내 CA)에서 발급한 SSL 인증서를 사용하는 호스트에
연결할 경우를 가정합시다.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
자체 서명된 인증서 또는 비공개 CA 인증서를 PEM 또는 DER 형식으로
{@code res/raw/my_ca}에 추가합니다.
</p>
<h3 id="LimitingCas">신뢰할 수 있는 CA 세트 제한</h3>
<p>
앱에서 시스템이 신뢰하는 CA 중 일부를 신뢰하지 않으려면, 대신
신뢰할 CA 세트를 줄여서 지정할 수 있습니다. 이 방법은
다른 CA에서 발급된 허위 인증서로부터 앱을 보호해줍니다.
</p>
<p>
신뢰할 수 있는 CA 세트를 제한하는 구성은 특정 도메인에서 <a href="#TrustingACustomCa">사용자 지정 CA를 신뢰</a>하는 것과 비슷하지만
여러 CA가 리소스에서 제공된다는 점이 다릅니다.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;domain includeSubdomains="true"&gt;cdn.example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/trusted_roots"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
신뢰할 수 있는 CA를 PEM 또는 DER 형식으로 {@code res/raw/trusted_roots}에 추가합니다.
PEM 형식을 사용할 경우 파일에 PEM 데이터<em>만</em> 포함되고
다른 추가 텍스트가 포함되어서는 안 됩니다. 또한 한 개가 아니라 여러 개의
<a href="#certificates"><code>&lt;certificates&gt;</code></a>
요소를 제공할 수 있습니다.
</p>
<h3 id="TrustingAdditionalCas">
추가 CA 신뢰
</h3>
<p>
앱에서 시스템이 신뢰하지 않는 CA를 신뢰하고자 한다면,
이는 시스템에 해당 CA가 아직 포함되지 않았거나 CA가 Android 시스템에 포함되기 위한
요구사항을 충족하지 못했기 때문일 수 있습니다.
구성에 대해 여러 개의 인증서 소스를 지정하면
신뢰할 수 있는 CA를 추가할 수 있습니다.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/extracas"/&gt;
&lt;certificates src="system"/&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="TrustingDebugCa">디버그용 CA 구성</h2>
<p>
HTTPS로 연결되는 앱을 디버그할 때
프로덕션 서버에 대해 SSL 인증서가 없는 로컬 개발 서버에
연결하고자 할 수도 있습니다. 앱 코드를 수정하지 않고
이 기능을 지원하려면
{@code debug-overrides}를 사용하여<i><a href="{@docRoot}guide/topics/manifest/application-element.html#debug"></i>android:debuggable</a>
이 {@code true}일 때만 신뢰할 수 있는 디버그 전용 CA를
지정할 수 있습니다. 일반적으로 IDE와 빌드 도구는 비 릴리스 빌드에 대해
이 플래그를 자동으로 설정합니다.
</p>
<p>
보안 예방 조치로 앱 스토어에서
디버그 가능으로 표시된 앱은 허용하지 않기 때문에
일반적인 조건 코드보다 안전합니다.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/debug_cas"/&gt;
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="UsesCleartextTraffic">일반 텍스트 트래픽 옵트아웃</h2>
<p>
보안 연결만 사용하여 대상에 연결하는 애플리케이션은 해당
대상에 대해 일반 텍스트를 지원하는 기능(HTTPS 대신 암호화되지 않은 HTTP
사용)을 옵트아웃할 수 있습니다. 이 옵션은
백엔드 서버 등의 외부 소스가 제공하는 URL의 변경 사항으로 인해
앱에서 우연히 회귀가 일어나지 않도록 예방합니다.
자세한 내용은 {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted
NetworkSecurityPolicy.isCleartextTrafficPermitted()}를 참조하세요.
</p>
<p>
예를 들어, 앱에서 적대적 네트워크로부터 민감한 트래픽을 보호하기 위해 {@code
secure.example.com}에 대한 연결은 항상 HTTPS를 통해서만 수행되도록
할 수 있습니다.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config usesCleartextTraffic="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="CertificatePinning">인증서 고정</h2>
<p>
일반적으로 앱은 모든 사전 설치된 CA를 신뢰합니다. 이러한 CA에서
허위 인증서를 발급한다면 앱이 MiTM
공격에 노출될 위험이 있습니다. 일부 앱은 신뢰하는 CA 세트를 제한하거나
인증서를 고정하는 방식으로 허용하는 인증서 세트를 제한합니다.
</p>
<p>
인증서 고정은
공개 키 해시(X.509인증서의 SubjectPublicKeyInfo)로 인증서 세트를 제공하는 방식으로 수행됩니다. 그러면 인증서 체인에
하나 이상의 고정된 공개 키가 있어야만
인증서 체인이 유효합니다.
</p>
<p>
인증서 고정을 사용할 때는 언제나 백업 키를 포함해야
새로운 키로 강제 전환하거나 CA를 변경할 경우(
CA 인증서 또는 해당 CA의 중간 CA에 고정할 경우)
앱 연결이 영향을 받지 않습니다. 그렇지 않으면
연결을 복구하기 위해 앱에 업데이트를 내보내야 합니다.
</p>
<p>
또한, 고정을 수행하지 않게 되면 핀 만료 시간을
설정할 수 있습니다. 이는 업데이트되지 않은 앱에서
연결 문제를 예방해 줍니다. 그러나 핀에 만료 시간을 설정하면
고정 우회가 가능할 수도 있습니다.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;pin-set expiration="2018-01-01"&gt;
&lt;pin digest="SHA-256"&gt;7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=&lt;/pin&gt;
&lt;!-- backup pin --&gt
&lt;pin digest="SHA-256"&gt;fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=&lt;/pin&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="ConfigInheritance">구성 상속 동작</h2>
<p>
특정 구성에서 설정되지 않은 값을 상속합니다. 이 동작은 구성 파일을 읽을 수 있게 유지하면서도
더욱 복잡한 구성이 가능합니다.
</p>
<p>
특정 항목에 값이 설정되지 않았다면
그 다음으로 일반적인 항목의 값이 사용됩니다. {@code domain-config}에서 설정되지 않은 값은
중첩될 경우 상위 {@code domain-config}에서 가져오고 그렇지 않을 경우 {@code
base-config}에서 가져옵니다. {@code base-config}에서 설정되지 않은 값은
플랫폼 기본 값을 사용합니다.
</p>
<p>
예를 들어, {@code
example.com}의 하위 도메인에 대한 모든 연결은 사용자 지정 CA 세트를 사용해야 합니다. 또한, 이러한 도메인에 대한 일반 텍스트 트래픽은
{@code
secure.example.com}에 연결할 때를 <em>제외</em>하고 허용됩니다. {@code example.com} 구성 내부에 {@code
secure.example.com} 구성을 중첩하면
{@code trust-anchors}를 복제하지 않아도 됩니다.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;domain-config cleartextTrafficPermitted="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="FileFormat">구성 파일 형식</h2>
<p>
네트워크 보안 구성 기능은 XML 파일 형식을 사용합니다.
파일의 전반적 구조는 다음 코드 샘플에 나타나 있습니다.
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;domain-config&gt;
&lt;domain&gt;android.com&lt;/domain&gt;
...
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;pin-set&gt;
&lt;pin digest="..."&gt;...&lt;/pin&gt;
...
&lt;/pin-set&gt;
&lt;/domain-config&gt;
...
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
<p>
다음 섹션에서는 이 파일 형식의 구문과
기타 세부 정보를 설명합니다.
</p>
<h3 id="network-security-config">
&lt;network-security-config&gt;
</h3>
<dl class="xml">
<dt>
다음을 포함할 수 있습니다.
</dt>
<dd>
<code><a href="#base-config">&lt;base-config&gt;</a></code> 0 또는 1개<br>
<code><a href=
"#domain-config">&lt;domain-config&gt;</a></code> 임의의 개수<br>
<code><a href="#debug-overrides">&lt;debug-overrides&gt;</a></code> 0 또는 1개
</dd>
</dl>
<h3 id="base-config">
&lt;base-config&gt;
</h3>
<dl class="xml">
<dt>
구문:
</dt>
</dl>
<pre class="stx">
&lt;base-config <a href=
"#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/base-config&gt;
</pre>
<dl class="xml">
<dt>
다음을 포함할 수 있습니다.
</dt>
<dd>
<code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
설명:
</dt>
<dd>
대상이
<a href="#domain-config"><code>domain-config</code></a>에 포함되지 않는 모든 연결에서 사용하는 기본 구성.
<p>
설정되지 않은 값은 플랫폼 기본값을 사용합니다. API 레벨 24 이상을 대상으로 하는
앱의 기본 구성:
</p>
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
API 레벨 23 이하를 대상으로 하는 앱의 기본 구성:
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;certificates src="user" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
</dd>
</dl>
<h3 id="domain-config">&lt;domain-config&gt;</h3>
<dl class="xml">
<dt>구문:</dt>
<dd>
<pre class="stx">&lt;domain-config <a href="#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/domain-config&gt;</pre>
</dd>
<dt>다음을 포함할 수 있습니다.</dt>
<dd>
<code><a href="#domain">&lt;domain&gt;</a></code> 1개 이상
<br/><code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code> 0 또는 1개
<br/><code><a href="#pin-set">&lt;pin-set&gt;</code></a> 0 또는 1개
<br/>중첩된 <code>&lt;domain-config&gt;</code> 임의의 개수</dd>
<dt>설명</dt>
<dd>{@code domain} 요소에서 정의한 특정 대상에 대한 연결에 사용되는 구성.
<p>여러 {@code domain-config} 요소에서 대상을 포함하는 경우 가장 구체적인(긴)
일치 도메인이 포함된 구성이 사용됩니다.</p></dd>
</dl>
<h3 id="domain">&lt;domain&gt;</h3>
<dl class="xml">
<dt>
구문:
</dt>
<dd>
<pre class="stx">
&lt;domain includeSubdomains=["true" | "false"]&gt;example.com&lt;/domain&gt;
</pre>
</dd>
<dt>
특성:
</dt>
<dd>
<dl class="attr">
<dt>
{@code includeSubdomains}
</dt>
<dd>
{@code "true"}인 경우 이 도메인 규칙이 도메인 및 모든 하위 도메인(하위 도메인의 하위 도메인 포함)과
일치합니다. 그렇지 않을 경우 이 규칙은
정확한 일치에만 적용됩니다.
</dd>
</dl>
</dd>
<dt>
설명:
</dt>
</dl>
<h3 id="debug-overrides">&lt;debug-overrides&gt;</h3>
<dl class="xml">
<dt>
구문:
</dt>
<dd>
<pre class="stx">
&lt;debug-overrides&gt;
...
&lt;/debug-overrides&gt;
</pre>
</dd>
<dt>
다음을 포함할 수 있습니다.
</dt>
<dd>
<code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code> 0 또는 1개
</dd>
<dt>
설명:
</dt>
<dd>
<a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
가 {@code "true"}일 때 재정의를 적용합니다. 일반적으로
IDE와 빌드 도구에서 생성한 비 릴리스 빌드에 해당합니다. {@code
debug-overrides}에서 지정된 신뢰 앵커를 모든 다른 구성에 추가하고,
서버의 인증서 체인이 이러한
디버그 전용 신뢰 앵커 중 하나를 사용하면 고정을 수행하지 않습니다. <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
이 {@code "false"}이면 이 섹션은 완전히 무시합니다.
</dd>
</dl>
<h3 id="trust-anchors">&lt;trust-anchors&gt;</h3>
<dl class="xml">
<dt>
구문:
</dt>
<dd>
<pre class="stx">
&lt;trust-anchors&gt;
...
&lt;/trust-anchors&gt;
</pre>
</dd>
<dt>
다음을 포함할 수 있습니다.
</dt>
<dd>
<code><a href="#certificates">&lt;certificates&gt;</a></code> 임의의 개수
</dd>
<dt>
설명:
</dt>
<dd>
보안 연결에 대한 신뢰 앵커 세트.
</dd>
</dl>
<h3 id="certificates">&lt;certificates&gt;</h3>
<dl class="xml">
<dt>구문:</dt>
<dd><pre class="stx">&lt;certificates src=["system" | "user" | "<i>raw resource</i>"]
overridePins=["true" | "false"] /&gt;
</pre></dd>
<dt>설명:</dt>
<dd>{@code trust-anchors} 요소에 대한 X.509 인증서 세트.</dd>
<dt>특성:</dt>
<dd><dl class="attr">
<dt>{@code src}</dt>
<dd>
CA 인증서 소스는 다음 중 하나가 될 수 있습니다.
<ul>
<li>X.509 인증서를 포함한 파일을 가리키는 원시 리소스 ID.
인증서는 DER 또는 PEM 형식으로 암호화해야 합니다. PEM 인증서의 경우,
파일에는 코멘트와 같은 PEM이 아닌 추가 데이터가
포함되어서는 <em>안 됩니다</em>.
</li>
<li>사전 설치된 시스템 CA 인증서의 {@code "system"}
</li>
<li>사용자가 추가한 CA 인증서의 {@code "user"}
</li>
</ul>
</dd>
<dt>{@code overridePins}</dt>
<dd>
<p>
이 소스의 CA가 인증서 고정을 우회할지 지정합니다. {@code
"true"}이고 인증서 체인이 이 소스의 CA 중 하나를 통해 묶일 경우
고정을 수행하지 않습니다. 디버그 CA 또는
사용자가 앱의 보안 트래픽을 MiTM하도록 지원할 때 유용합니다.
</p>
<p>
{@code debug-overrides}
요소에서 지정되지 않은 경우 기본값은 {@code "false"}입니다. 지정된 경우 기본값은 {@code "true"}입니다.
</p>
</dd>
</dl>
</dd>
<h3 id="pin-set">&lt;pin-set&gt;</h3>
<dl class="xml">
<dt>
구문:
</dt>
<dd>
<pre class="stx">
&lt;pin-set expiration="date"&gt;
...
&lt;/pin-set&gt;
</pre>
</dd>
<dt>
다음을 포함할 수 있습니다.
</dt>
<dd>
<code><a href="#pin">&lt;pin&gt;</a></code> 임의의 개수
</dd>
<dt>
설명:
</dt>
<dd>
공개 키 핀 세트. 신뢰할 수 있는 보안 연결은
신뢰 체인의 공개 키 중 하나가 핀 세트에 포함되어야 합니다. 핀 형식은
<code><a href="#pin">&lt;pin&gt;</a></code>를 참조하세요.
</dd>
<dt>
특성:
</dt>
<dd>
<dl class="attr">
<dt>
{@code expiration}
</dt>
<dd>
핀 만료 당일과 그 이후의 {@code yyyy-MM-dd} 형식 날짜로,
핀이 비활성화됩니다. 이 특성이 설정되지 않으면
핀이 만료되지 않습니다.
<p>
만료는 사용자가 앱 업데이트를 비활성화하는 등과 같이
핀 세트가 업데이트되지 않는 앱에서
연결 문제를 예방하는 데 유용합니다.
</p>
</dd>
</dl>
</dd>
</dl>
<h3 id="pin">&lt;pin&gt;</h3>
<dl class="xml">
<dt>
구문:
</dt>
<dd>
<pre class="stx">
&lt;pin digest=["SHA-256"]&gt;base64 encoded digest of X.509
SubjectPublicKeyInfo (SPKI)&lt;/pin&gt;
</pre>
</dd>
<dt>
특성:
</dt>
<dd>
<dl class="attr">
<dt>
{@code digest}
</dt>
<dd>
핀을 생성하는 데 사용된 다이제스트 알고리즘. 현재
{@code "SHA-256"}만 지원됩니다.
</dd>
</dl>
</dd>
</dl>

View File

@@ -0,0 +1,120 @@
page.title=TV 녹화
page.keywords=preview,sdk,tv,recording
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>이 문서의 내용</h2>
<ol>
<li><a href="#supporting">녹화 지원 나타내기</a></li>
<li><a href="#recording">세션 녹화</a></li>
<li><a href="#errors">녹화 오류 처리</a></li>
<li><a href="#sessions">녹화된 세션 관리</a></li>
<li><a href="#best">모범 사례</a></li>
</ol>
</div>
</div>
<p>TV 입력 서비스를 이용하면
타임 시프팅 API를 통해 채널 재생을 일시 정지했다가 다시 시작할 수 있습니다. Android N에서는 사용자가 여러 개의 녹화된 세션을 저장할 수 있도록 함으로써
타임 시프팅을 확장합니다.</p>
<p>사용자는 미리 녹화를 예약하거나 프로그램을 보면서 녹화를
시작할 수 있습니다. 시스템이 녹화물을 저장하면 사용자는 시스템 TV 앱을 사용하여
녹화물을 탐색, 관리, 재생할 수 있습니다.</p>
<p>TV 입력 서비스에 녹화 기능을 제공하고 싶다면
앱이 녹화를 지원한다는 것을 시스템에 나타내고
프로그램을 녹화하는 기능을 구현하고, 녹화 중 발생하는 오류를 처리 및 전달하고,
녹화된 세션을 관리해야 합니다.</p>
<h2 id="supporting">녹화 지원 나타내기</h2>
<p>TV 입력 서비스가 녹화를 지원한다는 것을 시스템에 알리려면
다음 절차를 따르세요.</p>
<ol>
<li><code>TvInputService.onCreate()</code> 메서드에서 <code>TvInputInfo.Builder</code>
클래스를 사용하여
<code>TvInputInfo</code> 객체를 생성합니다.</li>
<li>새로운 <code>TvInputInfo</code> 객체를 생성할 때 <code>build()</code> 를 호출하기 전에
<code>setCanRecord(true)</code>를 호출하여
서비스가 녹화를 지원한다는 것을 나타냅니다.</li>
<li>
<code>TvInputService.updateTvInputInfo()</code>를 호출하여 시스템에 <code>TvInputInfo</code> 객체를 등록합니다.</li>
</ol>
<h2 id="recording">세션 녹화</h2>
<p>TV 입력 서비스가 녹화 기능을 지원하도록 등록한 후,
시스템은 앱의 녹화 구현에 액세스해야 할 때
<code>TvInputService.onCreateRecordingSession()</code>을 호출합니다.
자체적인
<code>TvInputService.RecordingSession</code> 서브클래스를 구현하고
<code>onCreateRecordingSession()</code> 콜백이
실행되면 이를 반환합니다. 이 서브클래스는 정확한 채널 데이터로 전환하고,
요청된 데이터를 녹화하고, 녹화 상태와 오류를 시스템에
전송하는 역할을 담당합니다.</p>
<p>시스템이 <code>RecordingSession.onTune()</code>을 호출하면
채널 URI에 전달되고, URI가 지정하는 채널에 맞춰 조정됩니다.
<code>notifyTuned()</code>를 호출해서 앱이 원하는 채널에 맞춰졌음을 시스템에 알리거나
앱이 적절한 채널에 맞출 수 없으면
<code>notifyError()</code>를 호출합니다.</p>
<p>이어서 시스템이 <code>RecordingSession.onStartRecording()</code>
콜백을 호출합니다. 앱이 즉시 녹화를 시작해야 합니다. 시스템이 이 콜백을 호출하면,
녹화될 프로그램에 관한 정보가 포함된 URI를 제공할 수 있습니다.
녹화가 완료되면 이
데이터를 <code>RecordedPrograms</code> 데이터 테이블에 복사해야 합니다.</p>
<p>마지막으로 시스템이 <code>RecordingSession.onStopRecording()</code>을 호출합니다.
이 시점에서 앱이 즉시 녹화를 중단해야 합니다. 또한,
<code>RecordedPrograms</code> 테이블에서 항목을 생성해야 합니다. 이 항목에는
<code>RecordedPrograms.COLUMN_RECORDING_DATA_URI</code> 열의 녹화된 세션 데이터 URI,
최초
<code>onStartRecording()</code> 호출에서 시스템이 제공한 프로그램 정보가 포함됩니다.
</p>
<p><code>RecordedPrograms</code> 테이블에 액세스하는 자세한 방법은
<a href="#sessions">녹화된 세션 관리</a>를 참조하세요.</p>
<h2 id="errors">녹화 오류 처리</h2>
<p>녹화 중에 오류가 발생해서 녹화된 데이터 렌더링을 사용할 수 없을 경우,
<code>RecordingSession.notifyError()</code>를 호출하여 시스템에 알립니다.
마찬가지로 녹화 세션이 생성된 이후 <code>notifyError()</code>를 호출하여
앱이 더 이상 세션을 녹화하지 못한다는 것을 시스템에 알릴 수 있습니다.</p>
<p>녹화 중에 오류가 발생했지만
사용자에게 재생 가능한 부분 녹화물을 제공하고 싶다면
<code>RecordingSession.notifyRecordingStopped()</code>를 호출하여 시스템이
부분 세션을 사용할 수 있게 합니다.</p>
<h2 id="sessions">녹화된 세션 관리</h2>
<p>시스템은 <code>TvContract.RecordedPrograms</code>
콘텐츠 제공자 테이블에 모든 녹화 가능한 채널 앱에서 녹화된
모든 세션에 관한 정보를 보관합니다. 이 정보는
<code>RecordedPrograms.Uri</code> 콘텐츠 URI를 통해 액세스할 수 있습니다. 콘텐츠 제공자 API를 사용하여
이 테이블의 항목을 읽고, 추가하고, 삭제합니다.</p>
<p>콘텐츠 제공자 데이터에 관한 자세한 정보는
<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
콘텐츠 제공자 기본 정보</a>를 참조하세요.</p>
<h2 id="best">모범 사례</h2>
<p>TV 기기는 저장소가 제한될 수 있으므로
녹화된 세션을 저장할 저장소를 할당할 때는 신중히 판단하세요. 녹화된 세션을 저장할 공간이 부족할 때는
<code>RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)</code>를 사용하세요.
</p>
<p>사용자가 녹화를 시작하면 최대한 빨리 데이터 녹화를
시작해야 합니다. 이를 용이하게 하려면
시스템이
<code>onCreateRecordingSession()</code> 콜백을 호출할 때 저장소 액세스 및 할당 등과 같이 선행 시간이 많이 걸리는 작업을 완료합니다. 이렇게 하면
<code>onStartRecording()</code> 콜백이
실행될 때 즉시 녹화를 시작할 수 있습니다.</p>

View File

@@ -0,0 +1,120 @@
page.title=Android N Developer Preview
page.tags="preview","developer"
meta.tags="프리뷰", "android"
fullpage=true
forcelocalnav=true
header.hide=1
footer.hide=1
@jd:body
<script>
$(document).ready(function() {
if (useUpdatedTemplates) {
$("#useUpdatedTemplates").css("display","block");
} else {
$("#useOldTemplates").css("display","block");
}
})
</script>
<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
<div class="wrap" style="max-width:1100px;margin-top:0">
<div class="cols dac-hero-content" style="padding-bottom:1em;">
<div class="col-7of16 col-push-9of16" style="padding-left:2em">
<h1 class="dac-hero-title">Android N Developer Preview</h1>
<p class="dac-hero-description">
Android N을 맞이할 준비를 하세요!
Nexus와 다른 기기에서 <strong>앱을 테스트</strong>하세요. 새로운 시스템
동작을 지원하여 <strong>전력과 메모리를 절약</strong>하세요.
<strong>다중 창 UI</strong>,
<strong>직접 회신 알림</strong> 등으로 앱을 확장하세요.
</p>
<a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
<span class="dac-sprite dac-auto-chevron"></span>
시작하기
</a><!--<br>
<a class="dac-hero-cta" href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron"></span>
Update to Android N (final SDK)
</a><br>-->
</div>
<div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
<img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
{@docRoot}images/home/n-preview-hero_2x.png 2x">
</div>
</div>
<div class="dac-section dac-small">
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/resources"
data-cardSizes="6x2"
data-maxResults="6"></div>
</div>
</div>
</section>
<div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
<div class="wrap dac-offset-parent">
<a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
<i class="dac-sprite dac-arrow-down-gray"></i>
</a>
<ul class="dac-actions">
<li class="dac-action">
<a class="dac-action-link" href="https://developer.android.com/preview/bug">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
문제 보고
</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/support.html">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
릴리스 노트 보기
</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/dev-community">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
개발자 커뮤니티 가입
</a>
</li>
</ul>
</div><!-- end .wrap -->
</div><!-- end .dac-actions -->
<div id="useOldTemplates" style="display:none;color:black" class="actions-bar dac-expand dac-invert">
<div class="wrap dac-offset-parent">
<div class="actions">
<div><a href="https://developer.android.com/preview/bug">
<span class="dac-sprite dac-auto-chevron-large"></span>
문제 보고
</a></div>
<div><a href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron-large"></span>
릴리스 노트 보기
</a></div>
<div><a href="{@docRoot}preview/dev-community">
<span class="dac-sprite dac-auto-chevron-large"></span>
개발자 커뮤니티 가입
</a></div>
</div><!-- end .actions -->
</div><!-- end .wrap -->
</div>
<section class="dac-section dac-light"><div class="wrap">
<h1 class="dac-section-title">리소스</h1>
<div class="dac-section-subtitle">
앱을 Android N에서 사용할 수 있도록 준비하는 데 유용한 중요 정보입니다.
</div>
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
data-items-per-page="6"
data-maxResults="15"
data-initial-results="6"></div>
</div>
</section>

View File

@@ -0,0 +1,183 @@
page.title=Java 8 언어 기능
page.keywords="android N", "Java 8", "Jack"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li>
<a href="#supported-features">지원되는 Java 8 언어 기능 및 API</a>
</li>
<li>
<a href="#configuration">Java 8 기능 및 Jack 툴체인 활성화</a>
</li>
</ol>
</div>
</div>
<p>Android N은 Java 8 언어 기능을 지원합니다.
Java 8 언어 기능은 Android N을 대상으로 하는 앱을 개발할 때 사용할 수 있습니다.
이 페이지에서는 Android N Preview에서 지원되는 새로운 언어 기능과,
프로젝트를 적절히 설정하여 언어 기능을 사용하는 방법,
발생할 수도 있는 알려진 문제를 설명합니다.
</p>
<p>이 기능을 사용하려면 Android
Studio 2.1(프리뷰)와 Android N Preview SDK를 다운로드하고 설정해야 합니다. 여기에는 필수
Jack 툴체인과 업데이트된 Gradle용 Android 플러그인이 포함됩니다. 아직
Android N Preview SDK를 설치하지 않았다면 <a href="{@docRoot}preview/setup-sdk.html">Android N용 개발 설정</a>을 참조하세요.</p>
<p class="note">
<strong>참고:</strong> 새로운 Java 8 언어 기능은
Android N 플랫폼을 대상으로 하는 앱 개발에 필요한 요구 사항은 아닙니다.
Java 8 언어 기능으로 코드를 작성하고 싶지 않다면,
프로젝트의 소스와 대상 호환성 값을 Java 7로 설정할 수 있지만
Android N 플랫폼용으로 구축하려면 JDK 8로 컴파일해야 합니다.
</p>
<h2 id="supported-features">
지원되는 Java 8 언어 기능 및 API
</h2>
<p>
Android는 현재 모든 Java 8 언어 기능을 지원하지 않습니다. 그러나 현재 다음 기능은
Android N Preview를 대상으로 하는
앱을 개발할 때 이용할 수 있습니다.
</p>
<ul>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html">기본
및 정적 인터페이스 메서드</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html">
람다 식</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html">반복 가능한
주석</a>
</li>
</ul>
<p>
또한, 다음 Java 8 언어 기능 API를 사용할 수 있습니다.
</p>
<ul>
<li>Reflection 및 언어 관련 API:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.lang.FunctionalInterface}
</li>
<li>{@code java.lang.annotation.Repeatable}
</li>
<li>{@code java.lang.reflect.Method.isDefault()}
</li>
<li>반복 가능한 주석과 관련된 Reflection API
예: {@code AnnotatedElement.getAnnotationsByType(Class)}
</li>
</ul>
</li>
<li>Utility API:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.util.function}
</li>
</ul>
</li>
</ul>
<p class="note">
<strong>참고:</strong> Android N은 익명 클래스에 대한 람다 식의 구현을
기반으로 합니다. 이 방식을 사용하면
이전 버전과 호환되고 이전 버전의 Android에서 실행할 수 있습니다.
이전 버전에서 람다 식을 테스트하려면 {@code
build.gradle} 파일에서 {@code compileSdkVersion}과 {@code
targetSdkVersion}을 23 이하로 설정하십시오.
</p>
<h2 id="configuration">
Java 8 기능 및 Jack 툴체인 활성화
</h2>
<p>
새로운 Java 8 언어 기능을 사용하려면
새로운 <a class="external-link" href="https://source.android.com/source/jack.html">Jack 툴체인</a>을 사용해야 합니다. 이 새로운
Android 툴체인은 Java 언어 소스를 Android에서 읽을 수 있는 Dex
바이트코드로 컴파일하고, 자체 {@code .jack} 라이브러리 형식이 있으며, 단일 도구로는 가장 많은 툴체인
기능(리패키징, 축소, 난독화, 멀티덱스)을
제공합니다.
</p>
<p>다음은 Android DEX 파일을 빌드하는 데 사용하는 2개의 툴체인을 비교한 것입니다.</p>
<ul>
<li>레거시 javac 툴체인:<br>
<b>javac</b> ({@code .java} --&gt; {@code .class}) --&gt; <b>dx</b> ({@code
.class} --&gt; {@code .dex})
</li>
<li>새로운 Jack 툴체인:<br>
<b>Jack</b> ({@code .java} --&gt; {@code .jack} --&gt; {@code .dex})
</li>
</ul>
<h3>
Gradle 구성
</h3>
<p>
프로젝트에서 Java 8 언어 기능과 Jack을 활성화하려면
모듈별 {@code build.gradle} 파일에 다음을 입력합니다.
</p>
<pre>
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
</pre>
<h3>
알려진 문제
</h3>
<p>
Android Studio 2.0(베타)에 도입된 Instant Run은
현재 Jack과 호환되며 새로운 툴체인을 사용하는 동안 비활성화됩니다.
</p>
<p>Jack이 앱을 컴파일할 때 중간 클래스 파일을 생성하지 않으므로
이런 파일에 의존하는 도구는 현재 Jack과 호환되지 않습니다. 이러한 도구의 예시는
다음과 같습니다.</p>
<ul>
<li>클래스 파일에 적용되는 Lint 탐지기
</li>
<li>앱의 클래스 파일이 필요한 도구와 라이브러리(예: JaCoCo
및 Mockito)</li>
</ul>
<p>Jack을 사용하는 동안 다른 문제를 발견하면 <a href="http://tools.android.com/filing-bugs">버그를 보고해주세요</a>.</p>

View File

@@ -0,0 +1,440 @@
page.title=프로그램 개요
page.metaDescription=앱에서 차기 버전의 Android를 사용할 수 있도록 준비하세요.
page.image=images/cards/card-n-overview_2x.png
meta.tags="프리뷰", "developer", "android"
page.tags="preview", "developer", "android"
@jd:body
<!--
<div class="cols" style=
"background-color:#f2daf5; padding: 5px 0;margin-bottom:1em; text-align:center;">
<h3>
Developer Preview 3 is now available
</h3>
<p>Includes final SDK and near-final system images</p>
<div style="margin:auto 1em">
<ul class="dac-section-links">
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-notes">
<span class="dac-sprite dac-auto-chevron"></span>
Read the Notes</a>
</li>
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-get">
<span class="dac-sprite dac-auto-chevron"></span>
Get the Update</a>
</li>
<li class="dac-section-link">
<a href="https://code.google.com/p/android-developer-preview/">
<span class="dac-sprite dac-auto-chevron"></span>
Report Issues</a>
</li>
</ul>
</div>
</div>
-->
<p>
<strong>Android N Developer Preview</strong>에 오신 것을 환영합니다. 이 프로그램은
차기 버전의 Android에 대해 앱을 테스트하고 최적화하는 데 필요한
모든 것을 제공합니다. 이 프로그램은 무료이고,
N Developer Preview 도구를 다운로드하면 바로 시작할 수 있습니다.
</p>
<div style="background-color:#eceff1;padding:1em;">
<div class="wrap">
<div class="cols">
<div class="col-4of12">
<h5>
하드웨어 및 에뮬레이터 이미지
</h5>
<p>
다양한 기기 또는 에뮬레이터에서 앱을 실행하고 테스트하세요.
</p>
</div>
<div class="col-4of12">
<h5>
최신 플랫폼 코드
</h5>
<p>
Preview 동안 월별 업데이트를 제공할 예정이며 따라서 여러분은 항상 최신 플랫폼 변경에 대해 테스트할 수 있습니다.
</p>
</div>
<div class="col-4of12">
<h5>
개발자 문제의 우선순위
</h5>
<p>
Google에서는 처음 몇 주 동안 개발자가 보고한 문제에 우선 순위를 부여할 예정이므로,
가능한 빨리 테스트하고 피드백을 보내 주세요.
</p>
</div>
</div>
<div class="cols">
<div class="col-4of12">
<h5>
새로운 동작 및 기능
</h5>
<p>
새로운 플랫폼 동작을 지원하고 새로운 기능으로 개발하려면 작업을 일찍 시작하세요.
</p>
</div>
<div class="col-4of12">
<h5>
업데이트를 OTA로 전달
</h5>
<p>
Android 베타 프로그램을 통해 모든 지원되는 기기에서 매끄럽게 무선으로 업데이트합니다
. 플래시가 필요없습니다.
</p>
</div>
<div class="col-4of12">
<h5>
피드백 및 지원
</h5>
<p>
<a href="{@docRoot}preview/bug">Issue Tracker</a>를 사용하여 문제를 보고하고 피드백을 보내 주세요.
<a href="{@docRoot}preview/dev-community">N&nbsp;개발자 커뮤니티</a>에서
다른 개발자와 연락하세요.
</p>
</div>
</div>
</div>
</div>
<!--
<p>New in the Android N Developer Preview: </p>
<ul>
<li> Accompanying Android Beta Program for consumers, starting later in the preview</li>
<li> More supported devices, including devices from OEM partners</li>
<li> Seamless OTAs for your devices, from initial release to final N release without flashing</li>
</ul>
-->
<h2 id="timeline">일정 및 업데이트</h2>
<img src="{@docRoot}images/n-preview-updates_2x.png">
<p>
N Developer Preview는 2016년 3월 9일부터 2016년 3분기로 예정된
AOSP 및 OEM에 Android N 최종 공개 릴리스까지 진행됩니다.
</p>
<p>
중요 개발 마일스톤에서 여러분의 개발과 테스트 환경에 대한
업데이트를 제공합니다. 일반적으로는 매월(4~6주
간격) 업데이트를 제공할 예정입니다. 마일스톤은 다음과 같습니다.
</p>
<ul>
<li><strong><a href="{@docRoot}preview/support.html">Preview 1</a></strong>(최초 릴리스, 알파)</li>
<li><strong>Preview 2</strong>(증분 업데이트, 베타)</li>
<li><strong>Preview 3</strong>(증분 업데이트, 베타)</li>
<li><strong>Preview 4</strong>(최종 API 및 공식 SDK, Play 게시)</li>
<li><strong>Preview 5</strong>(최종 테스트를 위한 거의 최종 시스템 이미지)</li>
<li>AOSP 및 에코시스템에 <strong>최종 릴리스</strong></li>
</ul>
<p>
각 업데이트에는 SDK 도구, 프리뷰 시스템, 이미지, 에뮬레이터, 참조 문서,
API 차이 등이 포함됩니다.
</p>
<p>
<strong>첫 3단계 프리뷰 마일스톤</strong>은 현재 앱의 호환성 문제를 파악하고
새 플랫폼에 필요한 마이그레이션이나 주요 작업을
계획하는 데 도움이 되는<strong>조기 테스트 및 개발 환경</strong>을 제공합니다.
이는 기능과 API, 파일 호환성 문제에 대한 피드백을 제공하는
우선순위 기간입니다.
&mdash;이러한 모든 경우에 <a href="{@docRoot}preview/bug">Issue
Tracker</a>를 사용하세요. 업데이트 과정에서 일부 API가 변경될 수 있습니다.
</p>
<p>
<strong>프리뷰 4 및 5</strong>에서 개발에 사용할 <strong>최종
N API 및 SDK</strong>와 최종 버전에 가까운 시스템 이미지에 대한 액세스를 제공하고,
시스템 동작과 기능을 테스트할 수 있습니다. 이번에 Android N은 표준 API
레벨을 제공합니다. 레거시 앱의 최종 호환성 테스트를 시작하고
N API 또는 기능을 사용하는 새 코드를 개선할 수 있습니다.
</p>
<p>
또한 프리뷰 4에서 시작하면 Android 베타 프로그램에 옵트인된 소비자 기기와 같이
공식 API 레벨에서 Android N을 실행하는 <strong>기기에 앱을
게시</strong>할 수 있습니다.
Google Play 알파 및 베타 채널에 먼저 게시할 수 있으므로,
Play 스토어에 광범위하게 배포하기 전에 Android 베타 소비자를 통해 앱을 테스트할 수 있습니다.
</p>
<p>
Android N에서 테스트 및 개발하는 동안 프리뷰 업데이트가 릴리스되면 <strong>
개발 환경을 최신으로 유지</strong>하는 것이 좋습니다.
이 과정을 손쉽게 진행하려면 테스트 기기를
Android 베타 프로그램에 등록하고 각 마일스톤에서 <strong>OTA 업데이트</strong>를
받을 수 있습니다. 또는 업데이트된 프리뷰 이미지를 직접 다운로드하고
플래시할 수 있습니다.
</p>
<p>
프리뷰 업데이트가 제공될 때마다 <a href="http://android-developers.blogspot.com/">Android 개발자 블로그</a>,
해당 사이트 및 <a href="{@docRoot}preview/dev-community">Android
N 개발자 커뮤니티</a>를 통해서 알려드릴 것입니다.
</p>
<h2 id="preview_tools">N Developer Preview에 포함된 내용</h2>
<p>
N Developer Preview에는
기존 앱을 다양한 화면 크기, 네트워크 기술, CPU/GPU 칩셋
및 하드웨어 아키텍처에서 테스트하는 데 필요한 모든 것이 포함되어 있습니다.
</p>
<h3 id="sdk_tools">SDK 도구</h3>
<p>이러한 구성 요소는 <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a>에서 SDK Manager를 통해 다운로드할 수 있습니다.</p>
<ul>
<li> N Developer Preview <strong>SDK 및 도구</strong>
<li> N Developer Preview <strong>에뮬레이터 시스템 이미지</strong>(32비트 및 64비트)
<li> N Developer Preview <strong>Android TV용 에뮬레이터 시스템 이미지</strong>(32비트)
<li> N Developer Preview 지원 라이브러리(새로운 앱 템플릿용)
</ul>
<p>
필요에 따라 각 마일스톤에서 이러한 개발 도구를 업데이트할 것입니다.
</p>
<h3 id="hardware_system_images">하드웨어 시스템 이미지</h3>
<p>
N Developer Preview에는 Nexus와 물리적 기기를 테스트하고 개발할 때 사용할 수 있는 다른 하드웨어 시스템 이미지가 포함되어 있습니다.
하드웨어 이미지의 전체 목록을 보려면 <a href="{@docRoot}preview/download.html">기기 이미지</a> 페이지를
참조하세요.
</p>
<p>
각 마일스톤에서 업데이트된 시스템 이미지를 제공합니다.
업데이트된 시스템 이미지를 다운로드 및 플래시하고 필요한 만큼 자주
직접 기기를 테스트할 수 있습니다. 이 방법은
기기를 여러 번 다시 플래시해야 하는 자동화된 테스트 환경에
특히 유용합니다.
</p>
<p class="note"><strong>참고</strong>:
<strong>수동으로 플래시된 기기는 지난 해 프리뷰와 달리 OTA 업데이트를 받지 못합니다</strong>
. 올해에는 Android 베타 프로그램에 기기를 등록해야 OTA 업데이트를 받을 수 있습니다.
&mdash;자세한 내용은 다음 섹션을 참조하세요.
</p>
<h3 id="android_beta">Android 베타 프로그램을 통한 OTA 업데이트</h3>
<p>
Android N에서는 프로그램에 등록한 기기에 Android N의 최신 프리뷰 업데이트를 자동으로 전송하는
OTA(Over-the-Air) 업데이트 프로그램이 새로 도입되었습니다.
이 프로그램은 무료이고 Google 계정에 등록된 지원 기기를 가지고 있는 사람이라면
누구나 사용할 수 있습니다.
</p>
<p>
프로그램에 등록하려면 <a href="https://g.co/androidbeta">Android
Beta 프로그램</a> 사이트를 방문하세요.
계정에 등록된 기기 중 Android 베타에 등록할 수 있는 기기를
모두 확인할 수 있습니다.
</p>
<ol>
<li> Android N 업데이트를 받을 기기를 선택합니다.
<li> Enroll을 클릭하고 사용 약관을 읽고 동의한 후, OK를 클릭합니다.
</ol>
<p>
등록을 마치면 곧 기기에서 업데이트를 수신합니다. 대부분의 경우,
Android N으로 이동하기 위해 데이터를 완전히 초기화할 필요는 없지만,
잃고 싶지 않은 데이터가 있다면 기기를 등록하기 전에 백업하는 것이
좋습니다.
</p>
<p>
업데이트가 기기에 전송되면,
가급적 빨리 다운로드하고 설치하는 것이 좋습니다. 시스템 UI, 동작, API 및 기능의 최신 변경 사항에 맞춰
기기를 최신으로 유지할 수 있습니다.
</p>
<p>
Developer Preview가 마무리될 때, 등록된 기기는
공식 Android N 릴리스 업데이트를 받게 됩니다.
</p>
<p>
Android 베타 사이트에서 언제든 Android 베타 프로그램에서 기기 등록을 해제할 수 있습니다.
등록을 해제하기 전에 기기에서 데이터를
백업하세요.
</p>
<p class="note"><strong>참고</strong>:
등록을 해제하면 Android 6.0 Marshmallow
최신 버전으로 <strong>기기가 공장 초기화됩니다</strong>
(기기 등록 전에 설치했던 버전이
아닐 수도 있습니다). 클린 설치를 위해서
연락처, 메시지, 사진 등의 데이터가
기기에서 삭제됩니다.
</p>
<h3 id="documentation_and_sample_code">문서 및 샘플 코드</h3>
<p>
Developer Preview 사이트에서 다음과 같은 문서 리소스를 이용할 수 있으며,
Android&nbsp;N에 대해 익히는 데 유용합니다.
</p>
<ul>
<li> <a href="{@docRoot}preview/setup-sdk.html">
Android N용 개발 설정</a>에는
시작하는 데 필요한 단계별 지침이 포함되어 있습니다.</li>
<li> <a href="{@docRoot}preview/behavior-changes.html">동작
변경</a>에서는 테스트해야 할 주요 영역을 알려줍니다.</li>
<li> 새 API 관련 문서 중에 <a href="{@docRoot}preview/api-overview.html">API 개요</a>, 다운로드 가능한
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">API
참조</a> 및
다중 창 지원, 묶음 알림, 다중 로케일 지원 등과 같은 주요 기능에 대한 상세한 개발자 가이드도 포함되어 있습니다.
<li> <a href="{@docRoot}preview/samples.html">샘플 코드</a>는
권한과 기타 새로운 기능을 지원하는 방법을 보여줍니다.
<li> <a href="{@docRoot}preview/support.html#release-notes">릴리스 노트</a>를
보면 N Developer Preview의 현재 버전에 대한 변경 사항과 차이점 보고서 등 관련 정보를
확인할 수 있습니다.
</ul>
<h4 id="reference">다운로드 가능한 API 참조</h4>
<p>
초기 프리뷰 업데이트 동안
최신 <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Android N 플랫폼용
API 참조</a>를 별도의 zip 아카이브로 다운로드할 수 있습니다. 참조
다운로드에는
API 23 및 이전 업데이트에서 API 변경 사항을 확인하는 데 유용한 차이점 보고서도 포함되어 있습니다.
</p>
<p>
Android N API가 최종 버전이 되고 공식 API 레벨이 할당되면,
<a href="https://developer.android.com">https://developer.android.com</a>에서 온라인으로 API 참조를 제공할 것입니다.
</p>
<h3 id="support_resources">
지원 리소스
</h3>
<p>
N Developer Preview에서 테스트하고 개발하면서 다음 채널을 활용하여
문제를 보고하고 피드백을 제공해 주세요.
</p>
<ul>
<li> <a href="https://code.google.com/p/android-developer-preview/">N Developer Preview Issue
Tracker</a>는 <strong>기본 피드백 채널</strong>입니다. Issue Tracker를 통해 버그, 성능 문제,
전반적 피드백을 보고할 수 있습니다. 또한,
<a href="{@docRoot}preview/bug">알려진 문제</a>를 확인하고
해결 방법을 찾을 수 있습니다. 여러분의 문제는 분류되어 Android 엔지니어링 팀에게 검토하도록 보내는 과정을 통해
지속적으로 업데이트될 것입니다. </li>
<li> <a href="{@docRoot}preview/dev-community">Android N 개발자 커뮤니티</a>는
일종의 Google+ 커뮤니티로,
여기에서 여러분은 Android N으로 작업하는 <strong>다른 개발자들과 소통</strong>할 수 있습니다. 서로의 의견이나 아이디어를 나누고 Android N 관련 질문에 대한 대답을 찾을 수도 있습니다.
저희는 커뮤니티를 진행하고 필요에 따라 답변과 지침을
제공할 것입니다.</li>
</ul>
<h3 id="targeting">대상 지정, 프리뷰 API 및 게시</h3>
<p>
N Developer Preview는 <strong>표준 API 레벨이 없는</strong> 개발 전용 시스템과 Android
라이브러리를 제공합니다.
앱을 테스트하기 위해 호환성 동작에서 옵트아웃하고자 하는 경우(강력히
권장함), 앱의 <code><a href=
"{@docRoot}preview/setup-sdk.html#create-update">targetSdkVersion</a></code>
를 <code>“N”</code>으로 설정하여 N Developer 프리뷰 버전을
대상으로 지정하면 됩니다.
</p>
<p>
Android N Developer Preview에서는 <strong>프리뷰 API</strong>
를 제공합니다. &mdash;이 API는 최종 SDK가 출시될 때까지
공식적인 버전으로 인정되지 않습니다. 최종 SDK 릴리스는 현재 2016년 3분기로 예정되어 있습니다. 즉, 시간이 지나면서 특히 프로그램을 시작한 초기 몇 주 동안에는
<strong>사소한 API 변경이 있을 수 있습니다</strong>.
Android N Developer Preview를 업데이트할 때마다
변경 사항을 요약하여 제공할 것입니다.
</p>
<p class="note">
<strong>참고</strong>: 프리뷰 API는 변경될 수 있지만, 기본 시스템
동작은 안정적이며 지금 바로 테스트 가능한 상태입니다.
</p>
<p>
Google Play는 <strong>N Developer
Preview를 대상으로 하는 앱의 게시를 금지합니다</strong>. Android N 최종 SDK를 사용할 수 있게 되면
공식 Android N API 레벨을 대상으로 지정하고 알파 및 베타 릴리스 채널을 통해 Google
Play에 게시할 수 있습니다. 그때까지는
Android N을 대상으로 하는 앱을 테스터들에게 배포하고자 하는 경우, 이메일이나 본인의 사이트에서 직접
다운로드를 통해 하시면 됩니다.
</p>
<p>
AOSP와 OEM에 대한 Android N 전체 릴리스는 2016년 3분기로 예정되어 있습니다.
이때 Google Play에서 공개 릴리스 채널에 Android N을 대상으로 하는 앱을
게시할 수 있을 것입니다.
</p>
<h2 id="how_to_get_started">시작 방법</h2>
<p>
Android N으로 앱 테스트를 시작하려면:
</p>
<ol>
<li> <a href="{@docRoot}preview/api-overview.html">API 개요</a>와
<a href="{@docRoot}preview/behavior-changes.html">동작 변경</a>을 검토하고
새로운 사항과 이것이 본인의 앱에 미치는 영향에 대해 파악해야 합니다. 특히,
새로운 <a href="{@docRoot}preview/features/notification-updates.html">알림</a> 기능과
<a href="{@docRoot}preview/features/multi-window.html">다중 창 지원</a>에 대해 알아보세요.</li>
<li> <a href="{@docRoot}preview/setup-sdk.html">Preview SDK 설정</a>
및 테스트 기기 구성 지침에 따라 환경을 설정하세요.</li>
<li> <a href="https://developers.google.com/android/nexus/images">플래시
지침</a>에 따라 자신의 기기용 최신 Android N Developer Preview 시스템 이미지를 플래시하세요. </li>
<li> <a href="{@docRoot}preview/setup-sdk.html#docs-dl">API 참조</a>와
<a href="{@docRoot}preview/samples.html">Android N 샘플</a>을 검토하면 새로운 API 기능과 앱에서
그러한 기능을 사용하는 방법에 대해 좀 더 자세히 파악할 수 있습니다.
<li> <a href="{@docRoot}preview/dev-community">Android N 개발자
커뮤니티</a>에 가입하여 최신 소식을 알아보고, 새 플랫폼으로 작업하는
다른 개발자들과 이야기를 나눠보세요.</li>
</ol>
<p>
Android N Developer Preview 프로그램에 참가해 주셔서 대단히 감사합니다!
</p>

View File

@@ -0,0 +1,85 @@
page.title=샘플
page.tags="preview", "samples", "android"
page.image=images/cards/card-n-samples_2x.png
@jd:body
<p>
Android N용으로 다음 코드 샘플이 제공됩니다. Android Studio에서 샘플을
다운로드하려면 <b>File &gt; Import
Samples</b> 메뉴 옵션을 선택합니다.
</p>
<p class="note">
<strong>참고:</strong> 이러한 다운로드 가능한 프로젝트는 Gradle 및 Android Studio와 함께 사용하도록
고안되었습니다.
</p>
<h3 id="mw">다중 창 플레이그라운드</h3>
<img src="{@docRoot}preview/images/sample-multiwindow.png" style="float: left; padding-right: 0.5em" height="250" width="156" />
<p>
이 샘플은 앱으로 다중 창 사용자 인터페이스를 활용하는
방법을 보여줍니다.
</p>
<p>
<a href="https://github.com/googlesamples/android-MultiWindowPlayground">
GitHub에서 가져오기</a>
</p>
<div style="clear: both;"></div>
<h3 id="an">활성 알림</h3>
<img src="{@docRoot}preview/images/sample-activenotifications.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
NotificationCompat를 사용하여
알림을 발송하는 간단한 서비스를 보여주는 기존 샘플입니다. 각각의 읽지 않은 사용자 대화는
고유한 알림으로 발송됩니다.
</p>
<p>
이 샘플은 Android N에서 사용할 수 있는 새로운 알림 기능을
활용하도록 업데이트되었습니다.
</p>
<p>
<a href="https://github.com/googlesamples/android-ActiveNotifications">
GitHub에서 가져오기</a>
</p>
<div style="clear: both;"></div>
<h3 id="ms">메시징 서비스</h3>
<img src="{@docRoot}preview/images/sample-messagingservice.png" style="float: left; padding-right: 0.5em" height="250" width="150" />
<p>
NotificationManager를
사용하여 현재 애플리케이션이 표시할 알림 개수를 지시하는
방법을 보여주는 기존 샘플입니다.
</p>
<p>
이 샘플은 Android N에서 사용할 수 있는 새로운 알림 기능을
활용하도록 업데이트되었습니다.
</p>
<p>
<a href="https://github.com/googlesamples/android-MessagingService">
GitHub에서 가져오기</a>
</p>
<div style="clear: both;"></div>
<h3 id="fbe">직접 부팅</h3>
<img src="{@docRoot}preview/images/sample-directboot.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
이 샘플은 기기 암호화된 저장소에 데이터를 저장하고 액세스하는 방법을 보여줍니다.
이 저장소는 기기가 부팅된 동안 항상 사용할 수 있습니다.
</p>
<p>
<a href="https://github.com/googlesamples/android-DirectBoot">
GitHub에서 가져오기</a>
</p>
<div style="clear: both;"></div>
<h3 id="sda">범위가 지정된 디렉터리 액세스</h3>
<img src="{@docRoot}preview/images/sample-scopeddirectoryaccess.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
이 샘플은 적은 권한을 요구하면서도
특정 디렉터리에서 데이터를 읽고 쓰는 방법을 보여줍니다.
</p>
<p>
<a href="https://github.com/googlesamples/android-ScopedDirectoryAccess">
GitHub에서 가져오기</a>
</p>

View File

@@ -0,0 +1,226 @@
page.title=Preview 설정
meta.keywords="프리뷰", "android"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-sdk_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li><a href="#get-as13">Android Studio 2.1 가져오기</a></li>
<li><a href="#get-sdk">Android N SDK 가져오기</a>
<ol>
<li><a href="#docs-dl">참조 문서</a>
</ol>
</li>
<li><a href="#java8">Java 8 JDK 및 JRE 가져오기</a></li>
<li><a href="#create-update">프로젝트 업데이트 또는 생성</a></li>
<li><a href="#next">다음 단계</a></li>
</ol>
</div>
</div>
<p>Android N Preview용 앱을 개발하려면, 이 페이지의 설명에 따라
개발자 환경을 약간 업데이트해야 합니다.</p>
<p>Android N 시스템 이미지에서 앱의 호환성을 간단히
테스트하려면, 가이드에 따라 <a href="{@docRoot}preview/download.html">Android N 기기에서 테스트</a>를 수행하세요.</p>
<img src="{@docRoot}preview/images/n-preview-setup.png" width="700" alt="" />
<h2 id="get-as13">Android Studio 2.1 가져오기(프리뷰)</h2>
<p>Android N 플랫폼에서는 <a href="{@docRoot}preview/j8-jack.html">Java 8 언어 기능</a>을 지원하며
여기에는 Jack이라는 새로운 컴파일러가 필요합니다. 현재는
Android Studio 2.1에서만 최신 버전의 Jack이 지원됩니다. 따라서 Java 8 언어 기능을
사용하려면, Android Studio 2.1을 사용하여 앱을 빌드해야 합니다. 그렇지 않은 경우,
Jack 컴파일러를 사용할 필요가 없지만 Android N 플랫폼에
대해 컴파일하려면 아래의 설명에 따라 JDK 8로
업데이트해야 합니다.
</p>
<iframe width="400" height="225" src="//www.youtube.com/embed/SBbWGxXCMqQ?autohide=1&amp;showinfo=0" frameborder="0" allowfullscreen="" style="float: right; margin: 0 0 20px 20px;"></iframe>
<p>현재 Android Studio 2.1은 Canary 릴리스 채널에서 프리뷰로
제공됩니다.
Android Studio가 이미 있고 Canary Channel로 업데이트하지 않으려면,
Android Studio 2.1을 별도의 설치로 다운로드한 후, Android N을
사용한 개발에 이것을 사용할 수 있습니다.
이 경우 기본 Android Studio 환경은 영향을 받지 않습니다.</p>
<p>Android Studio 2.1을 별도의 설치로 다운로드하려면 다음
단계를 따르세요(또는 기존 설치의 업데이트로 Android Studio 2.1을
받으려면 4단계로 건너뛰세요).</p>
<ol>
<li>기존 Android Studio 설치의 이름을 수정하고 버전 번호를 붙입니다.
이런 방식으로 새 버전을 설치하면
기존 버전을 덮어쓰지 않습니다.</li>
<li><a href="http://tools.android.com/download/studio/canary/latest">Canary Channel
다운로드 페이지</a>에서 자신의 운영 체제에 맞는 ZIP 파일을 다운로드합니다.
</li>
<li>패키지의 압축을 풀고 Android Studio 2.1의 콘텐츠를
시스템상의 적절한 애플리케이션 위치로 이동한 다음 실행합니다.</li>
<li>Settings 대화 상자를
엽니다(Windows/Linux에서 <strong>File &gt; Settings</strong> 또는
Mac에서 <strong>Android Studio &gt; Preferences</strong>). 왼쪽 패널에서 <strong>Appearance &amp; Behavior &gt; System Settings &gt;
Updates</strong>를
선택합니다.
</li>
<li>Updates 패널에서 <strong>Automatically
check updates for</strong> 확인란을 선택하고
드롭다운 목록에서 <strong>Canary Channel</strong>을 선택합니다.
</li>
</ol>
<p>다음 단계를 위해 이 설정 창을 열어둡니다.</p>
<h2 id="get-sdk">N Preview SDK 가져오기</h2>
<p>Android N API를 사용한 개발을 시작하려면,
다음과 같이 Android N Preview SDK를 Android Studio에 설치해야 합니다.</p>
<ol>
<li>Updates 패널이 여전히 표시된 상태에서(위의 4단계), <strong>Automatically
check updates for Android SDK</strong> 확인란을 선택하고
드롭다운 목록에서 <strong>Preview Channel</strong>을
선택합니다.
</li>
<li><strong>Check Now</strong>를 클릭합니다.</li>
<li>왼쪽 패널에서 <strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>를 선택합니다.
<li><strong>SDK Platforms</strong> 탭을 클릭한 다음,
<strong>Android N Preview</strong> 확인란을 선택합니다.</li>
<li><strong>SDK Tools</strong> 탭을 클릭한 다음,
<strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong>, <strong>Android SDK Tools</strong> 확인란을
선택합니다.
</li>
<li><strong>OK</strong>를 클릭한 다음, 설치해야 하는 패키지의
사용권 계약에 동의합니다.
</li>
</ol>
<h3 id="docs-dl">N Preview 참조 문서 가져오기</h3>
<p>
Android N API에 대한 자세한 내용은 N Preview
참조 문서에서 볼 수 있으며, 이 문서는 다음 표에서 다운로드할 수 있습니다.
이 패키지에는 요약된 오프라인 버전의 Android 개발자
웹사이트가 있고 Android N API용의 업데이트된
API 참조와 API 차이점 보고서가 포함되어 있습니다.
</p>
<table>
<tr>
<th scope="col">문서</th>
<th scope="col">체크섬</th>
</tr>
<tr>
<td style="white-space: nowrap">
<a href="{@docRoot}shareables/preview/n-preview-1-docs.zip">n-preview-1-docs.zip</a></td>
<td width="100%">
MD5: 4ab33ccbe698f46f125cc5b807cf9c2f<br>
SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5
</td>
</tr>
<table>
<h2 id="java8">Java 8 JDK 및 JRE 가져오기</h2>
<p>Android N 플랫폼에 대해 앱을 컴파일하려면
Java 8 개발자 키트(JDK 8)를 사용해야 하며, Android
Studio 2.1의 일부 도구를 사용하려면 Java 8 런타임 환경(JRE 8)을 설치해야
합니다. 따라서 각각 최신 버전이 없는 경우, 지금 JDK 8 및 JRE 8를
다운로드하세요.</p>
<p>그런 다음 Android Studio에서 다음과 같이 JDK 버전을 설정합니다.</p>
<ol>
<li>Android Studio에서 Android 프로젝트를 열고 <strong>File &gt;
Project Structure</strong>를 선택하여
Project Structure 대화 상자를 엽니다. (또는, <strong>File &gt; Other Settings &gt;
Default Project Structure</strong>를 선택하여 모든 프로젝트에 대해
기본값을 설정할 수 있습니다.)
</li>
<li>대화 상자의 왼쪽 패널에서 <strong>SDK Location</strong>을 클릭합니다.
</li>
<li><strong>JDK Location</strong> 필드에,
Java 8 JDK의 위치를 입력한 다음(오른쪽의 버튼을 클릭하여
파일 탐색), <strong>OK</strong>를 클릭합니다.
</li>
</ol>
<img src="{@docRoot}preview/images/studio-jdk-location.jpg" width="700" alt="" />
<h2 id="create-update">프로젝트 업데이트 또는 생성</h2>
<p>
Android N API를 사용하려면, 프로젝트를 적절하게 구성해야 합니다.
</p>
<p>Java 8 언어 기능을 사용할 계획인 경우에는,
<a href="{@docRoot}preview/j8-jack.html">Java 8 언어 기능</a>에서 지원되는 Java 8 기능과
Jack 컴파일러로 프로젝트를 구성하는 방법에 대해서도
읽어봐야 합니다.</p>
<h3 id="update">기존 프로젝트 업데이트</h3>
<p>자신의 모듈에 대한
<code>build.gradle</code>파일을 열고 다음과 같이 값을
업데이트합니다.
</p>
<pre>
android {
compileSdkVersion <strong>'android-N'</strong>
buildToolsVersion <strong>'24.0.0-rc1'</strong>
...
defaultConfig {
minSdkVersion <strong>'N'</strong>
targetSdkVersion <strong>'N'</strong>
...
}
...
}</pre>
<h3 id="create">새 프로젝트 생성</h3>
<p>Android N Preview SDK를 사용한 개발에서 새 프로젝트를 만들려면:</p>
<ol>
<li><strong>File &gt; New Project</strong>를 클릭하고
Target Android Devices 페이지가 나올 때까지 단계를 따릅니다.
</li>
<li>이 페이지에서 <strong>Phone and Tablet</strong> 옵션을 선택합니다.</li>
<li><strong>Phone and Tablet</strong> 옵션 아래의 <strong>Minimum
SDK</strong> 옵션 목록에서
<strong>N: Android API 23, N Preview (Preview)</strong>를 선택합니다.</li>
</ol>
<h2 id="next">다음 단계</h2>
<ul>
<li>가이드에 따라 <a href="{@docRoot}preview/download.html">Android N 기기에서 테스트</a>를 수행합니다.</li>
<li><a href="{@docRoot}preview/behavior-changes.html">동작 변경</a>
및 <a href="{@docRoot}preview/api-overview.html">Android N API
및 기능</a>에서 Android N 플랫폼에
대해 자세히 알아봅니다.</li>
</ul>

View File

@@ -0,0 +1,676 @@
page.title=Android N for Developers
meta.tags="preview", "androidn"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-apis_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Principais recursos para desenvolvedores</h2>
<ol>
<ul style="list-style-type:none;">
<li><a href="#multi-window_support">Suporte a várias janelas</a></li>
<li><a href="#notification_enhancements">Notificações</a></li>
<li><a href="#jit_aot">Compilação JIT/AOT</a></li>
<li><a href="#quick_path_to_app_install">Caminho rápido para a instalação de aplicativos</a></li>
<li><a href="#doze_on_the_go">Modo soneca em movimento</a></li>
<li><a href="#background_optimizations">Otimizações em segundo plano</a></li>
<li><a href="#data_saver">Economizador de dados</a></li>
<li><a href="#tile_api">Quick Settings Tile API</a></li>
<li><a href="#number-blocking">Bloqueio de números</a></li>
<li><a href="#call_screening">Triagem de chamadas</a></li>
<li><a href="#multi-locale_languages">Localidades e idiomas</a></li>
<li><a href="#icu4">APIs ICU4J no Android</a></li>
<li><a href="#gles_32">OpenGL ES 3.2 API</a></li>
<li><a href="#android_tv_recording">Gravação do Android TV</a></li>
<li><a href="#android_for_work">Android for Work</a></li>
<li><a href="#accessibility_enhancements">Acessibilidade</a></li>
<li><a href="#direct_boot">Inicialização direta</a></li>
<li><a href="#key_attestation">Confirmação de chaves</a></li>
<li><a href="#network_security_config">Configuração de segurança de rede</a></li>
<li><a href="#default_trusted_ca">CA confiável padrão</a></li>
<li><a href="apk_signature_v2">Esquema de assinatura de APK v2</a></li>
<li><a href="#scoped_directory_access">Acessos a diretório com escopo</a></li>
</ol>
</div>
</div>
<p>O Android N ainda está em desenvolvimento ativo. Mas agora é possível experimentá-lo
como parte do N Developer Preview. As sessões a seguir destacam alguns
novos recursos para desenvolvedores. </p>
<p>
Não deixe de conferir as <a href="{@docRoot}preview/behavior-changes.html">Mudanças de comportamento</a> para saber mais sobre as
áreas onde as alterações de plataforma podem afetar os aplicativos, examine os
guias para desenvolvedores para saber mais sobre os principais recursos e faça o download da <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência da API</a> para obter detalhes sobre as
novas APIs.
</p>
<h2 id="multi-window_support">Suporte a várias janelas</h2>
<p>No Android N, introduzimos um recurso de multitarefa novo e muito solicitado
na plataforma &mdash; o suporte a várias janelas. </p>
<p>Agora os usuários podem abrir dois aplicativos na tela ao mesmo tempo. </p>
<ul>
<li>Em celulares e tablets
executando o Android N, os usuários agora podem executar dois aplicativos lado a lado ou
um acima do outro em modo de tela dividida. Os usuários podem redimensionar os aplicativos arrastando
o divisor entre eles. </li>
<li>Em dispositivos Android TV, os aplicativos podem assumir o <a href="{@docRoot}preview/features/picture-in-picture.html">modo imagem em
imagem</a>, o que permite que continuem a exibir conteúdo enquanto o usuário navega ou
interage com outros aplicativos. Veja abaixo para obter mais informações. </li>
</ul>
<div class="col-4of10">
<img src="{@docRoot}preview/images/mw-portrait.png" alt="" style="height:460px;padding-left:1em;" id="img-split-screen" />
<p class="img-caption">
<strong>Figura 1.</strong> Aplicativos executando em modo de tela dividida.
</p>
</div>
<p>O suporte a várias janelas oferece novas formas de envolver os usuários,
particularmente em tablets e outros dispositivos com telas maiores. Você pode até ativar o recurso de arrastar e soltar
no aplicativo para permitir que os usuários arrastem conteúdo de ou para o aplicativo &mdash; uma ótima
maneira de aprimorar a experiência do usuário. </p>
<p>É simples adicionar suporte a várias janelas ao aplicativo e configurar a forma com ele
processa a exibição em várias janelas. Por exemplo, você pode especificar as dimensões
mínimas permitidas para a atividade, evitando que os usuários a redimensionem para tamanhos
menores. Também é possível desativar a exibição em várias janelas no aplicativo, o que
garante que o sistema mostrará o aplicativo exclusivamente em modo de tela cheia.</p>
<p>
Para obter mais informações, consulte a documentação para desenvolvedores de
<a href="{@docRoot}preview/features/multi-window.html">Suporte a várias janelas</a>.
</p>
<h2 id="notification_enhancements">Aprimoramentos de notificações</h2>
<p>Reformulamos as notificações no Android N para facilitar e agilizar o seu
uso. Algumas modificações são:</p>
<ul>
<li>
<strong>Atualizações de modelos</strong>: estamos atualizando os modelos de notificação para
colocar mais ênfase na imagem do herói e do avatar. Os desenvolvedores poderão
aproveitar os novos modelos com ajustes mínimos no código.
</li>
<li>
<strong>Notificações empacotadas</strong>: o sistema pode agrupar mensagens
por tópico de mensagem, por exemplo, e exibir o grupo. Um usuário pode
executar ações, como Dismiss ou Archive, nessa exibição de grupo. Se você
já implementou notificações para Android Wear, está familiarizado com
esse modelo.
</li>
<li>
<strong>Resposta direta</strong>: para aplicativos de comunicação em tempo real, o
sistema Android oferece suporte a respostas em linha para que os usuários possam responder rapidamente a
mensagens SMS ou de texto diretamente dentro da interface de notificação.
</li>
<li>
<strong>Visualizações personalizadas</strong>: duas APIs novas permitem utilizar decorações
do sistema, como cabeçalhos e ações de notificação, durante o uso de visualizações
personalizadas em notificações.
</li>
</ul>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-1.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-3.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-2.png" alt="" style="padding:.5em;max-width:226px">
</div>
<p class="img-caption">
<strong>Figura 2.</strong> Notificações empacotadas e resposta direta.
</p>
<p>Para saber como implementar os novos recursos, consulte o
guia
<a href="{@docRoot}preview/features/notification-updates.html">Notificações</a>.</p>
<h2 id="jit_aot">Compilação JIT/AOT orientada a perfil</h2>
<p>No Android N, adicionamos um compilador Just in Time (JIT) com perfis de código para
ART, o que permite aprimorar constantemente o desempenho de aplicativos Android durante a
execução. O compilador JIT complementa o compilador atual Ahead of Time (AOT) do ART
e ajuda a aprimorar o desempenho em tempo de execução, economizar espaço de armazenamento e acelerar
atualizações de aplicativos e de sistema.</p>
<p>A compilação orientada a perfil permite que o ART gerencie a compilação AOT/JIT de cada aplicativo
de acordo com o uso real e com as condições no dispositivo. Por
exemplo, o ART mantém um perfil dos principais métodos do aplicativo e pode pré-compilar
e armazenar esses métodos em cache para obter o melhor desempenho. As outras partes do aplicativo
não são compiladas até que sejam realmente utilizadas.</p>
<p>Além de aprimorar o desempenho para as principais partes do aplicativo, a compilação
ajuda a reduzir o uso geral de recursos de RAM, incluindo os binários
associados. Esse recurso é particularmente importante em dispositivos com pouca memória.</p>
<p>O ART gerencia a compilação orientada a perfil de forma a minimizar o impacto sobre a
bateria do dispositivo. A pré-compilação é executada apenas quando o dispositivo está ocioso e
com a bateria sendo carregada, economizando tempo e bateria com a execução antecipada dessa tarefa.</p>
<h2 id="quick_path_to_app_install">Caminho rápido para a instalação de aplicativos</h2>
<p>Um dos benefícios mais tangíveis do compilador JIT do ART é a velocidade de instalação dos
aplicativos e das atualizações do sistema. Até mesmo aplicativos grandes, que exigiam diversos minutos para
otimização e instalação no Android 6.0, podem agora ser instalados em
segundos. As atualizações de sistema também ficaram mais rápidas, pois não existe mais a etapa de otimização. </p>
<h2 id="doze_on_the_go">Modo soneca em movimento...</h2>
<p>O Android 6.0 introduziu o modo soneca, um modo de sistema que economiza bateria adiando
atividades de CPU e rede dos aplicativos quando o dispositivo está ocioso, como
quando está em uma mesa ou gaveta. </p>
<p>Agora, no Android N, o modo soneca foi aprimorado e economiza bateria quando em movimento.
Sempre que a tela ficar desativada por um período e o dispositivo ficar desativado,
o modo soneca aplicará um subconjunto das restrições familiares de CPU e rede aos aplicativos.
Isso significa que os usuários podem economizar bateria transportando os dispositivos no
bolso.</p>
<img src="/preview/images/doze-diagram-1.png" alt="" id="figure1" />
<p class="img-caption">
<strong>Figura 3.</strong> O modo soneca agora aplica
restrições para aumentar a vida útil da bateria mesmo quando o dispositivo não está estacionário.
</p>
<p>Pouco depois de a tela ser desativada com o dispositivo alimentado pela bateria, o modo soneca
restringe o acesso de rede e adia trabalhos e sincronizações. Durante breves janelas de
manutenção, os aplicativos podem acessar a rede e todos os
trabalhos/sincronizações adiados são executados. A ativação da tela ou do dispositivo encerra
o modo soneca.</p>
<p>Quando o dispositivo voltar a ficar estacionário, com a tela desativada e alimentado por bateria por um
período, o modo soneca aplicará as restrições completas de CPU e rede em {@link
android.os.PowerManager.WakeLock}, alarmes {@link android.app.AlarmManager} e
verificações de GPS/Wi-Fi.</p>
<p>As práticas recomendadas para adaptar o aplicativo ao modo soneca são as mesmas para
dispositivos estacionários ou em movimento. Portanto, se você já atualizou o aplicativo para
processar o modo soneca corretamente, está pronto. Caso contrário, comece a <a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">adaptar
o aplicativo para o modo soneca</a> agora.</p>
<h2 id="background_optimizations">Project Svelte: otimizações em segundo plano</h2>
<p>O Project Svelte é um esforço contínuo para minimizar o uso de RAM pelo sistema e pelos aplicativos
nos dispositivos Android existentes no ecossistema. No Android N, o Project
Svelte se concentra em otimizar a forma de execução dos aplicativos em segundo plano. </p>
<p>O processamento em segundo plano é uma parte essencial da maioria dos aplicativos. Quando executado corretamente, a experiência
do usuário pode ficar incrível &mdash; imediata, rápida e sensível ao contexto.
Quando executado incorretamente, o processamento em segundo plano pode consumir desnecessariamente RAM (e
bateria) e afetar o desempenho do sistema para os outros aplicativos. </p>
<p>Desde o Android 5.0, {@link android.app.job.JobScheduler} é a forma
preferencial para execução de trabalho em segundo plano de uma maneira que beneficia
os usuários. Os aplicativos podem agendar trabalhos e permitir que o sistema execute otimizações com base em
condições de memória, energia e conectividade. O JobScheduler oferece controle
e simplicidade, e queremos que seja usado por todos os aplicativos. </p>
<p>
Outra boa opção é o <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
<code>GCMNetworkManager</code></a>, parte do Google Play Services, que
oferece um agendamento de trabalhos similar, compatível com versões legadas do
Android.
</p>
<p>Continuamos a expandir o <code>JobScheduler</code> e o
<code>GCMNetworkManager</code> para atender a mais
casos de uso &mdash; por exemplo, no Android N, você já pode agendar trabalhos
em segundo plano de acordo com mudanças nos provedores de conteúdo. Ao mesmo tempo, começamos a
substituir alguns padrões mais antigos que podem reduzir o desempenho do sistema,
particularmente em dispositivos com pouca memória.</p>
<p>No Android N, estamos removendo três transmissões implícitas de uso comum &mdash;
{@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}, {@link
android.hardware.Camera#ACTION_NEW_PICTURE} e {@link
android.hardware.Camera#ACTION_NEW_VIDEO} &mdash;, pois podem despertar simultaneamente
processos em segundo plano de vários aplicativos, aumentando o consumo de memória e bateria. Se
o seu aplicativo receber essas transmissões, aproveite o N Developer Preview para
migrar para o <code>JobScheduler</code> e as APIs relacionadas. </p>
<p>
Consulte a documentação de <a href="{@docRoot}preview/features/background-optimization.html">Otimizações
em segundo plano</a> para obter mais detalhes.
</p>
<h2 id="data_saver">Economizador de dados</h2>
<div class="col-5of12" style="margin-right:1.5em;">
<img src="{@docRoot}preview/images/datasaver.png" style="border:2px solid #ddd">
<p class="img-caption" style="padding-right:2em;">
<strong>Figura 4.</strong> O Economizador de dados em Settings.
</p>
</div>
<p>Normalmente, o custo de um plano de dados de celular ao longo da vida útil do dispositivo móvel
excede o custo do próprio dispositivo. Para muitos usuários, os dados de celular
são um recurso caro que querem economizar. </p>
<p>O Android N introduz o modo Economizador de dados, um novo serviço do sistema que ajuda a reduzir
o uso de dados de celular pelos aplicativos em situações de roaming, perto do final do ciclo de cobrança
ou em pacotes de dados pré-pagos pequenos. O Economizador de dados permite que os usuários controlem o
uso de dados de celular e possibilita que os desenvolvedores ofereçam serviços mais eficientes quando o modo Economizador
de dados estiver ativado. </p>
<p>Quando um usuário ativa o Economizador de dados em <strong>Settings</strong> e o dispositivo está
em uma rede tarifada, o sistema bloqueia o uso de dados em segundo plano e avisa aos aplicativos
para reduzir o uso de dados no primeiro plano sempre que possível &mdash; como, por exemplo, limitar a
taxa de bits de streaming, reduzir a qualidade de imagens, adiar o armazenamento prévio otimista em cache
e assim por diante. Os usuários podem autorizar aplicativos específicos a usar dados tarifados em segundo plano,
mesmo com o Economizador de dados ativado.</p>
<p>O Android N estende o {@link android.net.ConnectivityManager} para oferecer aos aplicativos uma
forma de <a href="{@docRoot}preview/features/data-saver.html#status">recuperar as
preferências do usuário para o Economizador de dados</a> e <a href="{@docRoot}preview/features/data-saver.html#monitor-changes">monitorar
as mudanças de preferências</a>. Todos os aplicativos devem verificar se o usuário ativou o Economizador
de dados e tentar limitar o uso de dados em primeiro e segundo plano.</p>
<h2 id="tile_api">Quick Settings Tile API</h2>
<div style="float:right;max-width:320px">
<img src="{@docRoot}preview/images/quicksettings.png" style="padding-left:1.5em;">
<p class="img-caption" style="padding-left:2em;">
<strong>Figura 5.</strong> Blocos de Configurações rápidas na aba de notificações.
</p>
</div><p>As Configurações rápidas são uma forma popular e simples de expor as principais configurações e ações
diretamente na aba de notificações. No Android N, ampliamos o escopo das
Configurações rápidas para aumentar ainda mais a utilidade e a conveniência. </p>
<p>Adicionamos mais espaço para os blocos de Configurações rápidas, que os usuários podem
acessar em uma área de exibição paginada deslizando à direita ou à esquerda. Além disso,
permitimos que os usuários controlem quais blocos de Configurações rápidas são exibidos, bem como o local
em que são exibidos &mdash; para adicionar ou mover blocos, os usuários simplesmente arrastam e largam os blocos. </p>
<p>Para desenvolvedores, o Android N também adiciona uma API nova que permite definir os próprios
blocos de Configurações rápidas para que os usuários possam acessar facilmente os principais controles e ações do seu aplicativo.</p>
<p>
Os blocos de Configurações rápidas estão reservados para controles ou ações que são
urgentemente necessários ou frequentemente usados e não devem ser usados como atalhos para
iniciar aplicativos.
</p>
<p>
Após definir os blocos, você pode disponibilizá-los aos usuários, que por sua vez podem adicioná-los
às Configurações rápidas usando o recurso de arrastar e soltar.
</p>
<p>
Para obter informações sobre a criação de um bloco de aplicativo, consulte
<code>android.service.quicksettings.Tile</code> na <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência da API</a>, disponível para download.
</p>
<h2 id="number-blocking">Bloqueio de números</h2>
<p>O Android N agora oferece suporte a bloqueio de números na plataforma e disponibiliza uma
API de estrutura para permitir que provedores de serviço mantenham uma lista de números bloqueados. O
aplicativo padrão de SMS, o aplicativo padrão de telefone e os aplicativos de provedor podem ler e gravar
a lista de números bloqueados. A lista não pode ser acessada por outros aplicativos.</p>
<p>Ao oferecer o bloqueio de número como recurso padrão da plataforma, o Android oferece
uma forma consistente de bloqueio de números em uma grande variedade de
dispositivos. Alguns benefícios que podem ser aproveitados pelos aplicativos são:</p>
<ul>
<li> Números bloqueados nas chamadas também são bloqueados nos textos
<li> Números bloqueados podem persistir entre várias redefinições e dispositivos por meio do
recurso Backup e restauração
<li> Vários aplicativos podem usar a mesma lista de números bloqueados
</ul>
<p>Além disso, a integração de aplicativos da operadora por meio do Android significa que as operadoras podem
ler a lista de números bloqueados no dispositivo e executar um bloqueio do lado do servidor
para o usuário, impedindo que chamadas e textos indesejados cheguem a ele
por qualquer meio, como pontos finais de VOIP ou encaminhamento de telefones.</p>
<p>
Para obter mais informações, consulte <code>android.provider.BlockedNumberContract</code>
na <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência da API</a>,
disponível para download.
</p>
<h2 id="call_screening">Triagem de chamadas</h2>
<p>
O Android N permite que o aplicativo de telefone padrão faça triagem das chamadas recebidas. O aplicativo
de telefone faz isso implementando o novo <code>CallScreeningService</code>,
que permite que a execução de diversas ações com base nos
{@link android.telecom.Call.Details Call.Details} da chamada recebida, como:
</p>
<ul>
<li> Rejeitar a chamada recebida
<li> Não incluir a chamada no registro de chamadas
<li> Não mostrar ao usuário a notificação da chamada
</ul>
<p>
Para obter mais informações, consulte <code>android.telecom.CallScreeningService</code>
na <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência da API</a>,
disponível para download.
</p>
<h2 id="multi-locale_languages">Suporte a diversas localidades, mais idiomas</h2>
<p>O Android N agora permite que os usuários selecionem <strong>diversas localidades</strong> em Settings
para oferecer melhor suporte a casos de uso bilíngues. Os aplicativos podem usar
uma API nova para obter as localidades selecionadas pelo usuário e oferecer
experiências de usuário mais sofisticadas para usuários com diversas localidades &mdash; como, por exemplo, mostrar resultados de pesquisa em
diversos idiomas e não oferecer a tradução de páginas da web que usam
um idioma conhecido pelo usuário.</p>
<p>Juntamente com o suporte a várias localidades, o Android N também amplia o número de idiomas
disponíveis aos usuários. Ele oferece mais de 25 variantes para cada um dos idiomas
mais comuns, como inglês, espanhol, francês e árabe. Além disso, ele adiciona suporte
parcial a mais de 100 novos idiomas.</p>
<p>Os aplicativos podem obter a lista de localidades definida pelo usuário chamando <code>LocaleList.GetDefault()</code>. Para oferecer suporte ao maior número de localidades, o Android N está alterando a forma
como resolve recursos. Não deixe de testar e verificar se seus aplicativos
funcionam da forma esperada com a nova lógica de resolução de recursos.</p>
<p>Para saber mais sobre o novo comportamento de resolução de recursos e sobre as práticas recomendadas que você deve
seguir, consulte <a href="{@docRoot}preview/features/multilingual-support.html">Suporte a vários idiomas</a>.</p>
<h2 id="icu4">APIs ICU4J no Android</h2>
<p>
O Android N oferece agora um subconjunto das APIs <a href="http://site.icu-project.org/">ICU4J</a> na estrutura do Android no
pacote <code>android.icu</code>. A migração é simples e consiste principalmente em
alterar o espaço de nome <code>com.java.icu</code> para
<code>android.icu</code>. Se você já usa um pacote ICU4J nos seus
aplicativos, a mudança para as APIs do <code>android.icu</code> disponibilizadas na estrutura do
Android pode reduzir substancialmente o tamanho do APK.
</p>
<p>
Para saber mais sobre as APIs ICU4J no Android, consulte <a href="{@docRoot}preview/features/icu4j-framework.html">Suporte ao ICU4J</a>.
</p>
<h2 id="gles_32">OpenGL&trade; ES 3.2 API</h2>
<p>O Android N adiciona interfaces de estrutura e suporte de plataforma ao OpenGL ES 3.2, incluindo:</p>
<ul>
<li> Todas as extensões do <a class="external-link" href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">Pacote de extensão Android</a></a> (AEP), exceto <code>EXT_texture_sRGB_decode</code>.
<li> Framebuffers de ponto flutuante para HDR e sombreamento adiado.
<li> Chamadas de desenho a BaseVertex para possibilitar melhor organização em lotes e transmissão.
<li> Controle robusto de acesso a buffers para reduzir a sobrecarga do WebGL.
</ul>
<p>A API da estrutura do OpenGL ES 3.2 no Android N é fornecida pela classe
<code>GLES32</code>. Ao usar o OpenGL ES 3.2, não deixe de declarar o
requisito no arquivo manifesto usando a tag <code>&lt;uses-feature&gt;</code> e o
atributo <code>android:glEsVersion</code>. </p>
<p>Para obter mais informações sobre como usar o OpenGL ES, incluindo como verificar a versão do
OpenGL ES compatível do dispositivo no tempo de execução, consulte o <a href="{@docRoot}guide/topics/graphics/opengl.html">guia da OpenGL ES API</a>.</p>
<h2 id="android_tv_recording">Gravação do Android TV</h2>
<p>O Android N adiciona a capacidade de gravar e reproduzir conteúdo de serviços de entrada
do Android TV por meio de novas APIs de gravação. Criados usando as APIs atuais de time-shifting,
os serviços de entrada de TV podem controlar quais dados de canal são gravados e como
as sessões gravadas são salvas, bem como gerenciar a interação do usuário com o conteúdo gravado. </p>
<p>Para obter mais informações, consulte <a href="{@docRoot}preview/features/tv-recording-api.html">APIs de gravação do Android TV</a>.</p>
<h2 id="android_for_work">Android for Work</h2>
<p>O Android for Work adiciona vários recursos e APIs para dispositivos que executam o Android N.
Veja a seguir alguns destaques &mdash; para obter uma lista completa das atualizações do Android for Work
relacionadas ao Android N, consulte Mudanças no Android for Work.</p>
<h3 id="work_profile_security_challenge">Desafio de segurança de perfil de trabalho </h3>
<p>
Os donos de perfil podem especificar um desafio de segurança separado para os aplicativos executados no
perfil de trabalho. O desafio de trabalho será mostrado quando o usuário tentar abrir
qualquer aplicativo de trabalho. A resolução bem-sucedida do desafio de segurança desbloqueia e,
se necessário, descriptografa o perfil de trabalho. Para donos de perfil,
<code>ACTION_SET_NEW_PASSWORD</code> solicita que o usuário defina um desafio
de trabalho e <code>ACTION_SET_NEW_PARENT_PROFILE_PASSWORD</code> um
bloqueio de dispositivo.
</p>
<p>
Os donos de perfil podem definir políticas de senha distintas para o desafio de trabalho
(como o comprimento mínimo do PIN ou se é permitido usar uma impressão digital
para desbloquear o perfil) usando <code>setPasswordQuality()</code>,
<code>setPasswordMinimumLength()</code> e métodos relacionados. O dono
de perfil também pode definir o bloqueio de dispositivo usando a instância de <code>DevicePolicyManager</code>
retornada pelo novo método <code>getParentProfileInstance()</code>.
Além disso, donos de perfil podem personalizar a tela de credenciais do
desafio de trabalho usando os novos métodos <code>setOrganizationColor()</code> e
<code>setOrganizationName()</code>.
</p>
<h3 id="turn_off_work">Desativar o trabalho </h3>
<p>Os usuários podem alternar o modo de trabalho em dispositivos com um perfil de trabalho. Quando o modo de trabalho está
desativado, o usuário gerenciado é encerrado temporariamente, o que desativa
os aplicativos, a sincronização em segundo plano e as notificações do perfil de trabalho, inclusive o aplicativo
do dono do perfil. Quando o modo de trabalho está desativado, o sistema exibe um ícone de status
persistente para lembrar ao usuário que não é possível iniciar aplicativos de trabalho. A tela de início
indica que os aplicativos e widgets de trabalho não podem ser acessados. </p>
<h3 id="always_on_vpn">Always on VPN </h3>
<p>Os donos de dispositivo e perfil podem garantir que os aplicativos de trabalho se conectem sempre
por meio de uma VPN especificada. O sistema inicia automaticamente a VPN após a
inicialização do dispositivo.</p>
<p>
Os novos métodos <code>DevicePolicyManager</code> são
<code>setAlwaysOnVpnPackage()</code> e
<code>getAlwaysOnVpnPackage()</code>.
</p>
<p>Como os serviços de VPN podem ser vinculados diretamente pelo sistema sem interação com
aplicativos, os clientes de VPN precisam processar novos pontos de entrada para o Always on VPN. Da
mesma forma que antes, os serviços são indicados ao sistema por um filtro de intenção correspondente
à ação <code>android.net.VpnService</code>. </p>
<p>
Além disso, os usuários podem definir manualmente clientes do Always on VPN que implementam
métodos <code>VPNService</code> no usuário principal usando
<strong>Settings&gt;More&gt;Vpn</strong>.
</p>
<h2 id="accessibility_enhancements">Aprimoramentos na acessibilidade</h2>
<p>O Android N agora oferece Configurações de visão diretamente na tela de boas-vindas na instalação
de novos dispositivos. Isso permite que os usuários descubram e configurem recursos de acessibilidade
em seus dispositivos de forma muito mais fácil, incluindo gesto de ampliação, tamanho
da fonte, tamanho da tela e TalkBack. </p>
<p>Com o posicionamento mais proeminente desses recursos de acessibilidade, os usuários
ficarão mais propensos a experimentar o aplicativo com os recursos ativados. Não deixe de testar antecipadamente os aplicativos
com essas configurações ativadas. Você pode ativá-las em Settings &gt;
Accessibility.</p>
<p>Além disso, os serviços de acessibilidade no Android N podem ajudar usuários com deficiências
motoras a tocar na tela. A nova API permite criar serviços com
recursos como acompanhamento de face, acompanhamento de olho e varredura de pontos, entre outros, para
atender às necessidades desses usuários.</p>
<p>Para obter mais informações, consulte <code>android.accessibilityservice.GestureDescription</code>
na <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência da API</a>, disponível para download.</p>
<h2 id="direct_boot">Inicialização direta</h2>
<p>A inicialização direta reduz os tempos de inicialização dos dispositivos e permite que aplicativos
registrados tenham funcionalidade limitada, mesmo após uma reinicialização inesperada.
Por exemplo, se um dispositivo criptografado reinicializar durante o sono do usuário,
alarmes registrados, mensagens e chamadas recebidas podem agora continuar notificando
o usuário normalmente. Isso também significa que serviços de acessibilidade podem ser
disponibilizados imediatamente após um reinício.</p>
<p>A inicialização direita aproveita a criptografia baseada em arquivo do Android N
para ativar políticas de criptografia detalhadas para dados de sistema e aplicativos.
O sistema usa um armazenamento criptografado pelo dispositivo para determinados dados de sistema e dados
de aplicativos registrados explicitamente. Por padrão, um armazenamento criptografado por credencial é usado para todos
os outros dados de sistema, dados de usuário, aplicativos e dados de aplicativos. </p>
<p>Na inicialização, o sistema inicia em um modo restrito que permite
acessar apenas dados criptografados pelo dispositivo, sem acesso geral a aplicativos ou dados.
Se você deseja executar componentes nesse modo, pode registrá-los
definindo um sinalizador no manifesto. Após a reinicialização, o sistema ativa
componentes registrados transmitindo a intenção
<code>LOCKED_BOOT_COMPLETED</code>. O sistema garante que dados de aplicativos registrados criptografados pelos dispositivos sejam disponibilizados
antes do destravamento. Todos os outros dados ficarão indisponíveis até que o usuário confirme suas
credenciais de tela de bloqueio para descriptografá-los. </p>
Para obter mais informações, consulte <a href="{@docRoot}preview/features/direct-boot.html">Inicialização direta</a>.</p>
</p>
<h2 id="key_attestation">Confirmação de chaves</h2>
<p>Os armazenamentos de chaves protegidos por hardware oferecem um método muito mais seguro para criar, armazenar
e usar chaves de criptografia em dispositivos Android. Eles protegem chaves contra o
kernel do Linux, possíveis vulnerabilidades do Android e extração em
dispositivos com acesso root.</p>
<p>Para permitir o uso de armazenamento de chaves protegido por hardware com maior facilidade e segurança,
o Android N introduziu a confirmação de chaves. Aplicativos em dispositivos móveis e fora deles podem usar a confirmação
de chaves para determinar com precisão se um par de chaves RSA ou EC está
protegido por hardware, quais as propriedades do par de chaves e quais
as restrições aplicadas ao uso e à validação. </p>
<p>Aplicativos e serviços externos aos dispositivos móveis podem solicitar informações sobre um par de chaves
por meio de um certificado de confirmação X.509, que deve estar assinado por uma
chave de confirmação válida. A chave de confirmação é uma chave de assinatura ECDSA,
injetada no armazenamento de chaves protegido por hardware do dispositivo na fábrica.
Portanto, um certificado de confirmação assinado com uma chave de confirmação
válida confirma a existência de um armazenamento de chaves protegido por hardware, além de
detalhes dos pares de chaves desse armazenamento de chaves.</p>
<p>Para garantir que o dispositivo esteja usando uma imagem Android oficial de fábrica
e segura, a confirmação de chaves exige que o <a class="external-link" href="https://source.android.com/security/verifiedboot/verified-boot.html#bootloader_requirements">bootloader</a>
do dispositivo forneça as seguintes informações ao <a class="external-link" href="https://source.android.com/security/trusty/index.html">Ambiente
de execução confiável (TEE)</a>:</p>
<ul>
<li>A versão do sistema operacional e o nível de correção instalado no dispositivo</li>
<li>A chave pública <a href="https://source.android.com/security/verifiedboot/index.html" class="external-link">Verified Boot</a> e seu status de bloqueio</li>
</ul>
<p>Para obter mais informações sobre o recurso de armazenamento de chaves protegido por hardware,
consulte o guia <a href="https://source.android.com/security/keystore/" class="external-link">Armazenamento de chaves protegido por hardware</a>.</p>
<p>Além da confirmação de chaves, o Android N também introduziu
chaves associadas a impressões digitais que não são revogadas no cadastramento de impressões digitais.</p>
<h2 id="network_security_config">Configuração de segurança de rede</h2>
<p>No Android N, os aplicativos podem personalizar o comportamento de conexões seguras (HTTPS, TLS)
de forma segura, sem modificação no código, usando a
<em>Configuração de segurança de rede</em> declarativa em vez das
APIs programáticas propensas a erro (por exemplo, X509TrustManager).</p>
<p>Recursos compatíveis:</p>
<ul>
<li><b>Âncoras confiáveis personalizadas.</b> Permitem que um aplicativo personalize quais
Autoridades de certificado (CA) são confiáveis para suas conexões seguras. Por
exemplo, confiar em determinados certificados autoassinados ou em um conjunto restrito de CAs públicas.
</li>
<li><b>Substituições apenas em depuração.</b> Permite que um desenvolvedor de aplicativos depure
conexões seguras do aplicativo com segurança, sem adicionar riscos à base
instalada.
</li>
<li><b>Cancelamento do uso de tráfego de texto simples.</b> Permite que um aplicativo seja proteja contra
o uso acidental de tráfego de texto simples.</li>
<li><b>Fixação de certificados.</b> Um recurso avançado que permite que os aplicativos
limitem quais chaves de servidor são confiáveis para conexões seguras.</li>
</ul>
<p>Para obter mais configurações, consulte <a href="{@docRoot}preview/features/security-config.html">Configuração de segurança
de rede</a>.</p>
<h2 id="default_trusted_ca">Autoridade de certificado confiável padrão</h2>
<p>Por padrão, os aplicativos direcionados ao Android N confiam apenas em certificados fornecidos pelo sistema
e não confiam mais em Autoridades de certificado (CA) adicionadas pelo usuário. Os aplicativos direcionados ao Android
N que querem confiar em CAs adicionadas pelo usuário devem usar a
<a href="{@docRoot}preview/features/security-config.html">Configuração de segurança de rede</a> para
especificar como confiar nas CAs de usuário.</p>
<h2 id="apk_signature_v2">Esquema de assinatura de APK v2</h2>
<p>A classe PackageManager agora permite a verificação de aplicativos usando o
esquema de assinatura de APK v2. O esquema de assinatura APK v2 é um esquema de assinatura integral de arquivos
que acelera consideravelmente a verificação e fortalece as garantias
de integridade, detectando qualquer alteração não autorizada em arquivos APK.</p>
<p>Para manter a compatibilidade com versões anteriores, o APK deve ser assinado com o esquema de assinatura
v1 (esquema de assinatura JAR) antes de ser assinado com o esquema de assinatura v2.
Com o esquema de assinatura v2, a verificação falhará se você assinar o APK com um
certificado adicional após assiná-lo com o esquema v2. </p>
<p>O suporte ao esquema de assinatura de APK v2 será disponibilizado posteriormente no N Developer
Preview.</p>
<h2 id="scoped_directory_access">Acessos a diretório com escopo</h2>
<p>No Android N, os aplicativos podem usar novas APIs para solicitar acesso a diretórios de <a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">armazenamento
externo</a>, incluindo diretórios em mídia removível como cartões
SD. As novas APIs simplificam substancialmente o acesso de aplicativos a diretórios de
armazenamento externo padrão, como o diretório <code>Pictures</code>. Os aplicativos,
como aplicativos de fotografia, podem usar essas APIs em vez de
<code>READ_EXTERNAL_STORAGE</code>, que concede acesso a todos os diretórios de
armazenamento, ou da Estrutura de acesso ao armazenamento, que faz o usuário navegar até
o diretório.</p>
<p>Além disso, as novas APIs simplificam as etapas executadas pelo usuário para conceder ao aplicativo
acesso ao armazenamento externo. Quando você usa as novas APIs, o sistema usa uma IU
de permissões simples que detalha claramente a qual diretório o aplicativo
está solicitando acesso.</p>
<p>Para obter mais informações, consulte a documentação para desenvolvedores
<a href="{@docRoot}preview/features/scoped-folder-access.html">Acessos
a diretório com escopo</a>.</p>

View File

@@ -0,0 +1,480 @@
page.title=Mudanças de comportamento
page.keywords=preview,sdk,compatibility
meta.tags="preview", "compatibilidade"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-changes_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#perf">Melhorias no desempenho</a>
<ol>
<li><a href="#doze">Soneca</a></li>
<li><a href="#bg-opt">Otimizações em segundo plano</a></li>
</ol>
</li>
<li><a href="#perm">Alterações nas permissões</a></li>
<li><a href="#accessibility">Melhorias na acessibilidade</a>
<ol>
<li><a href="#screen-zoom">Zoom de tela</a></li>
<li><a href="#vision-settings">Configurações de visão no assistente de configuração</a></li>
</ol>
</li>
<li><a href="#ndk">Aplicativos NDK vinculados a bibliotecas de plataforma</a></li>
<li><a href="#afw">Android for Work</a></li>
</ol>
<h2>Veja também</h2>
<ol>
<li><a href="{@docRoot}preview/api-overview.html">
Visão geral da API do Android N</a></li>
</ol>
</div>
</div>
<p>
Além de novos recursos e funcionalidades, o Android N
inclui diversas mudanças de comportamento de sistema e APIs. Este documento
destaca algumas principais mudanças que você deve entender e considerar
nos aplicativos.
</p>
<p>
Caso tenha publicado anteriormente um aplicativo para Android, saiba que ele pode ser afetado
pelas alterações na plataforma.
</p>
<h2 id="perf">Melhorias no desempenho</h2>
<p>
O Android N contém mudanças de comportamento com a finalidade de aprimorar a vida útil
da bateria dos dispositivos, o uso de RAM e o desempenho de aplicativos. Essas alterações podem afetar a
disponibilidade de recursos de sistema e notificações de sistema no aplicativo. Analise
essas mudanças e avalie os ajustes que podem ser necessários no
aplicativo.
</p>
<h3 id="doze">Soneca</h3>
<p>
Introduzido no Android 6.0 (nível da API 23), o modo soneca aumenta a vida útil da bateria
adiando atividades de CPU e rede quando um usuário deixa um dispositivo desconectado,
estacionário e com a tela desativada. O Android N aprimora
ainda mais o modo soneca aplicando um subconjunto de restrições de CPU e rede
quando o dispositivo está desconectado e com a tela desativada, mas não necessariamente
estacionário como, por exemplo, quando o celular está no bolso do usuário.
</p>
<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" />
<p class="img-caption">
<strong>Figura 1.</strong> Ilustração de como o modo soneca aplica um primeiro nível de
restrições de atividades de sistema para aumentar a vida útil da bateria.
</p>
<p>
Quando o dispositivo estiver sendo alimentado pela bateria e a tela estiver desativada por um determinado
período, o dispositivo entrará no modo de soneca e aplicará o primeiro subconjunto de restrições: o
acesso do aplicativo à rede será desativado e os trabalhos e sincronizações serão adiados. Se o dispositivo permanecer
estacionário por um determinado período após entrar no modo soneca, o sistema aplicará as
demais restrições de soneca a {@link android.os.PowerManager.WakeLock},
aos alarmes {@link android.app.AlarmManager} e às verificações de GPS e Wi-Fi. Independentemente
de as restrições de soneca serem aplicadas parcial ou totalmente, o sistema despertará o
dispositivo para breves janelas de manutenção, quando os aplicativos
poderão acessar a rede e executar todos os trabalhos/sincronizações adiados.
</p>
<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
<p class="img-caption">
<strong>Figura 2.</strong> Ilustração de como o modo soneca aplica um segundo nível de
restrições de atividades de sistema após o dispositivo permanecer estacionário por um determinado período.
</p>
<p>
Note que a ativação da tela ou do dispositivo encerra o modo soneca e
remove essas restrições de processamento. O comportamento adicional não
afeta as recomendações e práticas recomendadas para a adaptação do aplicativo à versão
anterior do modo soneca, introduzida no Android 6.0 (nível da API 23), como discutido em
<a href="{@docRoot}training/monitoring-device-state/doze-standby.html">
Otimização para soneca e aplicativo em espera</a>. Você deve continuar
a seguir essas recomendações, como o uso do Google Cloud Messaging (GCM) para
enviar e receber mensagens, e começar a planejar atualizações para acomodar o
comportamento adicional do modo soneca.
</p>
<h3 id="bg-opt">Project Svelte: otimizações em segundo plano</h3>
<p>
O Android N remove três transmissões implícitas para ajudar a otimizar o
uso de memória e o consumo de energia. Essa alteração é necessária porque transmissões
implícitas iniciam frequentemente em segundo plano aplicativos
registrados para escutá-las. A remoção dessas transmissões pode beneficiar consideravelmente o
desempenho do dispositivo e a experiência do usuário.
</p>
<p>
Os dispositivos móveis experimentam frequentes alterações de conectividade, como ao mudar
entre dados de Wi-Fi e móveis. No momento, os aplicativos podem monitorar alterações de
conectividade registrando um receptor para a transmissão implícita {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} em seu
manifesto. Como vários aplicativos se registram para receber essa transmissão, uma única
mudança de rede pode fazer com que todos despertem e processem a transmissão
ao mesmo tempo.
</p>
<p>
De forma semelhante, os aplicativos podem se registrar para receber transmissões implícitas {@link
android.hardware.Camera#ACTION_NEW_PICTURE} e {@link
android.hardware.Camera#ACTION_NEW_VIDEO} de outros aplicativos, como
Câmera. Quando um usuário tira uma fotografia com o aplicativo Câmera, esses aplicativos são despertados
para processar a transmissão.
</p>
<p>
Para aliviar esses problemas, o Android N aplica a seguintes
otimizações:
</p>
<ul>
<li>Os aplicativos direcionados ao Android N não receberão transmissões {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION}, mesmo
se tiverem entradas no manifesto solicitando notificação desses eventos. Aplicativos em execução
em primeiro plano ainda poderão escutar {@code CONNECTIVITY_CHANGE} no
encadeamento principal se solicitarem notificação com um {@link
android.content.BroadcastReceiver}.
</li>
<li>Os aplicativos não poderão enviar nem receber transmissões {@link
android.hardware.Camera#ACTION_NEW_PICTURE} ou {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Essa otimização
afeta todos os aplicativos e não apenas os direcionados ao Android N.
</li>
</ul>
<p>
Versão futuras do Android poderão substituir mais transmissões implícitas, bem
como desvincular serviços em segundo plano. Por esse motivo, evite ou
remova dependências de receptores declarados no manifesto para transmissões implícitas
e de serviços em segundo plano.
</p>
<p>
A estrutura do Android oferece diversas soluções para reduzir a necessidade
dessas transmissões implícitas ou de serviços em segundo plano. Por exemplo, a API {@link
android.app.job.JobScheduler} oferece um mecanismo robusto para agendar
operações de rede quando ocorrem condições especificadas, como conexão a uma rede
ilimitada. Você pode até usar {@link
android.app.job.JobScheduler} para reagir a mudanças em provedores de conteúdo.
</p>
<p>
Para obter mais informações sobre essa mudança de comportamento e sobre como adaptar seus aplicativos,
consulte <a href="{@docRoot}preview/features/background-optimization.html">Otimizações
em segundo plano</a>.
</p>
<h2 id="perm">Alterações nas permissões</h2>
<p>
O Android N inclui alterações em permissões que podem afetar seu aplicativo,
incluindo permissões de contas de usuário e uma nova permissão para gravar em
armazenamento externo. Veja a seguir um resumo das permissões que mudaram
no Preview:
</p>
<ul>
<li>{@code GET_ACCOUNTS} (obsoleto)
<p>
A permissão GET_ACCOUNTS passou a ser obsoleta. O sistema ignora essa
permissão em aplicativos direcionados ao Android N.
</p>
</li>
</ul>
<h2 id="accessibility">Melhorias na acessibilidade</h2>
<p>
O Android N inclui mudanças criadas para aprimorar a facilidade de uso da
plataforma para usuários com visão reduzida ou deficiente. Normalmente, essas mudanças
não exigirão alterações de código no aplicativo. No entanto, analise
esse recurso e teste-o em seu aplicativo para avaliar possíveis impactos na experiência
do usuário.
</p>
<h3 id="screen-zoom">Zoom de tela</h3>
<p>
O Android N permite que os usuários definam <strong>Display size</strong>, que amplia
ou reduz todos os elementos na tela, melhorando a acessibilidade do dispositivo
para usuários com visão deficiente. Os usuários não podem alterar o zoom da tela além da largura mínima de
tela de <a href="http://developer.android.com/guide/topics/resources/providing-resources.html">
sw320dp</a>, que é a largura do Nexus 4, um telefone comum de tamanho médio.
</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> A tela à direita mostra o efeito de
reduzir o Display size de um dispositivo executando uma imagem do sistema Android N.
</p>
<p>
Quando a densidade do dispositivo mudar, o sistema notificará os aplicativos em execução das
seguintes formas:
</p>
<ul>
<li>Se um aplicativo for direcionado ao nível da API 23 ou anterior, o sistema eliminará
todos os processos em segundo plano. Isso significa que, se um usuário alternar
desse aplicativo para abrir a tela <em>Settings</em> e alterar a
configuração <strong>Display size</strong>, o sistema eliminará o aplicativo da mesma
forma que faria em uma situação de pouca memória. Se o aplicativo tiver processos
em primeiro plano, o sistema notificará esses processos sobre a mudança de configuração, como
descrito em <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Processamento
de alterações no tempo de execução</a>, como se a orientação do dispositivo tivesse mudado.
</li>
<li>Se um aplicativo for direcionado ao Android N, todos os seus processos
(em primeiro e segundo plano) serão notificados da mudança de configuração, como
descrito em <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Processamento
de alterações no tempo de execução</a>.
</li>
</ul>
<p>
A maioria dos aplicativos não precisa ser alterada para ser compatível com esse recurso, desde que
os aplicativos sigam as práticas recomendadas do Android. Os itens específicos a serem verificados são:
</p>
<ul>
<li>Teste o aplicativo em um dispositivo com largura de tela <code><a href=
"{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
e verifique se ele funciona adequadamente.
</li>
<li>Quando a configuração do dispositivo mudar, atualize todas as informações
dependentes de densidade armazenadas no cache, como bitmaps no cache ou recursos carregados da
rede. Verifique a ocorrência de alterações de configuração quando o aplicativo sair do estado pausado e retomar
a execução.
<p class="note">
<strong>Observação:</strong> se você armazenar em cache dados dependentes de configuração,
recomendamos incluir metadados relevantes, como o tamanho de tela
adequado ou a densidade de pixels desses dados. Salvar esses dados permitirá que você
decida se será necessário atualizar os dados armazenados em cache após uma mudança
de configuração.
</p>
</li>
<li>Evite especificar dimensões com unidades px, pois elas não são redimensionadas de
acordo com a densidade de tela. Em vez disso, especifique dimensões com unidades de <a href="{@docRoot}guide/practices/screens_support.html">pixel independente de
densidade</a> (<code>dp</code>).
</li>
</ul>
<h3 id="vision-settings">Configurações de visão no assistente de configuração</h3>
<p>
Agora, o Android N inclui Configurações de visão na tela de boas-vindas, onde os usuários podem
definir as configurações de acessibilidade a seguir em um novo dispositivo:
<strong>Magnification gesture</strong>, <strong>Font size</strong>,
<strong>Display size</strong> e <strong>TalkBack</strong>. Essa mudança
aumenta a visibilidade de erros relacionados a configurações de tela diferentes. Para
avaliar o impacto desse recurso, teste os aplicativos com essas
configurações ativadas. Você encontrará as configurações em <strong>Settings &gt;
Accessibility</strong>.
</p>
<h2 id="ndk">Aplicativos NDK vinculados a bibliotecas de plataforma</h2>
<p>
O Android N inclui mudanças de espaço de nome para evitar o carregamento de APIs não públicas.
Se você usar o NDK, use apenas APIs públicas da plataforma Android.
O uso de APIs não públicas na próxima versão oficial do Android
poderá causar problemas no seu aplicativo.
</p>
<p>
Para alertar sobre o uso de APIs não públicas, os aplicativos executados em um dispositivo
Android N geram um erro na saída logcat quando um aplicativo chama uma API não pública.
Esse erro também é exibido na tela do dispositivo como mensagem para
que o usuário fique ciente da situação. Revise o código do seu aplicativo para
remover o uso de APIs de plataformas não públicas e faça testes completos do aplicativo usando
um dispositivo de visualização ou um emulador.
</p>
<p>
Se o seu aplicativo depender de bibliotecas de plataforma, consulte a documentação do NDK
para obter soluções usuais de substituição de APIs privadas comuns por APIs públicas equivalentes.
Também é possível que você esteja vinculando bibliotecas de plataforma sem perceber,
particularmente se o aplicativo usar uma biblioteca que faz parte da plataforma (como
<code>libpng</code>), mas não faz parte do NDK. Nesse caso, verifique se
o APK contém todos os arquivos .so que você pretende vincular.
</p>
<p class="caution">
<strong>Cuidado:</strong> algumas bibliotecas de terceiros podem conter links para APIs
não públicas. Se o aplicativo usar essas bibliotecas, poderá falhar quando executado
na próxima versão oficial do Android.
</p>
<p>
Os aplicativos não devem depender de nem usar bibliotecas nativas não incluídas
no NDK, pois elas podem ser alteradas ou removidas entre uma versão do Android
e outra. A mudança de OpenSSL para BoringSSL é um exemplo dessas alterações.
Além disso, dispositivos diferentes podem oferecer níveis distintos de compatibilidade, porque
não há requisitos de compatibilidade para bibliotecas de plataforma não incluídas
no NDK. Se você precisar acessar bibliotecas que não são do NDK em dispositivos mais antigos, torne o
carregamento dependente do nível do Android API.
</p>
<p>
Para ajudar a diagnosticar esses tipos de problemas, veja a seguir alguns exemplos de erros
de Java e NDK que podem ocorrer durante a compilação do aplicativo com o Android N:
</p>
<p>Exemplo de erro 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>Exemplo de erro de NDK:</p>
<pre class="no-pretty-print">
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
</pre>
<p>
Veja a seguir algumas correções comuns para aplicativos que encontram esses tipos de erro:
</p>
<ul>
<li>O uso de getJavaVM e getJNIEnv do libandroid_runtime.so pode ser substituído
por funções JNI padrão:
<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>O uso do símbolo {@code property_get} de {@code libcutils.so} pode ser
substituído pelo {@code __system_property_get} alternativo público.
Para fazer isso, use {@code __system_property_get} com o include abaixo:
<pre>
#include &lt;sys/system_properties.h&gt;
</pre>
</li>
<li>O uso do símbolo {@code SSL_ctrl} de {@code libcrypto.so} deve ser
substituído por uma versão local do aplicativo. Por exemplo, vincule estaticamente
{@code libcyrpto.a} no arquivo {@code .so} ou inclua dinamicamente o seu próprio
{@code libcrypto.so} do BoringSSL ou OpenSSL no aplicativo.
</li>
</ul>
<h2 id="afw">Android for Work</h2>
<p>
O Android N contém mudanças para aplicativos direcionados ao Android for Work, incluindo
mudanças em instalação de certificados, redefinição de senhas, gerenciamento de
usuários secundários e acesso a identificadores de dispositivos. Se você estiver criando aplicativos para
ambientes do Android for Work, examine essas mudanças e modifique
o aplicativo conforme necessário.
</p>
<ul>
<li>Você precisa instalar um instalador de certificado delegado antes que o DPC possa
configurá-lo. Para aplicativos de donos de perfil e dispositivo direcionados ao N SDK, você deve
instalar o instalador de certificado delegado antes de chamar o
controlador de políticas de dispositivo (DPC)
<code>DevicePolicyManager.setCertInstallerPackage()</code>. Se o instalador
não estiver instalado, o sistema gerará uma
<code>IllegalArgumentException</code>.
</li>
<li>As restrições de redefinição de senha de administradores do dispositivo agora se aplicam também a
donos de perfil. Os administradores de dispositivo não podem mais usar
<code>DevicePolicyManager.resetPassword()</code> para limpar senhas nem para alterar
as já definidas. Os administradores de dispositivo ainda poderão definir uma senha, mas apenas
em dispositivos sem senha, PIN ou padrão.
</li>
<li>Donos de dispositivo e perfil poderão gerenciar contas, mesmo se restrições forem
definidas. Eles podem chamar as APIs de gerenciamento de contas,
mesmo se restrições de usuário <code>DISALLOW_MODIFY_ACCOUNTS</code> forem implementadas.
</li>
<li>Os donos de dispositivo podem gerenciar usuários secundários com maior facilidade. Quando um dispositivo
executar no modo de dono do dispositivo, a restrição <code>DISALLOW_ADD_USER</code>
será definida automaticamente. Isso evita que os usuários criem usuários secundários
não gerenciados. Além disso, os métodos <code>CreateUser()</code> e
<code>createAndInitial()</code> ficaram obsoletos e foram substituídos
pelo novo método <code>DevicePolicyManager.createAndManageUser()</code>.
</li>
<li>Os donos de dispositivo podem acessar identificadores de dispositivo. O dono do dispositivo pode acessar o
endereço MAC Wi-Fi de um dispositivo usando
<code>DevicePolicyManagewr.getWifiMacAddress()</code>. Se o Wi-Fi nunca
foi ativado no dispositivo, esse método retorna o valor {@code null}.
</li>
</ul>
<p>
Para obter mais informações sobre as mudanças no Android for Work no Android N, consulte
<a href="{@docRoot}preview/features/afw.html">Atualizações no Android for Work</a>.
</p>
<h2 id="other">Outros pontos importantes</h2>
<ul>
<li>Quando um aplicativo for executado no Android N, mas for direcionado a um nível da API menor
e o usuário alterar o tamanho da tela, o processo do aplicativo será eliminado. O aplicativo
deverá ser capaz de processar corretamente esse cenário. Caso contrário, falhará
quando o usuário restaurá-lo usando Recents.
<p>
Você deve testar o aplicativo para verificar
se esse comportamento não ocorre.
Isso pode ser feito causando uma falha idêntica
eliminando o aplicativo manualmente usando o DDMS.
</p>
<p>
Aplicativos direcionados ao Android N e versões posteriores não serão eliminados automaticamente em mudanças de densidade.
No entanto, podem continuar a responder a alterações de configurações de forma não ideal.
</p>
</li>
<li>
Os aplicativos no Android N devem ser capazes de processar corretamente mudanças de configuração
e não devem falhar em inicializações subsequentes. Você pode verificar o comportamento do aplicativo
alterando o tamanho da fonte (<strong>Setting</strong> &gt;
<strong>Display</strong> &gt; <strong>Font size</strong>) e depois restaurando
o aplicativo em Recents.
</li>
</ul>

View File

@@ -0,0 +1,541 @@
page.title=Testar em um dispositivo
meta.tags="preview", "nexus","system image"
page.tags="preview", "androidn"
page.image=images/cards/card-n-downloads_2x.png
@jd:body
<div style="position:relative; min-height:600px">
<div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
<p class="sdk-terms-intro">Antes de fazer o download ou instalar componentes do
Android Preview SDK, você deve concordar com os seguintes termos e
condições.</p>
<h2 class="norule">Termos e condições</h2>
<div class="sdk-terms" onfocus="this.blur()" style="width:678px">
Este é o contrato de licença do Android SDK Preview (o “Contrato de Licença”).
1. Introdução
1.1 O Android SDK Preview (que este Contrato de licença chama de "Preview", incluindo especificamente os arquivos de sistema do Android, APIs integradas e arquivos da biblioteca Preview, se e quando estiverem disponíveis) é licenciado por meio da concordância com os termos deste contrato. O Contrato de licença forma um vínculo contratual legal entre o contratado e a Google em relação ao uso do Preview.
1.2 “Android” se refere à pilha de software do Android para dispositivos, conforme disponibilizado no Projeto de código aberto do Android, localizado no URL a seguir: http://source.android.com/, atualizado periodicamente.
1.3 “Compatível com Android” significa qualquer implementação do Android que (i) obedece ao documento Definição de Compatibilidade com Android, que pode ser encontrado no site de compatibilidade do Android (http://source.android.com/compatibility) que pode ser atualizado de tempos em tempos; e (ii) seja aprovado no Android Compatibility Test Suite (CTS).
1.4 “Google” se refere à Google Inc, uma corporação de Delaware, com sede em 1600 Amphitheatre Parkway, Mountain View, CA 94043, Estados Unidos.
2. Aceitação do Contrato de Licença
2.1 A fim de usar o Preview, é necessário concordar com este Contrato de licença. O uso do Preview é proibido àqueles que não concordam com este Contrato de licença.
2.2 Ao clicar em aceitar e/ou usar o Preview, você concorda com os termos do Contrato de licença
2.3 É proibido o uso do Preview e a aceitação deste contrato pelo indivíduo que tenha impedimento legal sobre o recebimento do Preview sob as leis dos Estados Unidos ou de outros países, incluindo o país de residência ou no qual usa o Preview.
2.4 Se for usar o Preview internamente na empresa ou organização, você deverá concordar com o vínculo com este contrato em nome do empregador ou de outra entidade e declarar e garantir que tem total autoridade legal para tanto. Se você não tem a autoridade necessária, não deve concordar com este contrato nem usar o Preview em nome do empregador ou de outra entidade.
3. Licença do Preview da Google
3.1 Sujeito aos termos deste Contrato de licença, a Google confere uma licença limitada, mundial, sem royalties, intransmissível, não exclusiva e não sublicenciável unicamente para o uso do Preview exclusivamente para o desenvolvimento de aplicativos executados para implementações compatíveis do Android.
3.2 Você não poderá usar este Preview para desenvolver aplicativos para outras plataformas (incluindo implementações não compatíveis do Android) nem para deselvolver outro SDK. Você tem a liberdade para desenvolver aplicativos para outras plataformas, incluindo implementações não compatíveis do Android, desde que este Preview não seja usado para essa finalidade.
3.3 Você concorda que a Google ou terceiros detêm todos os direitos legais, títulos e interesses relativos ao Preview, incluindo quaisquer direitos de propriedade intelectual que subsistam no Preview. "Direitos de propriedade intelectual" se referem a todo e qualquer direito sob as leis de patentes, de direitos autorais, de segredo comercial, de marca registrada e todos os outros direitos de propriedade. A Google se reserva todos os direitos não conferidos expressamente a você.
3.4 O uso do Preview não é autorizado para qualquer finalidade não expressamente permitida por este Contrato de licença. Salvo na extensão exigida por licenças aplicáveis de terceiros, é proibido: (a) copiar (exceto para fins de cópia de segurança), modificar, adaptar, redistribuir, descompilar, fazer engenharia reversa, desmontar ou criar trabalhos derivados do Preview ou qualquer parte dele; ou (b) carregar qualquer parte do Preview em um aparelho celular ou outro dispositivo de hardware, exceto um computador pessoal, combinar qualquer parte do Preview com outros softwares ou distribuir qualquer software ou dispositivo que contenha uma parte do Preview.
3.5 O uso, a reprodução e a distribuição de componentes do Preview licenciado sob uma licença de software de código aberto são regidos exclusivamente pelos termos daquela licença de software de código aberto, e não por este Contrato de licença. Você concorda em manter uma licença em bom estado para as licenças de software de código aberto sob todos os direitos concedidos e deter quaisquer ações que possam limitar, suspender ou romper tais direitos.
3.6 Você concorda que a forma e a natureza do SDK que a Google fornece podem mudar sem aviso prévio e que as versões futuras do SDK podem ser incompatíveis com aplicativos desenvolvidos em versões anteriores do SDK. Você concorda que a Google pode cessar (permanente ou temporariamente) o fornecimento do Preview (ou quaisquer recursos dentro dele) a você ou a usuários em geral sob critério exclusivo da Google, sem aviso prévio.
3.7 Nada neste Contrato de licença confere o direito de uso de quaisquer nomes comerciais, marcas comerciais, marcas de serviço, logomarcas, nomes de domínios e outros recursos de marcas especiais da Google.
3.8 Você concorda que não removerá, ocultará nem alterará quaisquer notificações de direitos de propriedade (incluindo notificações de direitos autorais e de marcas registradas) que possam estar afixadas ou contidas no Preview.
4. O uso do Preview
4.1 A Google entende que nada no Contrato de Licença dá a ela direitos, título nem interesse sobre o usuário (ou sobre os seus licenciadores) sob o presente Contrato de licença nem sobre quaisquer aplicativos de software que o usuário desenvolver usando o Preview, incluindo quaisquer direitos de propriedade intelectual que subsistem nos referidos aplicativos.
4.2 Você concorda em usar o Preview e desenvolver aplicativos somente para as finalidades permitidas por (a) este Contrato de licença e (b) quaisquer leis, normas, diretrizes geralmente aceitas ou orientações aplicáveis nas jurisdições relevantes (incluindo quaisquer leis acerca da exportação de dados ou softwares dos e para os Estados Unidos ou outros países relevantes).
4.3 Você concorda que, se usar o Preview para o desenvolvimento de aplicativos, deverá proteger a privacidade e os direitos legais dos usuários. Se nomes de usuário, senhas ou outras informações de acesso ou informações pessoais forem fornecidos ao aplicativo, deve-se informá-los de que tais dados estarão disponíveis para o aplicativo, além de fornecer observações de privacidade e proteção legalmente adequadas a esses usuários. Se o aplicativo armazenar informações pessoais ou confidenciais fornecidas pelos usuários, deve fazê-lo com segurança. Se o usuário fornecer a você informações da conta do Google, o aplicativo poderá usar essas informações exclusivamente para acessar a conta da Google do usuário quando houver autorização de cada usuário para fazê-lo e para os fins limitados da autorização.
4.4 Você concorda que não se envolverá em qualquer atividade com o Preview, incluindo o desenvolvimento e a distribuição de um aplicativo que interfira, perturba, danifique ou acesse, de modo não autorizado, servidores, redes ou outras propriedades de serviço da Google ou de qualquer terceiro.
4.5 Você concorda que é exclusivamente responsável por (e que a Google não tem qualquer responsabilidade com você ou qualquer outra parte) quaisquer dados, conteúdo ou recursos que criar, transmitir ou exibir por meio do Android e/ou de aplicativos do Android e pelas consequências que suas ações (incluindo qualquer perda ou dano que a Google possa sofrer) podem gerar.
4.6 Você concorda que é exclusivamente responsável por (e que a Google não tem qualquer responsabilidade com você ou qualquer outra parte) qualquer violação das obrigações exigidas neste Contrato de licença, qualquer contrato ou termos de serviço aplicáveis de terceiros, qualquer lei ou norma aplicáveis e pelas consequências (incluindo a perda ou dano que a Google ou qualquer terceiro possa sofrer) por quaisquer violações.
4.7 O Preview está em desenvolvimento e seus testes e comentários são uma parte importante do processo de desenvolvimento. Ao usar o Preview, você está ciente de que a implementação de alguns recursos ainda estão em desenvolvimento e que não se deve confiar que o Preview tem a funcionalidade completa de uma versão estável. Você concorda em não distribuir nem enviar publicamente quaisquer aplicativos usando este Preview, pois ele não será mais suportado após o lançamento oficial do Android SDK.
5. Suas credenciais de desenvolvedor
5.1 Você é responsável pela manutenção da confidencialidade de quaisquer credenciais de desenvolvedor que possam ser emitidas pela Google ou escolhidas por você e será o único responsável por todos os aplicativos que forem desenvolvidos sob suas credenciais de desenvolvedor.
6. Privacidade e informações
6.1 A fim de inovar e aprimorar continuamente o Preview, a Google pode coletar certas estatísticas de uso do software, incluindo, sem limitar-se, um identificador exclusivo, endereço IP associado, número de versão do software e informações sobre quais ferramentas e/ou serviços no Preview estão sendo usados e como estão sendo usados. Antes de coletar quaisquer dessas informações, o Preview o notificará e buscará seu consentimento. Se você recusar, as informações não serão coletadas.
6.2 Os dados coletados são examinados coletivamente para aprimorar o Preview e são mantidos em conformidade com a Política de privacidade da Google, localizada em http://www.google.com/policies/privacy/.
7. Aplicativos de terceiros
7.1 Ao usar o Preview para executar aplicativos desenvolvidos por terceiros ou que acessam dados, conteúdo ou recursos fornecidos por terceiros, você concorda que a Google não é responsável por tais aplicativos, dados, conteúdo ou recursos. Você compreende que quaisquer dados, conteúdo ou recursos que você possa acessar por meio de tais aplicativos de terceiros imputam responsabilidade exclusiva ao indivíduo que os originou. A Google não é responsável por qualquer perda ou dano que possa ocorrer como resultado do uso ou acesso de quaisquer aplicativos, dados, conteúdo ou recursos de terceiros.
7.2 Você deve estar ciente de que os dados, conteúdo e recursos apresentados a você por aplicativos de terceiros podem ser protegidos pelos direitos de propriedade intelectual que são de posse dos fornecedores (ou de outras pessoas ou empresas em seus nomes). Não é permitido modificar, alugar, arrendar, emprestar, vender, distribuir nem criar trabalhos derivados baseados nesses dados, conteúdo ou recursos (na totalidade ou em parte), salvo se houver permissão explícita especificada pelos respectivos detentores de direitos.
7.3 Você reconhece que o uso de tais aplicativos, dados, conteúdo ou recursos de terceiros pode estar sujeito a termos separados entre você e o terceiro em questão.
8. Uso das Google APIs
8.1 Google APIs
8.1.1 Ao usar qualquer API para recuperar dados da Google, você reconhece que eles podem ser protegidos por direitos de propriedade intelectual de posse da Google ou dos terceiros que fornecem os dados (ou de pessoas ou empresas em nomes deles). O uso de tal API pode estar sujeito a termos de serviço adicionais. Não é permitido modificar, alugar, arrendar, emprestar, vender, distribuir nem criar trabalhos derivados baseados nesses dados (na totalidade ou em parte), salvo se permitido pelos termos de serviço pertinentes.
8.1.2 Se você usar qualquer API para recuperar dados de um usuário a partir da Google, você reconhece e concorda que deve recuperar dados somente com consentimento explícito do usuário e somente quando, e para os fins limitados para tal, o usuário conceder permissão para fazê-lo.
9. Rescisão do Contrato de licença
9.1 O Contrato de licença continuará a se aplicar até que ocorra uma rescisão sua ou da Google, como definido abaixo.
9.2 Caso queira rescindir o Contrato de licença, você pode fazer isto cessando o uso do Preview e de qualquer credencial de desenvolvedor relevante.
9.3 A Google pode, a qualquer momento, rescindir o Contrato de licença, com ou sem causa, com uma notificação.
9.4 O Contrato de licença será encerrado automaticamente sem aviso ou outras ações na ocorrência de:
(A) a Google interromper o fornecimento do Preview ou de determinadas partes do Preview aos usuários no país em que você reside ou de onde o serviço é usado; e
(B) a Google emitir uma versão de lançamento final do Android SDK.
9.5 Quando o Contrato de licença é rescindido, a licença concedida a você no Contrato de licença é finalizada, todo o uso do Preview será interrompido e as provisões dos parágrafos 10, 11, 12 e 14 deverão permanecer indefinidamente.
10. EXCLUSÕES
10.1 VOCÊ COMPREENDE E CONCORDA EXPRESSAMENTE QUE O RISCO DO USO DO PREVIEW É EXCLUSIVAMENTE SEU E QUE O PREVIEW É FORNECIDO NA FORMA EM QUE SE ENCONTRA E COMO DISPONIBILIZADO, SEM GARANTIA DE QUALQUER TIPO DA GOOGLE.
10.2 O USO DO PREVIEW E DE QUALQUER MATERIAL BAIXADO OU OBTIDO DE OUTRO MODO PELO USO DO PREVIEW ESTÁ A SEU CRITÉRIO E RISCO E VOCÊ É O ÚNICO RESPONSÁVEL POR QUALQUER DANO AO SEU SISTEMA OPERACIONAL OU OUTRO DISPOSITIVO OU PELA PERDA DE DADOS QUE RESULTEM DE TAL USO. SEM LIMITAR OS PRECEDENTES, VOCÊ ENTENDE QUE O PREVIEW NÃO É UMA VERSÃO ESTÁVEL E QUE PODE CONTER ERROS, DEFEITOS E VULNERABILIDADES DE SEGURANÇA QUE PODEM RESULTAR EM DANOS SIGNIFICANTES, INCLUINDO A PERDA IRRECUPERÁVEL OU COMPLETA DO USO DO SISTEMA DO COMPUTADOR OU DE OUTROS DISPOSITIVOS.
10.3 A GOOGLE EXCLUI EXPRESSAMENTE TODAS AS GARANTIAS E CONDIÇOES DE QUALQUER TIPO, EXPRESSAS OU IMPLÍCITAS, INCLUINDO, MAS NÃO LIMITADO A, GARANTIAS E CONDIÇÕES DE COMERCIALIZAÇÃO IMPLÍCITAS, ADEQUAÇÃO A UMA FINALIDADE PARTICULAR E A NÃO VIOLAÇÃO.
11. LIMITAÇÃO DE RESPONSABILIDADE
11.1 VOCÊ COMPREENDE E CONCORDA EXPRESSAMENTE QUE A GOOGLE, SUAS SUBSIDIÁRIAS, AFILIADAS E SEUS LICENCIADORES NÃO SERÃO RESPONSABILIZADOS POR VOCÊ SOB QUALQUER TEORIA DE RESPONSABILIDADE POR QUAISQUER DANOS, SEJAM ELES DIRETOS, INDIRETOS, INCIDENTAIS, ESPECIAIS, CONSEQUENCIAIS OU DE EXEMPLO QUE POSSAM INCORRER, INCLUINDO QUALQUER PERDA DE DADOS, INDEPENDENTE DE AVISO À GOOGLE OU A SEUS REPRESENTANTES OU DA NECESSIDADE DE AVISO SOBRE A POSSIBILIDADE DA INCORRÊNCIA DE TAIS PERDAS.
12. Indenização
12.1 Ao limite máximo permitido por lei, você concorda em defender, indenizar e isentar a Google, suas afiliadas e respectivos conselheiros, diretores, empregados e agentes com relação a todas e quaisquer reivindicações, ações, processos ou procedimentos, bem como todas e quaisquer perdas, responsabilidades, danos, custos e despesas (incluindo honorários advocatícios) decorrentes ou provenientes de: (a) seu uso do Preview, (b) qualquer aplicativo desenvolvido no Preview que infrinja direitos de propriedade intelectual de qualquer pessoa, difame qualquer pessoa ou viole seus direitos de publicidade ou privacidade e (c) qualquer não cumprimento deste Contrato de licença.
13. Mudanças no Contrato de licença
13.1 A Google pode realizar mudanças no Contrato de licença à medida que distribui novas versões do Preview. Quando essas mudanças forem realizadas, a Google fará uma nova versão do Contrato de licença disponível no site em que o Preview for disponibilizado.
14. Termos legais gerais
14.1 Esse Contrato de licença constitui o contrato legal integral entre você e a Google e rege o uso do Preview (excluindo quaisquer serviços que a Google possa fornecer a você sob um contrato escrito em separado), e substitui inteiramente quaisquer contratos anteriores entre você e a Google em relação ao Preview.
14.2 Você concorda que, se a Google não exercer nem impetrar qualquer direito ou recurso legal que esteja contido no Contrato de licença (ou que a Google detenha direitos nos termos de qualquer lei aplicável), não se considerará esse fato como uma renúncia formal aos direitos da Google e esses direitos ou recursos continuarão disponíveis à Google.
14.3 Se qualquer tribunal de justiça que tiver a competência para decidir sobre esse tema determinar que qualquer cláusula do Contrato de licença é inválida, tal cláusula será removida do contrato sem afetar as cláusulas restantes ou sua vigência. As cláusulas restantes do Contrato de licença continuarão válidas e obrigatórias.
14.4 Você reconhece e concorda que cada membro do grupo de empresas das quais a Google é a empresa controladora deve ser beneficiário terceiro do Contrato de licença e que essas outras empresas terão o poder de aplicar diretamente, e apoiar-se em, qualquer cláusula do Contrato de licença que confira um direito (ou direitos em favor) deles. Além disso, nenhuma outra pessoa nem empresa deve ser beneficiário terceiro do Contrato de licença.
14.5 RESTRIÇÕES DE EXPORTAÇÃO. O PREVIEW ESTÁ SUJEITO ÀS LEIS E NORMAS DE EXPORTAÇÃO DOS ESTADOS UNIDOS. VOCÊ DEVE CUMPRIR TODAS AS LEIS E NORMAS DOMÉSTICAS E INTERNACIONAIS QUE SE APLICAREM AO PREVIEW. ESSAS LEIS INCLUEM RESTRIÇÕES SOBRE DESTINOS, USUÁRIOS FINAIS E USO FINAL.
14.6 O Contrato de licença não pode ser atribuído nem transferido por você sem a aprovação prévia por escrito da Google. Qualquer tentativa de atribuição sem a aprovação será inválida. Você não deve delegar as próprias responsabilidades ou obrigações nos termos do Contrato de licença sem aprovação prévia por escrito da Google.
14.7 O Contrato de licença e sua relação com a Google nos termos do contrato serão regidos pelas leis do estado da Califórnia sem considerar conflitos de disposições legais. Você e a Google concordam em se submeter à competência exclusiva dos tribunais localizados na comarca de Santa Clara, Califórnia, para dirimir quaisquer questões legais decorrentes do Contrato de licença. Não obstante a isso, você concorda que a Google continua habilitada a impetrar medidas cautelares (ou mecanismo legal urgente equivalente) em qualquer jurisdição.
</div><!-- sdk terms -->
<div id="sdk-terms-form">
<p>
<input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
<label id="agreeLabel" for="agree">Eu li e concordo com os termos e condições acima</label>
</p>
<p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
</div>
</div><!-- end TOS -->
<div id="landing">
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#device-preview">Configurar um dispositivo de hardware</a>
<ol>
<li><a href="#ota">Obter atualizações OTA</a></li>
<li><a href="#flash">Atualizar um dispositivo manualmente</a></li>
<li><a href="#revertDevice">Desinstalar</a></li>
</ol>
</li>
<li><a href="#setupAVD">Configurar um emulador</a></li>
</ol>
</div>
</div>
<p>
Para executar e testar o aplicativo na nova plataforma, você deve configurar um ambiente de tempo de execução do
Android N. Isso pode ser feito das seguintes maneiras:
</p>
<ul>
<li>Instale o Android N em um dispositivo de hardware compatível ou</li>
<li>Configure um emulador do Android que execute o Android N</li>
</ul>
<p>
Se quiser um ambiente para fazer testes básicos de compatibilidade do seu aplicativo na
nova plataforma, você só precisará do seu APK atual e de um dispositivo de hardware ou
emulador. Não é necessário atualizar o ambiente de desenvolvimento completo
para fazer testes básicos.
</p>
<p>
Se quiser modificar seu aplicativo para direcioná-lo ao Android N ou usar as novas APIs do Android N,
você deverá configurar um ambiente de desenvolvimento atualizado para oferecer suporte ao
Android N. O documento <a href="{@docRoot}preview/setup-sdk.html">Preparação para desenvolver para o
Android N</a> oferece os detalhes.
</p>
<h2 id="device-preview">Configurar um dispositivo de hardware</h2>
<p>
O N Developer Preview oferece atualizações de sistema para diversos dispositivos de hardware
que podem ser usados para testar o aplicativo, de celulares a tablets e televisões.
</p>
<p>
Se você tiver acesso a um dispositivo compatível, poderá atualizá-lo para uma versão de marco do Developer
Preview de uma das seguintes maneiras:
</p>
<ul>
<li><strong>Inscreva o dispositivo nas atualizações de sistema automáticas por OTA</strong> usando o
<a href="https://g.co/androidbeta">programa beta do Android</a>. Após a inscrição, seu dispositivo receberá atualizações regulares
por OTA de todas as versões de marco do N Developer Preview. Essa
abordagem é recomendada porque ela permite que você faça uma transição tranquila do seu ambiente
atual para as várias versões do N Developer Preview.</li>
<li><strong>Faça o download de uma imagem de sistema do Developer Preview e atualize o dispositivo manualmente</strong>.
Atualizações por OTA não são fornecidas automaticamente para dispositivos que são atualizados manualmente, mas
é possível inscrever esses dispositivos no programa beta do Android para receber atualizações por OTA. </li>
</ul>
<h3 id="ota">Inscrever o dispositivo para receber atualizações automáticas por OTA</h3>
<p>
Se você tiver acesso a um dispositivo compatível (veja a lista na tabela de
downloads), poderá receber atualizações por OTA de versões do Preview do Android
ao inscrever esse dispositivo no <a href="https://g.co/androidbeta">programa beta do Android</a>. Essas atualizações são
baixadas automaticamente e serão aplicadas em seu dispositivo da mesma maneira que
atualizações de sistema oficiais.
</p>
<p>
Você pode cancelar a inscrição de um dispositivo a qualquer momento. O dispositivo receberá uma atualização por OTA
para a versão de produção mais recente disponível do Android para o dispositivo em questão
(por exemplo, o Android 6.0 Marshmallow). Essa atualização exige que o dispositivo seja
totalmente redefinido, portanto, os dados do usuário serão removidos. Não deixe de <strong>fazer o backup
de dados importantes</strong> antes de cancelar a inscrição de um dispositivo.
</p>
<p>
Para saber mais e para inscrever seu dispositivo, consulte
o site do <a href="https://g.co/androidbeta">programa beta do Android</a>.
</p>
<p class="note"><strong>Observação:</strong>
cancelar um dispositivo exige uma redefinição total. Faça primeiro o backup
de dados importantes.
</p>
<h3 id="flash">Atualizar um dispositivo manualmente</h3>
<p>
A qualquer momento, você pode fazer o download da imagem de sistema mais recente do Developer Preview e
aplicá-la manualmente ao seu dispositivo. Consulte a tabela abaixo para fazer o download da imagem de sistema
para o dispositivo de teste. A atualização manual de um dispositivo é útil se você precisa de um
controle preciso sobre o ambiente de teste ou se precisa reinstalar com frequência,
como em testes automatizados.
</p>
<!-- You can flash by ota or system image --><p>
Instalar uma imagem de sistema em um dispositivo <strong>remove todos os dados
do dispositivo</strong>, portanto, faça primeiro o backup dos dados.
</p>
<p>
Após fazer o backup dos dados do dispositivo e baixar a imagem de sistema abaixo que
corresponda ao seu dispositivo, siga as instruções em<a href="https://developers.google.com/android/nexus/images#instructions"> developers.google.com/android</a>
para aplicar a imagem no dispositivo.
</p>
<p>
Imagens de sistema atualizadas manualmente <strong>não recebem
atualizações por OTA automaticamente</strong> para versões de marco posteriores do
Developer Preview. Mantenha seu ambiente atualizado e aplique
uma nova imagem de sistema a cada marco do Developer Preview.
</p>
<p>
Se decidir que deseja obter atualizações por OTA após atualizar um dispositivo manualmente,
basta inscrevê-lo no <a href="https://g.co/androidbeta">programa beta do
Android</a>. É possível inscrever dispositivos a qualquer momento para receber a próxima atualização do Preview
por OTA.
</p>
<table>
<tr>
<th scope="col">Dispositivo</th>
<th scope="col">Download / Checksums</th>
</tr>
<tr id="bullhead">
<td>Nexus 5X <br>"bullhead"</td>
<td><a href="#top" onclick="onDownload(this)">bullhead-npc56p-preview-6c877a3d.tgz</a><br>
MD5: b5cf874021023b398f5b983b24913f5d<br>
SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a
</td>
</tr>
<tr id="shamu">
<td>Nexus 6 <br>"shamu"</td>
<td><a href="#top" onclick="onDownload(this)">shamu-npc56p-preview-54b13c67.tgz</a><br>
MD5: af183638cf34e0eb944a1957d7696f60<br>
SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973
</td>
</tr>
<tr id="angler">
<td>Nexus 6P <br>"angler"</td>
<td><a href="#top" onclick="onDownload(this)">angler-npc56p-preview-85ffc1b1.tgz</a><br>
MD5: bc4934ea7bd325753eee1606d3725a24<br>
SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588
</td>
</tr>
<tr id="volantis">
<td>Nexus 9 <br>"volantis"</td>
<td><a href="#top" onclick="onDownload(this)">volantis-npc56p-preview-0e8ec8ef.tgz</a><br>
MD5: c901334c6158351e945f188167ae56f4<br>
SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4
</td>
</tr>
<tr id="volantisg">
<td>Nexus 9G <br>"volantisg"</td>
<td><a href="#top" onclick="onDownload(this)">volantisg-npc56p-preview-1bafdbfb.tgz</a><br>
MD5: 7bb95bebc478d7257cccb4652899d1b4<br>
SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6
</td>
</tr>
<tr id="fugu">
<td>Nexus Player <br>"fugu"</td>
<td><a href="#top" onclick="onDownload(this)">fugu-npc56r-preview-7027d5b6.tgz</a><br>
MD5: f5d3d8f75836ccfe4c70e8162e498be4<br>
SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b
</td>
</tr>
<tr id="ryu">
<td>Pixel C <br>"ryu"</td>
<td><a href="#top" onclick="onDownload(this)">ryu-npc56p-preview-335a86a4.tgz</a><br>
MD5: 4e21fb183bbbf467bee91598d587fd2e<br>
SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92
</td>
</tr>
<tr id="seed">
<td>General Mobile 4G (Android One) <br>"seed"</td>
<td><a href="#top" onclick="onDownload(this)">seed_l8150-npc56p-preview-82472ebc.tgz</a><br>
MD5: 983e083bc7cd0c4a2d39d6ebaa20202a<br>
SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127
</td>
</tr>
</table>
<h3 id="revertDevice">Desinstalar o Preview de um dispositivo</h3>
<p>
O Preview pode ser desinstalado de um dispositivo de uma das
seguintes maneiras: </p>
<ul>
<li><strong>Obtenha uma imagem de sistema com especificações de fábrica</strong> e aplique-a
manualmente no dispositivo.
<ul>
<li>Para <strong>dispositivos Nexus e Pixel C</strong>, consulte
a página de downloads de <a href="http://developers.google.com/android/nexus/images">Imagens de fábrica
para dispositivos Nexus</a>. </li>
<li>Para <strong>outros dispositivos</strong>, entre em contato diretamente com
o fabricante. Como alternativa, se o dispositivo tiver suporte
no programa beta do Android, será possível inscrevê-lo no
programa e cancelar a inscrição (veja abaixo).</li>
</ul>
</li>
<li><strong>Cancele a inscrição do dispositivo no programa Beta do Android</strong>. Se o
dispositivo estiver inscrito no <a href="https://g.co/androidbeta">programa beta do
Android</a>, independentemente de qual ele seja, você poderá simplesmente cancelar a inscrição.
<p>
O dispositivo receberá uma atualização por OTA para a versão de produção mais recente
disponível do Android para o dispositivo em questão (por exemplo, o Android 6.0 Marshmallow).
Essa atualização exige que o dispositivo seja totalmente redefinido, portanto, os dados do usuário serão
removidos. Não deixe de <strong>fazer o backup de dados importantes</strong> antes
de cancelar a inscrição de um dispositivo.
</p>
</li>
</ul>
<p class="note"><strong>Observação:</strong>
para desinstalar uma imagem de sistema do Developer Preview antes do
fim do programa, é preciso redefinir o dispositivo por completo e remover todos os dados
do usuário no dispositivo.
</p>
<h2 id="setupAVD">Configurar um emulador</h2>
<p>Para usar o emulador do Android para executar o Android N Preview, você deve
fazer o download do Android N Preview SDK e criar um dispositivo virtual para o
emulador.</p>
<p>Primeiro, faça o download do Android N Preview SDK da seguinte maneira (se você
já adquiriu esse recurso ao <a href="{@docRoot}preview/setup-sdk.html">se preparar
para desenvolver para o Android N</a>, pule esta etapa):
<ol>
<li>No Android Studio, abra a caixa de diálogo Settings
(<strong>File &gt; Settings</strong> no Windows/Linux ou
<strong>Android Studio &gt; Preferences</strong> no Mac). No painel à
esquerda, selecione <strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>.
<li>Clique na guia <strong>SDK Platforms</strong> e marque a caixa de seleção
<strong>Android N Preview</strong>.</li>
<li>Clique na guia <strong>SDK Tools</strong> e marque as caixas de seleção
<strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong> e <strong>Android SDK Tools</strong>
.
</li>
<li>Clique em <strong>OK</strong> e aceite os termos de licença
de qualquer pacote que precise ser instalado.
</li>
</ol>
<p>Agora, você deve ter o <strong>Android SDK Built-Tools 24.0 0 rc1</strong>,
o <strong>Platform-Tools 24.0.0 rc1</strong> e o <strong>SDK Tools
25.0.9</strong>. Se você não atualizar o SDK Tools para a versão 25.0.9, não será
possível executar as imagens de sistema x86_64 para o Android N.</p>
<p>Agora, crie um dispositivo virtual com a imagem de sistema do Android N:</p>
<ol>
<li>Abra o AVD Manager selecionando <strong>Tools &gt; Android &gt;
AVD Manager</strong>.</li>
<li>Clique em <strong>Create Virtual Device</strong>.</li>
<li>Selecione um dispositivo como Nexus 5X, Nexus 6P, Nexus 9 ou Android TV
e clique em <strong>Next</strong>.</li>
<li>Selecione a imagem de sistema <strong>N</strong> (com ABI
<strong>x86</strong>) e clique em <strong>Next</strong>.
(Apenas imagens de sistema x86 atualmente são compatíveis com o emulador do Android
para o Android N Preview.)
<li>Conclua a configuração do AVD e clique em
<strong>Finish</strong>.</li>
</ol>
<p>Agora, é possível iniciar o emulador do Android com o AVD Android N Preview.</p>
<p>
Para ter a melhor experiência possível com o emulador do Android, instale o
Android Studio 2.1 Preview, que oferece suporte ao <a href="http://tools.android.com/tech-docs/emulator">Android Emulator 2.0 Beta</a>,
cujo desempenho é muito superior ao do emulador no
Android Studio 1.5.</p>
<p class="note"><strong>Observação:</strong>
se você está usando o Android Studio 2.0 Beta, há um problema conhecido
que impede a criação de AVDs com imagens de sistema do N Preview, portanto,
é preciso usar o Android Studio 2.1 Preview para criar AVDs.
</p>
<p>Para saber mais sobre como criar dispositivos virtuais para teste, consulte <a href="{@docRoot}tools/devices/index.html">Gerenciamento de dispositivos virtuais</a>.
</p>
</div><!-- landing -->
</div><!-- relative wrapper -->
<script>
var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
function onDownload(link) {
$("#downloadForRealz").html("Download " + $(link).text());
$("#downloadForRealz").attr('href', urlRoot + $(link).text());
$("#tos").fadeIn('fast');
$("#landing").fadeOut('fast');
return true;
}
function onAgreeChecked() {
/* verify that the TOS is agreed */
if ($("input#agree").is(":checked")) {
/* reveal the download button */
$("a#downloadForRealz").removeClass('disabled');
} else {
$("a#downloadForRealz").addClass('disabled');
}
}
function onDownloadForRealz(link) {
if ($("input#agree").is(':checked')) {
/*
$("#tos").fadeOut('fast');
$("#landing").fadeIn('fast');
*/
ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
/*
location.hash = "";
*/
return true;
} else {
return false;
}
}
$(window).hashchange( function(){
if (location.hash == "") {
location.reload();
}
});
</script>

View File

@@ -0,0 +1,388 @@
page.title=Otimizações em segundo plano
page.metaDescription=Novas restrições a transmissões implícitas.
page.keywords="android N", "implicit broadcasts", "job scheduler"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>
Neste documento
</h2>
<ol>
<li>
<a href="#connectivity-action">Restrições sobre CONNECTIVITY_ACTION</a>
</li>
<li>
<a href="#sched-jobs">Agendamento de trabalhos de rede em conexões
ilimitadas</a>
</li>
<li>
<a href="#monitor-conn">Monitoramento de conectividade de rede durante a execução
do aplicativo</a>
</li>
<li>
<a href="#media-broadcasts">Restrições sobre NEW_PICTURE e
NEW_VIDEO</a>
</li>
<li>
<a href="#new-jobinfo">Novos métodos JobInfo</a>
</li>
<li>
<a href="#new-jobparam">Novos métodos JobParameter</a>
</li>
<li>
<a href="#further-optimization">Otimização adicional do aplicativo</a>
</li>
</ol>
</div>
</div>
<p>
Os processos em segundo plano podem fazer uso intensivo de memória e bateria. Por exemplo, uma
transmissão implícita poderá iniciar diversos processos em segundo plano registrados
para escutá-la, mesmo se esses processos não forem muito usados. Isso pode afetar
substancialmente o desempenho do dispositivo e a experiência de usuário.
</p>
<p>
Para aliviar esse problema, o N Developer Preview aplica as seguintes
restrições:
</p>
<ul>
<li>Os aplicativos direcionados ao Preview não receberão transmissões {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} se estiverem
registrados para recebê-las no seu manifesto. Aplicativos executados em primeiro plano
ainda poderão escutar {@code CONNECTIVITY_CHANGE} no encadeamento principal
registrando um {@link android.content.BroadcastReceiver} em {@link
android.content.Context#registerReceiver Context.registerReceiver()}.
</li>
<li>Os aplicativos não podem enviar nem receber transmissões {@link
android.hardware.Camera#ACTION_NEW_PICTURE} ou {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Essa otimização
afeta todos os aplicativos e não apenas os direcionados ao Preview.
</li>
</ul>
<p>
A estrutura do Android oferece diversas soluções para reduzir a necessidade dessas
transmissões implícitas. Por exemplo, {@link android.app.job.JobScheduler}
e <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> oferecem mecanismos robustos para agendar operações
de rede quando ocorrem condições especificadas, como conexão a uma
rede ilimitada. Agora, você também pode usar {@link android.app.job.JobScheduler}
para reagir a mudanças em provedores de conteúdo. Os objetos {@link android.app.job.JobInfo}
encapsulam os parâmetros usados por {@link android.app.job.JobScheduler}
para agendar o seu trabalho. Quando as condições do trabalho forem atendidas, o sistema
executará o trabalho no {@link android.app.job.JobService} do seu aplicativo.
</p>
<p>
Neste documento, veremos como usar métodos alternativos, como
{@link android.app.job.JobScheduler}, para adaptar seu aplicativo a essas novas
restrições.
</p>
<h2 id="connectivity-action">
Restrições sobre CONNECTIVITY_ACTION
</h2>
<p>
Os aplicativos direcionados ao N Developer Preview não receberão transmissões {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} se estiverem
registrados para recebê-las no seu manifesto e os processos que dependerem dessas
transmissões não serão iniciados. Isso pode ser um problema para aplicativos que quiserem
escutar mudanças de rede ou executar atividades de rede em massa quando o
dispositivo se conectar a uma rede ilimitada. Já existem várias soluções para contornar essa
restrição na estrutura do Android, mas a escolha da solução correta
depende do que o aplicativo pretende realizar.
</p>
<p class="note">
<strong>Observação:</strong> um {@link android.content.BroadcastReceiver} registrado em
{@link android.content.Context#registerReceiver Context.registerReceiver()}
continuará a receber essas transmissões enquanto o aplicativo estiver em primeiro plano.
</p>
<h3 id="sched-jobs">
Agendamento de trabalhos de rede em conexões ilimitadas
</h3>
<p>
Ao usar a classe {@link android.app.job.JobInfo.Builder JobInfo.Builder}
para compilar o objeto {@link android.app.job.JobInfo}, aplique o método {@link
android.app.job.JobInfo.Builder#setRequiredNetworkType
setRequiredNetworkType()} e passe {@link android.app.job.JobInfo
JobInfo.NETWORK_TYPE_UNMETERED} como parâmetro do trabalho. O código a seguir
agendará a execução de um serviço quando o dispositivo se conectar a uma rede
ilimitada e estiver carregando:
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
js.schedule(job);
}
</pre>
<p>
Quando as condições para o trabalho forem atendidas, o aplicativo receberá um retorno de chamada para executar
o método {@link android.app.job.JobService#onStartJob onStartJob()} na
{@code JobService.class} especificada. Para ver mais exemplos da implementação de {@link
android.app.job.JobScheduler}, consulte o <a href="{@docRoot}samples/JobScheduler/index.html">aplicativo de exemplo do JobScheduler</a>.
</p>
<p>
Os aplicativos que usarem serviços do GMSCore e forem direcionados ao Android 5.0 (nível da API 21)
ou anterior poderão usar <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> e especificar {@code Task.NETWORK_STATE_UNMETERED}.
</p>
<h3 id="monitor-conn">
Monitoramento de conectividade de rede durante a execução do aplicativo
</h3>
<p>
Aplicativos executados em primeiro plano ainda poderão escutar {@code
CONNECTIVITY_CHANGE} com um {@link
android.content.BroadcastReceiver} registrado. No entanto, a API {@link
android.net.ConnectivityManager} oferece um método mais robusto para solicitar
um retorno de chamada apenas quando condições de rede especificadas são atendidas.
</p>
<p>
Os objetos {@link android.net.NetworkRequest} definem os parâmetros do
retorno de chamada de rede em termos de {@link android.net.NetworkCapabilities}. Objetos
{@link android.net.NetworkRequest} são criados com a classe {@link
android.net.NetworkRequest.Builder NetworkRequest.Builder}. Em seguida, {@link
android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
passa o objeto {@link android.net.NetworkRequest} ao sistema. Quando
as condições de rede forem atendidas, o aplicativo receberá um retorno de chamada para executar o
método {@link android.net.ConnectivityManager.NetworkCallback#onAvailable
onAvailable()} definido em sua classe {@link
android.net.ConnectivityManager.NetworkCallback}.
</p>
<p>
O aplicativo continuará a receber retornos de chamada até que o aplicativo encerre ou chame
{@link android.net.ConnectivityManager#unregisterNetworkCallback
unregisterNetworkCallback()}.
</p>
<h2 id="media-broadcasts">
Restrições sobre NEW_PICTURE e NEW_VIDEO
</h2>
<p>
No N Developer Preview, os aplicativos não conseguem enviar nem receber transmissões {@link
android.hardware.Camera#ACTION_NEW_PICTURE} ou {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Essa restrição ajuda a
aliviar os impactos no desempenho e na experiência de usuário quando vários aplicativos devem
despertar para processar uma nova imagem ou vídeo. O N Developer Preview
estende {@link android.app.job.JobInfo} e {@link
android.app.job.JobParameters} para oferecer uma solução alternativa.
</p>
<h3 id="new-jobinfo">
Novos métodos JobInfo
</h3>
<p>
Para acionar trabalhos em mudanças de URI de conteúdo, o N Developer Preview estende
a API {@link android.app.job.JobInfo} com os seguintes métodos:
</p>
<dl>
<dt>
{@code JobInfo.TriggerContentUri()}
</dt>
<dd>
Encapsula os parâmetros necessários para acionar um trabalho quando ocorrem mudanças de URI de conteúdo.
</dd>
<dt>
{@code JobInfo.Builder.addTriggerContentUri()}
</dt>
<dd>
Passa um objeto {@code TriggerContentUri} para {@link
android.app.job.JobInfo}. Um {@link android.database.ContentObserver}
monitora o URI de conteúdo encapsulado. Se houver vários objetos {@code
TriggerContentUri} associados a um trabalho, o sistema fornecerá um
retorno de chamada, mesmo se indicar uma mudança em apenas um dos URIs de conteúdo.
</dd>
<dd>
Adicione o sinalizador {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} para
acionar o trabalho em caso de mudança em qualquer um dos descendentes do URI especificado. Esse indicador
corresponde ao parâmetro {@code notifyForDescendants} passado para {@link
android.content.ContentResolver#registerContentObserver
registerContentObserver()}.
</dd>
</dl>
<p class="note">
<strong>Observação:</strong> não é possível usar {@code TriggerContentUri()}
juntamente com {@link android.app.job.JobInfo.Builder#setPeriodic
setPeriodic()} ou {@link android.app.job.JobInfo.Builder#setPersisted
setPersisted()}. Para monitorar continuamente mudanças de conteúdo, agende um novo
{@link android.app.job.JobInfo} antes que o {@link
android.app.job.JobService} do aplicativo encerre o processamento do retorno de chamada mais recente.
</p>
<p>
O exemplo de código a seguir agenda um trabalho que será acionado quando o sistema indicar
uma mudança no URI de conteúdo {@code MEDIA_URI}:
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MediaContentJob.class));
builder.addTriggerContentUri(
new JobInfo.TriggerContentUri(MEDIA_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
js.schedule(builder.build());
}
</pre>
<p>
Quando o sistema indicar uma mudança nos URIs de conteúdo especificados, o aplicativo
receberá um retorno de chamada e um objeto {@link android.app.job.JobParameters} será
passado para o método {@link android.app.job.JobService#onStartJob onStartJob()}
na {@code MediaContentJob.class}.
</p>
<h3 id="new-jobparam">
Novos métodos JobParameter
</h3>
<p>
O N Developer Preview também estende {@link android.app.job.JobParameters} para
permitir que o aplicativo receba informações úteis sobre quais autoridades de conteúdo
e URIs acionaram o trabalho:
</p>
<dl>
<dt>
{@code Uri[] getTriggeredContentUris()}
</dt>
<dd>
Retorna uma matriz de URIs que acionaram o trabalho. O retorno será {@code
null} se o trabalho não foi acionado por URIs (por exemplo, o trabalho foi
acionado devido a um prazo ou por outro motivo) ou o número de URIs modificados
for maior que 50.
</dd>
<dt>
{@code String[] getTriggeredContentAuthorities()}
</dt>
<dd>
Retorna uma matriz de strings de autoridades de conteúdo que acionaram o trabalho.
Se a matriz retornada não for {@code null}, use {@code getTriggeredContentUris()}
para recuperar os detalhes sobre quais URIs foram modificados.
</dd>
</dl>
<p>
O exemplo de código a seguir substitui o método {@link
android.app.job.JobService#onStartJob JobService.onStartJob()} e
registra as autoridades de conteúdo e URIs que acionaram o trabalho:
</p>
<pre>
&#64;Override
public boolean onStartJob(JobParameters params) {
StringBuilder sb = new StringBuilder();
sb.append("Media content has changed:\n");
if (params.getTriggeredContentAuthorities() != null) {
sb.append("Authorities: ");
boolean first = true;
for (String auth :
params.getTriggeredContentAuthorities()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(auth);
}
if (params.getTriggeredContentUris() != null) {
for (Uri uri : params.getTriggeredContentUris()) {
sb.append("\n");
sb.append(uri);
}
}
} else {
sb.append("(No content)");
}
Log.i(TAG, sb.toString());
return true;
}
</pre>
<h2 id="further-optimization">
Otimização adicional do aplicativo
</h2>
<p>
A otimização dos aplicativos para execução em dispositivos com pouca memória ou em
condições de pouca memória pode melhorar o desempenho e a experiência do usuário. A remoção de
dependências de serviços em segundo plano e receptores de transmissão
implícita registrados estatisticamente podem aprimorar a execução do aplicativo nesses dispositivos. Embora
o N Developer Preview avance na redução de alguns desses problemas,
recomendamos que você otimize os aplicativos para execução sem o uso desses
processos em segundo plano.
</p>
<p>
O N Developer Preview introduz alguns comandos adicionais do <a href="{@docRoot}tools/help/adb.html">Bridge de Debug Android (ADB)</a> que
podem ser usados para testar o comportamento do aplicativo de teste com esses processos em segundo plano desativados:
</p>
<ul>
<li>Para simular condições em que transmissões implícitas e serviços em segundo plano
não estão disponíveis, insira o seguinte comando:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
</pre>
</li>
<li>Para reativar transmissões implícitas e serviços em segundo plano, insira o
seguinte comando:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
</pre>
</li>
</ul>

View File

@@ -0,0 +1,180 @@
page.title=Inicialização direta
page.keywords=preview,sdk,direct boot
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#run">Solicitar acesso para executar durante a inicialização direta</a></li>
<li><a href="#access">Acessar armazenamento criptografado do dispositivo</a></li>
<li><a href="#notification">Receber notificação quando o usuário desbloquear</a></li>
<li><a href="#migrating">Migrar dados existentes</a></li>
<li><a href="#testing">Testar seu aplicativo com reconhecimento de criptografia</a></li>
</ol>
</div>
</div>
<p>O Android N é executado em um modo seguro de <i>inicialização direta</i>
quando o dispositivo é ligado, mas o usuário não o
desbloqueia. Para isso, o sistema oferece dois locais de armazenamento para dados:</p>
<ul>
<li><i>O armazenamento criptografado de credenciais</i>, que é o local de armazenamento padrão
e é disponibilizado apenas depois que o usuário desbloqueia o dispositivo.</li>
<li><i>O armazenamento criptografado do dispositivo</i>, que é um local de armazenamento disponibilizado
durante o modo de inicialização direta e depois que o usuário desbloqueia o dispositivo.</li>
</ul>
<p>Por padrão, aplicativos não são executados no modo de inicialização direta.
Se seu aplicativo precisa executar ações durante esse modo, você pode registrar os
componentes que devem ser executados. Alguns casos comuns
para aplicativos que precisam ser executados no modo de inicialização direta:</p>
<ul>
<li>Aplicativos com notificações programadas, como aplicativos de
relógio.</li>
<li>Aplicativos que fornecem notificações importantes ao usuário, como aplicativos de SMS.</li>
<li>Aplicativos que fornecem serviços de acessibilidade, como o Talkback.</li>
</ul>
<p>Se seu aplicativo precisar acessar dados enquanto estiver no modo de inicialização direta, use
o armazenamento criptografado do dispositivo. O armazenamento criptografado do dispositivo contém dados
criptografados com uma chave que só é disponibilizada depois que o dispositivo realizou
uma inicialização verificada com sucesso.</p>
<p>Para dados que devem ser criptografados com uma chave associada às credenciais
do usuário, como um PIN ou uma chave, use o armazenamento criptografado de credenciais.
Esse armazenamento só é disponibilizado depois que o usuário
desbloquear o dispositivo com sucesso e até que ele reinicie o dispositivo novamente. Se o
usuário ativar a tela de bloqueio após desbloquear o dispositivo, isso não bloqueará
o armazenamento criptografado de credenciais.</p>
<h2 id="run">Solicitar acesso para executar durante a inicialização direta</h2>
<p>Aplicativos devem registrar seus componentes com o sistema antes de
poderem ser executados no modo de inicialização direta ou acessar o armazenamento criptografado
do dispositivo. Os aplicativos são registrados com o sistema ao marcar os componentes como
<i>tendo reconhecimento de criptografia</i>. Para marcar seu componente como tendo reconhecimento de criptografia, defina o atributo
<code>android:encryptionAware</code> como true no manifesto.<p>
<p>Componentes com reconhecimento de criptografia podem se registrar para receber uma mensagem de transmissão
<code>LOCKED_BOOT_COMPLETED</code> do
sistema quando o dispositivo for reiniciado. Nesse momento, o armazenamento criptografado do
dispositivo é disponibilizado e pode executar tarefas
necessárias durante o modo de inicialização, como o acionamento de um alarme programado.</p>
<p>O fragmento de código a seguir é um exemplo de como registrar um
{@link android.content.BroadcastReceiver} como tendo reconhecimento de criptografia e adicionar um
filtro de intenção para <code>LOCKED_BOOT_COMPLETED</code> no manifesto do aplicativo:</p>
<pre>
&lt;receiever
android:encryptionAware="true" &gt;
...
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>Quando o usuário desbloquear o dispositivo, todos os componentes poderão acessar o armazenamento
criptografado do dispositivo e o armazenamento criptografado de credenciais.</p>
<h2 id="access">Acessar armazenamento criptografado do dispositivo</h2>
<p>Para acessar o armazenamento criptografado do dispositivo, crie uma segunda instância de
{@link android.content.Context} chamando
<code>Context.createDeviceEncryptedStorageContext()</code>. Todas as chamadas da API
de armazenamento que usam esse contexto acessam o armazenamento criptografado do dispositivo. O
exemplo a seguir acessa o armazenamento criptografado do dispositivo e abre um
arquivo de dados existente do aplicativo:</p>
<pre>
Context directBootContext = Context.createDeviceEncryptedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...
</pre>
<p>Use o armazenamento criptografado do dispositivo somente para
informações que precisem ser acessadas durante o modo de inicialização direta.
Não use o armazenamento criptografado do dispositivo como um repositório criptografado para fins gerais.
Para informações particulares do usuário ou dados criptografados que não são necessários durante
o modo de inicialização direta, use o armazenamento criptografado de credenciais.</p>
<h2 id="notification">Receber notificação quando o usuário desbloquear</h2>
<p>Quando o usuário desbloquear o dispositivo após a reinicialização, seu aplicativo poderá voltar
a acessar o armazenamento criptografado de credenciais e usar serviços regulares do sistema que
dependem das credenciais do usuário.</p>
<p>Para receber uma notificação quando o usuário desbloquear o dispositivo após uma reinicialização,
registre um {@link android.content.BroadcastReceiver} do componente em execução
para ouvir a mensagem <code>ACTION_USER_UNLOCKED</code>. Você também pode
receber a mensagem {@link android.content.Intent#ACTION_BOOT_COMPLETED
ACTION_BOOT_COMPLETED} existente, que agora indica que o dispositivo foi inicializado e que
o usuário o desbloqueou.</p>
<p>Você pode enviar uma consulta diretamente se o usuário desbloquear o dispositivo chamando
<code>UserManager.isUserUnlocked()</code>.</p>
<h2 id="migrating">Migrar dados existentes</h2>
<p>Se um usuário atualizar o dispositivo para usar o modo de inicialização direta, você poderá ter dados
existentes que precisem ser migrados para o armazenamento criptografado do dispositivo. Use
<code>Context.migrateSharedPreferencesFrom()</code> e
<code>Context.migrateDatabaseFrom()</code> para migrar dados de preferências e do banco de
dados entre o armazenamento criptografado de credenciais e o armazenamento criptografado do dispositivo.</p>
<p>Tenha bom senso ao decidir quais dados migrar do armazenamento
criptografado de credenciais para o armazenamento criptografado do dispositivo. Não migre
informações particulares do usuário, como senhas ou tokens de autorização, para o
armazenamento criptografado do dispositivo. Em alguns casos, pode ser necessário gerenciar
conjuntos separados de dados nos dois repositórios criptografados.</p>
<h2 id="testing">Testar seu aplicativo com reconhecimento de criptografia</h2>
<p>Teste seu aplicativo com reconhecimento de criptografia usando o novo modo de inicialização direta. Existem duas
maneiras de ativar a inicialização direta.</p>
<p class="caution"><strong>Cuidado:</strong> ao ativar a inicialização direta,
você apaga todos os dados do usuário no dispositivo.</p>
<p>Em dispositivos compatíveis com o Android N instalado, ative a
inicialização direta seguindo um destes procedimentos:</p>
<ul>
<li>No dispositivo, ative <b>Developer options</b>, se ainda não tiver feito isso,
acessando <b>Settings &gt; About phone</b> e tocando em <b>Build number</b>
sete vezes. Quando a tela de opções do desenvolvedor for disponibilizada, acesse
<b>Settings &gt; Developer options</b> e selecione
<b>Convert to file encryption</b>.</li>
<li>Use os seguintes comandos de shell adb para ativar o modo de inicialização direta:
<pre class="no-pretty-print">
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
</pre>
</li>
</ul>
<p>Um modo de inicialização direta emulado também está disponível, caso você precise trocar
de modo nos dispositivos de teste. O modo emulado só deve ser usado durante
o desenvolvimento e pode causar perda de dados. Para ativar o modo de inicialização direta,
defina um padrão de bloqueio no dispositivo, escolha "No thanks", caso seja solicitada
uma tela de inicialização segura ao definir esse padrão, e, em seguida, use o
seguinte comando de shell adb:</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe true
</pre>
<p>Para desativar o modo de inicialização direta emulado, use o seguinte comando:</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe false
</pre>
<p>O uso desses comandos faz com que o dispositivo seja reinicializado.</p>

View File

@@ -0,0 +1,158 @@
page.title=APIs de estrutura do Android para ICU4J
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento:</h2>
<ol>
<li><a href="#relation">Relação com o ICU4J</a></li>
<li><a href="#migration">Migrar para APIs android.icu do ICU4J </a></li>
<li><a href="#licence">Licenciamento</a></li>
</ol>
<h2>Veja também</h2>
<ol>
<li>
<a class="external-link" href="http://userguide.icu-project.org">Documentação para ICU4J</a>
</li>
<li>
<a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Últimos padrões com suporte
do ICU4J</a>
</li>
</ol>
</div>
</div>
<p>
O ICU4J é um conjunto de bibliotecas Java de código aberto e amplamente usadas que fornecem suporte para Unicode
e globalização para aplicativos de software. O Android N
expõe um subconjunto de APIs do ICU4J na estrutura do Android para uso dos desenvolvedores de aplicativos
no pacote {@code android.icu}. Essas APIs usam
dados de localização presentes no dispositivo. Consequentemente, você pode reduzir o uso de APK
ao não compilar as bibliotecas do ICU4J no seu APK. Em vez disso, pode
simplesmente chamá-las na estrutura. (Neste caso, pode ser conveniente fornecer
<a href="{@docRoot}google/play/publishing/multiple-apks.html">várias versões
do seu APK</a> para que os usuários que tenham versões inferiores ao Android N
possam fazer o download de uma versão do aplicativo que contenha as bibliotecas do ICU4J.)
</p>
<p>
Este documento começa fornecendo informações básicas sobre os níveis mínimos da
Android API necessários para oferecer suporte a essas bibliotecas. Em seguida, ele explica o que
você deve saber sobre a implementação do ICU4J específica do Android. Por fim,
ele informa como usar as APIs do ICU4J na estrutura do Android.
</p>
<h2 id="relation">Relação com o ICU4J</h2>
<p>
O Android N expõe um subconjunto de APIs do ICU4J por meio do pacote
<code>android.icu</code>, não do <code>com.ibm.icu</code>. A
estrutura do Android pode optar por não
expor as APIs do ICU4J por diversos motivos. Por exemplo, o Android N não expõe
algumas APIs obsoletas ou APIs que a equipe do ICU ainda não declarou como
estáveis. Conforme a equipe do ICU torna APIs obsoletas, o Android também as marcará
como obsoletas, mas continuará incluindo-as.
</p>
<p class="table-caption"><strong>Tabela 1.</strong> Versões ICU e CLDR usadas
no Android N.</p>
<table>
<tr>
<th>Nível da Android API</th>
<th>Versão ICU</th>
<th>Versão CLDR</th>
</tr>
<tr>
<td>Android N</td>
<td>56</td>
<td>28</td>
</tr>
</table>
<p>Algumas observações importantes:</p>
<ul>
<li>As APIs de estrutura do Android para ICU4J não incluem todas as APIs do ICU4J.</li>
<li>Desenvolvedores de NDK devem saber que o Android ICU4C não é compatível.</li>
<li>As APIs da estrutura do Android não substituem o suporte do Android para a
<a href="{@docRoot}guide/topics/resources/localization.html">localização com
recursos</a>.</li>
</ul>
<h2 id="migration">Migrar do pacote com.ibm.icu para o android.icu</h2>
<p>
Se você já estiver usando as APIs do ICU4J no seu aplicativo e as APIs
<code>android.icu</code> atenderem aos seus requisitos, a migração para
as APIs de estrutura exigirão que você altere as importações Java
de <code>com.ibm.icu</code> para <code>android.icu</code>. Você, então, poderá
remover sua própria cópia dos arquivos do ICU4J do APK.
</p>
<p class="note">
<b>Observação</b>: As APIs de estrutura do ICU4J usam o espaço de nome {@code android.icu}
em vez de {@code com.ibm.icu}. Isso ocorre para evitar conflitos
de espaço de nome em APKs que contêm as próprias bibliotecas {@code com.ibm.icu}.
</p>
<h3 id="migrate-from-android">
Migrar para APIs android.icu de outras APIs do Android SDK
</h3>
<p>
Algumas classes dos pacotes <code>java</code> e <code>android</code> têm
equivalentes para as encontradas no ICU4J. No entanto, o ICU4J frequentemente fornece um suporte
mais amplo para padrões e linguagens.
</p>
<p>Alguns exemplos para você começar:</p>
<table>
<tr>
<th>Classe</th>
<th>Alternativas</th>
</tr>
<tr>
<td><code>java.lang.Character</code> </td>
<td><code>android.icu.lang.UCharacter</code> </td>
</tr>
<tr>
<td><code>java.text.BreakIterator</code> </td>
<td><code>android.icu.text.BreakIterator</code> </td>
</tr>
<tr>
<td><code>java.text.DecimalFormat</code> </td>
<td><code>android.icu.text.DecimalFormat</code> </td>
</tr>
<tr>
<td><code>java.util.Calendar</code></td>
<td>
<code>android.icu.util.Calendar</code></td>
</tr>
<tr>
<td><code>android.text.BidiFormatter</code>
</td>
<td><code>android.icu.text.Bidi</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateFormat</code>
</td>
<td><code>android.icu.text.DateFormat</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateUtils</code> </td>
<td><code>android.icu.text.DateFormat</code>
<code>android.icu.text.RelativeDateTimeFormatter</code>
</td>
</tr>
</table>
<h2 id="licence">Licenciamento</h2>
<p>
O ICU4J é liberado sob a licença do ICU. Para saber mais, consulte o <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Guia do usuário do
ICU.</a>
</p>

View File

@@ -0,0 +1,582 @@
page.title=Suporte a várias janelas
page.metaDescription=Novo suporte à exibição de mais de um aplicativo ao mesmo tempo no Android N.
page.keywords="multi-window", "android N", "split screen", "free-form"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#overview">Visão geral</a></li>
<li><a href="#lifecycle">Ciclo de vida do modo de várias janelas</a></li>
<li><a href="#configuring">Configuração do aplicativo para o modo
de várias janelas</a></li>
<li><a href="#running">Execução do aplicativo no modo de várias janelas</a></li>
<li><a href="#testing">Teste do suporte a várias janelas em seu aplicativo</a></li>
</ol>
<h2>Veja também</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">Playground - aplicativo de exemplo
do modo de várias janelas</a></li>
</ol>
</div>
</div>
<p>
O Android N adiciona suporte à exibição de mais de um aplicativo ao
mesmo tempo. Em dispositivos portáteis, dois aplicativos podem ser executados lado a lado ou
um acima do outro no modo de <em>tela dividida</em>. Em dispositivos de TV, os aplicativos podem
usar o modo de <em>imagem em imagem</em> para continuar a reprodução do vídeo enquanto os usuários
interagem com outro aplicativo.
</p>
<p>
Se você compilar o aplicativo com o N Preview SDK, poderá configurar como o aplicativo
processa a exibição de várias janelas. Por exemplo, você pode especificar as dimensões
mínimas permitidas para a atividade. Você também pode desativar a exibição de várias janelas para
o aplicativo, garantindo que o sistema mostre o aplicativo apenas
em modo de tela inteira.
</p>
<h2 id="overview">Visão geral</h2>
<p>
O Android N permite que diversos aplicativos compartilhem a tela ao mesmo tempo. Por
exemplo, um usuário pode dividir a tela para visualizar uma página da web no lado esquerdo
e compor um e-mail no lado direito. A experiência do usuário depende do
dispositivo:
</p>
<ul>
<li>Os dispositivos portáteis que executam o Android N oferecem o
modo de tela dividida. Nesse modo, o sistema preenche a tela com dois aplicativos, exibindo-os
lado a lado ou um acima do outro. O usuário pode arrastar a linha divisória
que separa os dois para que um aplicativo fique maior e o outro menor.
</li>
<li>No Nexus Player executando Android N, os aplicativos podem entrar
no <a href="picture-in-picture.html">modo de imagem em imagem</a>, o que permite
que continuem a exibir conteúdo enquanto o usuário navega ou interage com
outros aplicativos.
</li>
<li>Fabricantes de dispositivos maiores podem optar pelo modo de
forma livre, em que o usuário pode redimensionar livremente cada atividade. Se o
fabricante ativar esse recurso, o dispositivo oferecerá o modo de forma livre
e o modo de tela dividida.
</li>
</ul>
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
{@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong>Figura 1.</strong> Dois aplicativos executando lado a lado em modo de tela dividida.
</p>
<p>
O usuário pode mudar para o modo de várias janelas das seguintes maneiras:
</p>
<ul>
<li>Se o usuário abrir a <a href="{@docRoot}guide/components/recents.html">tela
Overview</a> e pressionar longamente um
título de atividade, poderá arrastá-la para uma parte destacada da
tela para colocá-la no modo de várias janelas.
</li>
<li>Se o usuário pressionar longamente o botão Overview, o dispositivo colocará
a atividade atual no modo de várias janelas e abrirá a tela Overview para
permitir que o usuário escolha outra atividade para compartilhar a tela.
</li>
</ul>
<p>
Os usuários podem <a href="{@docRoot}guide/topics/ui/drag-drop.html">arrastar e
soltar</a> dados de uma atividade para outra enquanto as atividades compartilham
a tela. (Anteriormente, os usuários podiam apenas arrastar e soltar dados em uma única
atividade.)
</p>
<h2 id="lifecycle">Ciclo de vida do modo de várias janelas</h2>
<p>
O modo de várias janelas não altera o <a href="{@docRoot}training/basics/activity-lifecycle/index.html">ciclo de vida
da atividade</a>.
</p>
<p>
No modo de várias janelas, somente a atividade com a qual o usuário interagiu mais recentemente
fica ativa em um determinado momento. Essa atividade é considerada a atividade <em>superior</em>.
Todas as outras atividades ficam no estado pausado, mesmo se visíveis.
No entanto, o sistema atribui a essas atividades pausadas, mas visíveis, uma prioridade maior
que a das atividades não visíveis. Se o usuário interagir com uma das
atividades pausadas, ela será retomada e a atividade previamente superior
será pausada.
</p>
<p class="note">
<strong>Observação:</strong> em modo de suporte a várias janelas, um aplicativo pode estar no estado
pausado e continuar visível ao usuário. Pode ser necessário que um aplicativo continue com suas
atividades, mesmo se pausado. Por exemplo, um aplicativo que reproduz vídeo e que está no
modo pausado, mas visível, deve continuar a exibir o vídeo. Por esse
motivo, recomendamos que atividades que reproduzem vídeo <em>não</em> pausem o
vídeo nos manipuladores {@link android.app.Activity#onPause onPause()}.
Em vez disso, o vídeo deve ser pausado em {@link android.app.Activity#onStop
onStop()} e a reprodução retomada em {@link android.app.Activity#onStart
onStart()}.
</p>
<p>
Quando o usuário coloca um aplicativo no modo de várias janelas, o sistema notifica a
atividade sobre a mudança de configuração, como especificado em <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Processamento de alterações
no tempo de execução</a>. Essencialmente, essa alteração afeta
o ciclo de vida da atividade da mesma forma que quando o sistema notifica o aplicativo de que o dispositivo mudou
do modo de retrato para paisagem, exceto que as dimensões do dispositivo são
alteradas, em vez de simplesmente permutadas. Como discutido em <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Processamento de alterações
no tempo de execução</a>, a sua atividade pode processar ela mesma a mudança de configuração ou
permitir que o sistema destrua a atividade e recrie-a com as novas
dimensões.
</p>
<p>
Se o usuário redimensionar uma janela e aumentar uma de suas dimensões, o
sistema redimensionará a atividade para corresponder à ação do usuário e emitirá <a href="{@docRoot}guide/topics/resources/runtime-changes.html">mudanças de tempo de execução</a>
conforme necessário. Se o aplicativo demorar a desenhar nas áreas recém-expostas, o
sistema preencherá temporariamente essas áreas com a cor especificada pelo atributo {@link
android.R.attr#windowBackground windowBackground} ou pelo atributo de estilo padrão
<code>windowBackgroundFallback</code>.
</p>
<h2 id="configuring">Configuração do aplicativo para o modo de várias janelas</h2>
<p>
Se o seu aplicativo for direcionado ao Android N, você poderá configurar como
e se as atividades do aplicativo suportam a exibição em várias janelas. Você pode definir
atributos no manifesto para controlar o tamanho e o layout.
As definições de atributos de uma atividade raiz se aplicam a todas as atividades
em sua pilha de tarefas.
</p>
<p class="note">
<strong>Observação:</strong> se você compilar um aplicativo com várias orientações usando uma versão
do SDK anterior ao Android N e o usuário usar o aplicativo em
modo de suporte a várias janelas, o sistema redimensionará forçosamente o aplicativo. O sistema apresenta uma
caixa de diálogo avisando o usuário de que o aplicativo pode se comportar de forma inesperada. O sistema
<em>não</em> redimensiona aplicativos de orientação fixa; se
o usuário tentar abrir um aplicativo de orientação fixa no modo de várias janelas,
o aplicativo ocupará toda a tela.
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
Defina esse atributo no nó <code>&lt;activity&gt;</code> ou
<code>&lt;application&gt;</code> em seu manifesto para ativar ou desativar a exibição em
várias telas:
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
Se esse atributo for definido como verdadeiro, a atividade poderá ser inicializada nos
modos de tela dividida e forma livre. Se o atributo for definido como falso, a
atividade não oferecerá suporte ao modo de várias janelas. Se esse valor for falso e o
usuário tentar iniciar a atividade no modo de várias janelas, a atividade ocupará
a tela inteira.
</p>
<p>
Se o aplicativo for direcionado ao Android N, mas o valor desse atributo não for
especificado, o atributo assumirá o valor padrão de verdadeiro.
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
Defina esse atributo no nó <code>&lt;activity&gt;</code> ou no seu manifesto para
indicar se a atividade oferece suporte à exibição no modo de imagem em imagem. Esse
atributo será ignorado se <code>android:resizeableActivity</code> for falso.
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">Atributos de layout</h3>
<p>
No Android N, o elemento de manifesto <code>&lt;layout&gt;</code>
oferece suporte a diversos atributos que afetam o comportamento da atividade no
modo de várias janelas:
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
Largura padrão da atividade quando iniciada no modo de forma livre.
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
Altura padrão da atividade quando iniciada no modo de forma livre.
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
Posicionamento inicial da atividade quando iniciada no modo de forma livre. Consulte a
referência de {@link android.view.Gravity} para obter os valores adequados.
</dd>
<dt>
<code>android:minimalSize</code>
</dt>
<dd>
Altura mínima e largura mínima para a atividade nos modos de tela dividida
e forma livre. Se o usuário mover o divisor no modo de tela dividida
para tornar uma atividade menor que o mínimo especificado, o sistema recortará
a atividade para o tamanho solicitado pelo usuário.
</dd>
</dl>
<p>
Por exemplo, o código a seguir mostra como especificar um tamanho e uma localização
padrão para a atividade, bem como o tamanho mínimo, quando a atividade é exibida no
modo de forma livre:
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalSize="450dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">Execução do aplicativo no modo de várias janelas</h2>
<p>
O Android N oferece nova funcionalidade para dar suporte a aplicativos que podem ser executados
no modo de várias janelas.
</p>
<h3 id="disabled-features">Recursos desativados no modo de várias janelas</h3>
<p>
Alguns recursos são desativados ou ignorados quando um dispositivo está no modo de
várias janelas, pois não fazem sentido para uma atividade que pode estar compartilhando a
tela do dispositivo com outras atividades ou aplicativos. Esses recursos incluem:
<ul>
<li>Algumas opções de personalização de <a href="{@docRoot}training/system-ui/index.html">IU do sistema</a>
são desativadas. Por exemplo, os aplicativos não podem ocultar a barra de status
se não estiverem executando no modo de tela cheia.
</li>
<li>O sistema ignora as alterações no atributo <code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code>.
</li>
</ul>
<h3 id="change-notification">Notificações e consultas de mudança no modo de várias janelas</h3>
<p>
Os novos métodos a seguir foram adicionados à classe {@link android.app.Activity}
para oferecer suporte à exibição em várias janelas. Para obter detalhes sobre cada método, consulte a
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência do N Preview SDK</a>.
</p>
<dl>
<dt>
<code>Activity.inMultiWindow()</code>
</dt>
<dd>
Chame para descobrir se a atividade está no modo de várias janelas.
</dd>
<dt>
<code>Activity.inPictureInPicture()</code>
</dt>
<dd>
Chame para descobrir se a atividade está no modo de imagem em imagem.
<p class="note">
<strong>Observação:</strong> o modo de imagem em imagem é um caso especial do
modo de várias janelas. Se <code>myActivity.inPictureInPicture()</code>
retornar verdadeiro, <code>myActivity.inMultiWindow()</code> também retornará
verdadeiro.
</p>
</dd>
<dt>
<code>Activity.onMultiWindowChanged()</code>
</dt>
<dd>
O sistema chama esse método sempre que a atividade entra ou sai do
modo de várias janelas. O sistema passará ao método o valor verdadeiro se a
atividade entrar no modo de várias janelas e falso se a atividade
sair do modo de várias janelas.
</dd>
<dt>
<code>Activity.onPictureInPictureChanged()</code>
</dt>
<dd>
O sistema chama esse método sempre que a atividade entra ou sai do
modo de imagem em imagem. O sistema passará ao método o valor verdadeiro se
a atividade entrar no modo de várias janelas e falso se a atividade
sair do modo de várias janelas.
</dd>
</dl>
<p>
Existem também versões de {@link android.app.Fragment} para cada um desses
métodos como, por exemplo, <code>Fragment.inMultiWindow()</code>.
</p>
<h3 id="entering-pip">Entrar no modo de imagem em imagem</h3>
<p>
Para colocar uma atividade no modo de imagem em imagem, chame o novo método
<code>Activity.enterPictureInPicture()</code>. Esse método não terá efeito se
o dispositivo não oferecer suporte ao modo de imagem em imagem. Para obter mais informações,
consulte a documentação do modo <a href="picture-in-picture.html">imagem em imagem</a>.
</p>
<h3 id="launch">Iniciar novas atividades no modo de várias janelas</h3>
<p>
Quando você iniciar uma nova atividade, poderá indicar ao sistema que a
a nova atividade deverá ser exibida adjacente à atual, se possível. Para fazer
isso, use o sinalizador
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>. A passagem
desse sinalizador solicita o seguinte comportamento:
</p>
<ul>
<li>Se o dispositivo estiver no modo de tela dividida, o sistema tentará criar a
nova atividade ao lado da atividade que a iniciou para que as duas atividades
compartilhem a tela. Nem sempre o sistema conseguirá fazer isso, mas as
atividades ficarão adjacentes, se possível.
</li>
<li>Se o dispositivo não estiver no modo de tela dividida, esse sinalizador não terá efeito.
</li>
</ul>
<p>
Se um dispositivo estiver no modo de forma livre e você iniciar uma nova atividade, poderá
especificar as dimensões e a posição na tela da nova atividade chamando
<code>ActivityOptions.setLaunchBounds()</code>. Esse método não terá efeito se
o dispositivo não estiver no modo de várias janelas.
</p>
<p class="note">
<strong>Observação:</strong> se você iniciar uma atividade em uma pilha de tarefas, essa
atividade substituirá a atividade na tela, herdando todas as
propriedades de suporte a várias janelas. Se você quiser iniciar a nova atividade como janela
separada no modo de várias janelas, inicie essa atividade em uma nova pilha de tarefas.
</p>
<h3 id="dnd">Suporte a arrastar e soltar</h3>
<p>
Os usuários podem <a href="{@docRoot}guide/topics/ui/drag-drop.html">arrastar e
soltar</a> dados de uma atividade para outra enquanto as duas atividades
compartilham a tela. (Anteriormente, os usuários podiam apenas arrastar e soltar dados em uma
única atividade.) Por esse motivo, se o aplicativo não tem a funcionalidade de arrastar e soltar,
pode ser uma boa ideia adicioná-la.
</p>
<p>
O N Preview SDK estende o pacote <a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a>
para oferecer suporte ao recurso arrastar e soltar entre aplicativos. Para obter detalhes sobre os seguintes
métodos e classes, consulte a <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Referência
do Preview SDK</a>.
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
Objeto token responsável por especificar as permissões concedidas ao aplicativo
que recebe uma ação de soltar.
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
Novo alias de {@link android.view.View#startDrag View.startDrag()}. Para
ativar o recurso de arrastar e soltar entre atividades, passe o novo sinalizador
<code>View.DRAG_FLAG_GLOBAL</code>. Se você precisar conceder permissões de URI à
atividade de destino, passe os novos sinalizadores,
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> ou
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code>, conforme o caso.
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
Cancela uma operação de arrastar em andamento. Somente pode ser chamado
pelo aplicativo que originou a operação de arrastar.
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
Substitui a sombra de arrastar para uma operação de arrastar em andamento. Somente
pode ser chamado pelo aplicativo que originou a operação de arrastar.
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
Solicita as permissões dos URIs de conteúdo passados com {@link
android.content.ClipData} contidos em {@link android.view.DragEvent}.
</dd>
</dl>
<h2 id="testing">Teste do suporte a várias janelas em seu aplicativo</h2>
<p>
Atualizando ou não o seu aplicativo para o Android N, você deve
verificar como ele se comporta no modo de várias janelas, pois um usuário pode tentar iniciá-lo
no modo de várias janelas em um dispositivo executando o Android N.
</p>
<h3 id="configuring">Configuração de um dispositivo de teste</h3>
<p>
Se você instalar o Android N em um dispositivo, o modo de tela dividida
será instalado automaticamente.
</p>
<h3 id="test-non-n">Se o aplicativo não foi compilado com o N Preview SDK</h3>
<p>
Se você não compilou o aplicativo com o N Preview SDK e o usuário tentar usar
o aplicativo no modo de várias janelas, o sistema redimensionará obrigatoriamente o aplicativo, a menos que este
declare uma orientação fixa.
</p>
<p>
Se o aplicativo não declarar uma orientação fixa, inicie o aplicativo
em um dispositivo executando Android N e tente colocar o aplicativo no modo
de tela dividida. Verifique se a experiência de usuário é
aceitável quando o aplicativo é redimensionado obrigatoriamente.
</p>
<p>
Se o aplicativo declarar uma orientação fixa, você deverá tentar colocá-lo no
modo de várias janelas. Verifique se, ao fazê-lo, o aplicativo continua
no modo de tela cheia.
</p>
<h3 id="test-mw">Se você oferecer suporte ao modo de várias janelas</h3>
<p>
Se você compilar o aplicativo com o N Preview SDK e não tiver desativado o
suporte a várias janelas, verifique o comportamento a seguir nos modos de tela dividida
e forma livre.
</p>
<ul>
<li>Inicie o aplicativo em modo de tela inteira e mude para o modo de várias janelas
pressionando longamente o botão Overview. Verifique se o aplicativo alterna corretamente.
</li>
<li>Inicie o aplicativo diretamente no modo de várias janelas e verifique se o aplicativo
é iniciado corretamente. Você pode iniciar um aplicativo no modo de várias telas pressionando o
botão Overview, pressionando longamente a barra de título do aplicativo e arrastando-o
para uma das áreas destacadas na tela.
</li>
<li>Redimensione o aplicativo no modo de tela dividida, arrastando a linha divisora.
Verifique se o aplicativo é redimensionado sem falhar e se os elementos de IU necessários
estão visíveis.
</li>
<li>Se você especificou dimensões mínimas para o aplicativo, tente redimensionar
o aplicativo abaixo dessas dimensões. Verifique se não é possível redimensionar o aplicativo
para um tamanho menor que o mínimo especificado.
</li>
<li>Em todos os testes, verifique se o desempenho do aplicativo é aceitável. Por
exemplo, verifique se há uma demora muito grande para atualizar a IU após o
redimensionamento do aplicativo.
</li>
</ul>
<h4 id="test-checklist">Lista de verificação de teste</h4>
<p>
Para verificar o desempenho do aplicativo no modo de várias janelas, experimente as operações
a seguir. Você deve tentar essas operações nos modos de tela dividida e
várias telas, exceto onde houver instruções diferentes.
</p>
<ul>
<li>Entre e saia do modo de várias janelas.
</li>
<li>Alterne do seu aplicativo para outro e verifique se o seu aplicativo se comporta
corretamente enquanto visível, mas não ativo. Por exemplo, se o seu aplicativo estiver
reproduzindo vídeo, verifique se a reprodução não é interrompida quando o usuário
interage com outro aplicativo.
</li>
<li>No modo de tela dividida, tente mover a barra divisora para aumentar e reduzir
o tamanho do aplicativo. Tente essas operações nas configurações lado a lado
e um acima do outro. Verifique se o aplicativo não falha,
se a funcionalidade essencial fica visível e se a operação de redimensionamento não demora
demais.
</li>
<li>Execute várias operações de redimensionamento em rápida sucessão. Verifique se o
aplicativo não falha nem apresenta vazamento de memória. Para obter informações sobre como verificar o uso de memória
do aplicativo, consulte <a href="{@docRoot}tools/debugging/debugging-memory.html">
Investigação do uso de RAM</a>.
</li>
<li>Use o aplicativo normalmente em diversas configurações diferentes de janela e
verifique se o aplicativo se comporta corretamente. Verifique se o texto é legível e se os
elementos de IU não ficam pequenos demais para a interação.
</li>
</ul>
<h3 id="test-disabled-mw">Se você desativou o suporte a várias janelas</h3>
<p>
Se você desativou o suporte a várias janelas definindo
<code>android:resizableActivity="false"</code>, inicie o aplicativo em
um dispositivo executando Android N e tente colocá-lo nos modos
de forma livre e tela dividida. Verifique se, ao fazê-lo, o aplicativo continua
no modo de tela cheia.
</p>

View File

@@ -0,0 +1,214 @@
page.title=Idioma e localidade
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento:</h2>
<ol>
<li><a href="#preN">Desafios ao resolver recursos de idioma</a></li>
<li><a href="#postN">Melhorias na estratégia de resolução de recursos</a></li>
<li><a href="#design">Projetar seu aplicativo para oferecer suporte a
localidades adicionais</a></li>
</ol>
</div>
</div>
<p>O Android N oferece suporte avançado para usuários multilíngues,
permitindo que eles selecionem várias localidades nas configurações. O Android N
fornece esse recurso ao expandir significativamente a quantidade de localidades com suporte
e mudando a forma como o sistema resolve recursos. O novo método para resolver
recursos é mais robusto e foi projetado para ser compatível com APKs existentes, mas
tenha cuidado adicional para identificar comportamentos inesperados. Por exemplo, você
deve testar para garantir que seu aplicativo assuma o idioma esperado por padrão. Além disso,
se seu aplicativo oferecer suporte a vários idiomas, você deverá garantir que esse suporte funcione da maneira
esperada. Por fim, garanta que seu aplicativo possa lidar corretamente
com idiomas que ele não tenha sido explicitamente projetado para suportar.</p>
<p>Este documento começa explicando a estratégia de resolução de recursos anterior ao
Android N. Em seguida, ele descreve a estratégia
de resolução de recursos aprimorada do Android N. Por fim, ele explica como aproveitar as vantagens
do maior número de localidades para oferecer suporte a usuários multilíngues.</p>
<h2 id="preN">Desafios ao resolver recursos de idioma</h2>
<p>Antes do Android N, o Android nem sempre conseguia
corresponder aplicativos e localidades de sistema corretamente. Por exemplo, supondo que o idioma padrão do seu aplicativo
seja o inglês americano, mas que ele também tenha strings em espanhol em arquivos de recurso {@code es_ES}
.</p>
<p>Quando seu código Java fizesse referência a strings, ele resolveria os idiomas das strings da
seguinte maneira:</p>
<ul>
<li>Se um dispositivo fosse definido como {@code es_MX} (espanhol do México), o Android carregaria
strings dos arquivos de recurso {@code es_ES}.</li>
<li>Se um dispositivo fosse definido como {@code en_AU}, o Android assumiria {@code
en_US}. O sistema também assumiria {@code en_US} como padrão se um usuário escolhesse um
idioma não suportado pelo aplicativo, como o francês.</li>
</ul>
<p>Esses problemas de resolução surgiram porque o sistema removia o código de país
da localidade se não encontrasse uma correspondência exata. Por exemplo:</p>
<p class="table-caption" id="t-resource-res">
<strong>Tabela 1.</strong> Resolução de recurso sem uma correspondência exata de localidade.
</p>
<table>
<tbody>
<tr>
<th>Configurações do usuário</th>
<th>Recursos do aplicativo</th>
<th>Resolução do recurso</th>
</tr>
<tr>
<td>fr_CH</td>
<td>
padrão (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Tentativa de fr_CH =&gt; Falha<br>
Tentativa de fr =&gt; Falha<br>
Usar o padrão (en)
</td>
</tr>
</tbody>
</table>
<p>Neste exemplo, o sistema exibe strings em inglês sem saber
se o usuário entende inglês. Esse comportamento é bastante comum
hoje em dia. O Android N deverá reduzir de forma significativa a frequência de
resultados como esse.</p>
<h2 id="postN">Melhorias na estratégia de resolução de recursos</h2>
<p>O Android N proporciona uma resolução de recurso mais robusta e
encontra soluções alternativas melhores. No entanto, para agilizar a resolução e melhorar
a capacidade de manutenção, você deve armazenar os recursos no dialeto pai mais comum.
Por exemplo, se você estava armazenando recursos em espanhol no diretório {@code es-US}
antes, mova-os para o diretório {@code es-419}, que contém o espanhol latino-americano.
Da mesma maneira, se você tiver strings de recurso em uma pasta {@code en-GB}, renomeie
essa pasta para {@code en-001} (inglês internacional), pois o pai mais comum
para strings <code>en-GB</code> é {@code en-001}.
O exemplo a seguir explica por que essas práticas melhoram o desempenho e
a confiabilidade da resolução de recursos.</p>
<h3>Exemplos de resolução de recursos</h3>
<p>Com o Android N, o caso descrito na <strong>Tabela 1</strong> é resolvido
de forma diferente:</p>
<p class="table-caption" id="t-improved-res">
<strong>Tabela 2.</strong> Uma estratégia de resolução melhorada para quando não há
uma correspondência exata para a localidade.</p>
<table>
<tr>
<th>Configurações do usuário</th>
<th>Recursos do aplicativo</th>
<th>Resolução do recurso</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
padrão (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Tentativa de fr_CH =&gt; Falha<br>
Tentativa de fr =&gt; Falha<br>
Tentativa de filhos de fr =&gt; fr_FR<br>
Usar fr_FR
</td>
</tr>
</table>
<p>Agora o usuário obtém recursos em francês em vez de inglês. Esse exemplo também mostra
por que você deve armazenar strings em francês em {@code fr} em vez de em {@code fr_FR}
para o Android N. Nesse caso, a ação necessária é fazer a correspondência com o dialeto pai mais próximo,
tornando a resolução mais rápida e mais previsível.</p>
<p>Além dessa lógica de resolução melhorada, agora o Android oferece mais
idiomas de usuário dentre os quais escolher. Vamos experimentar o exemplo acima novamente com o italiano
especificado como um idioma de usuário adicional, mas sem suporte para francês no aplicativo. </p>
<p class="table-caption" id="t-2d-choice">
<strong>Tabela 3.</strong> Resolução de recurso quando o aplicativo faz a correspondência apenas da
segunda configuração de localidade preferencial do usuário.</p>
<table>
<tr>
<th>Configurações do usuário</th>
<th>Recursos do aplicativo</th>
<th>Resolução do recurso</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
<li> it_CH</li>
</ol>
</td>
<td>
padrão (en)<br>
de_DE<br>
es_ES<br>
it_IT<br>
</td>
<td>
Tentativa de fr_CH =&gt; Falha<br>
Tentativa de fr =&gt; Falha<br>
Tentativa de filhos de fr =&gt; Falha<br>
Tentativa de it_CH =&gt; Falha<br>
Tentativa de it =&gt; Falha<br>
Tentativa de filhos de it =&gt; it_IT<br>
Usar it_IT
</td>
</tr>
</table>
<p>O usuário obtém um idioma que ele compreende, mesmo que o aplicativo não tenha suporte para
o francês.</p>
<h2 id="design">Projetar seu aplicativo para oferecer suporte a localidades adicionais</h2>
<h3>LocaleList API</h3>
<p>O Android N adiciona uma nova API {@code LocaleList.GetDefault()}
que permite que os aplicativos façam uma consulta direta na lista de idiomas especificados por um usuário. Essa API
permite que você crie um comportamento mais sofisticado
para o aplicativo e uma exibição de conteúdo mais otimizada. Por exemplo, uma pesquisa
pode mostrar resultados em vários idiomas com base nas configurações do usuário. Aplicativos de navegador
podem evitar ofertas de tradução de páginas em um idioma que o usuário conhece
e os aplicativos de teclado também podem ativar todos os layouts apropriados automaticamente. </p>
<h3>Formatadores</h3>
<p>Até o Android 6.0 (nível da API 23), o Android oferecia suporte para apenas uma ou duas localidades
para muitos idiomas comuns
(en, es, ar, fr, ru). Como só existiam poucas variantes de cada idioma,
os aplicativos podiam armazenar alguns números e datas como strings no código
nos arquivos de recurso. No entanto, com o conjunto mais amplo de localidades suportadas do Android,
podem existir
diferenças significativas nos formatos de data, hora, moeda e informações
similares dentro da mesma localidade. Colocar formatos no código podem produzir uma
experiência confusa para os usuários. Portanto, ao desenvolver para o Android N,
não deixe de usar formatadores em vez de strings no código para números e datas.</p>
<p>Um bom exemplo é o árabe, cujo suporte no Android N foi expandido de
uma {@code ar_EG} para 27 localidades de árabe. Essas localidades podem compartilhar a maioria dos recursos,
mas algumas preferem dígitos ASCII, enquanto outras preferem dígitos nativos. Por exemplo,
quando você quer criar uma frase com uma variável em dígito, como
“Choose a 4 digit pin”, use formatadores como mostrado abaixo:</p>
<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>

View File

@@ -0,0 +1,328 @@
page.title=Notificações
page.tags=notifications
helpoutsWidget=true
page.image=/preview/images/notifications-card.png
trainingnavtop=true
@jd:body
<div id="qv-wrapper">
<div id="qv">
<!-- table of contents -->
<h2>Este documento inclui</h2>
<ol>
<li><a href="#direct">Resposta direta</a></li>
<li><a href="#bundle">Notificações empacotadas</a></li>
<li><a href="#custom">Visualizações personalizadas</a></li>
</ol>
</div>
</div>
<p>O Android N introduz diversas APIs novas que permitem que aplicativos publiquem
notificações altamente visíveis e interativas.</p>
<p>O Android N estende a API de notificação {@link android.support.v4.app.RemoteInput}
atual para permitir respostas em linha em celulares. Esse recurso permite que os usuários
respondam rapidamente na aba de notificações sem acessar o aplicativo.</p>
<p>
O Android N permite empacotar notificações semelhantes para
exibição como única notificação. Para que isso seja possível, o Android N usa o método {@link
android.support.v4.app.NotificationCompat.Builder#setGroup
NotificationCompat.Builder.setGroup()} existente. Os usuários podem expandir todas as
notificações, executando ações como responder e descartar em cada uma
delas individualmente na aba de notificações.
</p>
<p>Por fim, o Android N também adiciona várias APIs que permitem usar decorações
do sistema nas visualizações de notificação personalizadas do aplicativo. Essas APIs ajudam
a garantir que as visualizações de notificação compartilhem uma apresentação consistente com os
modelos padrão.</p>
<p>Este documento destaca algumas principais mudanças que você deve considerar
ao usar os novos recursos de notificação em aplicativos.</p>
<h2 id="direct">Resposta direta</h2>
<p>Com o recurso de resposta direta no Android N, os usuários podem responder
rapidamente a mensagens de texto ou atualizar listas de tarefas diretamente na interface de
notificação. Em um dispositivo portátil, a ação de resposta em linha aparece como botão adicional
anexado à notificação. Quando um usuário responde pelo teclado, o sistema anexa
a resposta de texto à intenção
especificada como ação de notificação e envia a intenção ao
aplicativo no dispositivo.
<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
{@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
<p class="img-caption">
<strong>Figura 1.</strong> O Android N adiciona o botão de ação
<strong>Reply</strong>.
</p>
<h3>Adição de ações de resposta em linha</h3>
<p>Para criar uma ação de notificação com suporte à resposta direta:
</p>
<ol>
<li>Crie uma instância de {@link android.support.v4.app.RemoteInput.Builder}
que possa ser adicionada à ação de
notificação. O construtor dessa classe aceita uma string, usada pelo sistema como chave
da entrada de texto. Posteriormente, o aplicativo no dispositivo usará essa chave para recuperar o texto
da entrada.
<pre>
// Key for the string that's delivered in the action's intent
private static final String KEY_TEXT_REPLY = "key_text_reply";
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
</pre>
</li>
<li>Anexe o objeto {@link android.support.v4.app.RemoteInput}
a uma ação usando <code>addRemoteInput()</code>.
<pre>
// Create the reply action and add the remote input
Notification.Action action =
new Notification.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
.build();
</pre>
</li>
<li>Aplique a ação a uma notificação e emita a notificação.
<pre>
// Build the notification and add the action
Notification notification =
new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.content))
.addAction(action))
.build();
// Issue the notification
NotificationManager notificationManager =
NotificationManager.from(mContext);
notificationManager.notify(notificationId, notification);
</pre>
</li>
</ol>
<p> O sistema solicita que o usuário informe uma resposta quando acionar a
ação de notificação. </p>
<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
{@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
<p class="img-caption">
<strong>Figura 2.</strong> O usuário insere texto na aba de notificações.
</p>
<h3>Recuperação da entrada do usuário na resposta em linha</h3>
<p>Para receber a entrada do usuário da interface de notificação para a atividade
declarada na intenção de ação de resposta:</p>
<ol>
<li> Chame {@link android.support.v4.app.RemoteInput#getResultsFromIntent
getResultsFromIntent()} passando a intenção da ação de notificação como
parâmetro de entrada. Esse método retorna um {@link android.os.Bundle} que
contém a resposta de texto.
</li>
<pre>
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
</pre>
<li>Consulte a resposta usando a chave de resultado (fornecida ao construtor {@link
android.support.v4.app.RemoteInput.Builder}).
</li>
</ol>
<p>O fragmento de código a seguir mostra como um método recupera o texto de entrada
de um pacote:</p>
<pre>
// Obtain the intent that started this activity by calling
// Activity.getIntent() and pass it into this method to
// get the associated string.
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
return null;
}
</pre>
<p>Os aplicativos podem aplicar lógica para decidir as ações a serem executadas para o texto
recuperado.
Para aplicativos interativos (como bate-papos), forneça mais contexto na própria notificação
(por exemplo, várias linhas de histórico de bate-papo, incluindo as mensagens do próprio usuário)
para que o usuário possa responder de forma adequada.
Quando o usuário responde via {@link android.support.v4.app.RemoteInput},
inclua o texto no histórico de resposta com o método
{@code setRemoteInputHistory()}.</p>
<h2 id="bundle">Notificações empacotadas</h2>
<p>O Android N oferece aos desenvolvedores uma nova forma de representar
uma fila de notificações: <i>notificações empacotadas</i>. Essa forma é semelhante ao recurso
<a href="{@docRoot}training/wearables/notifications/stacks.html">Pilhas
de Notificações</a> no Android Wear. Por exemplo, se o aplicativo criar notificações
para mensagens recebidas, quando mais de uma mensagem for recebida, empacote as
notificações como um único grupo. Você pode
usar o método existente {@link android.support.v4.app.NotificationCompat.Builder#setGroup
Builder.setGroup()} para empacotar notificações semelhantes.</p>
<p>
Um grupo de notificações impõe uma hierarquia nas notificações que o compõe.
Na parte superior dessa hierarquia, está a notificação pai, que exibe informações
resumidas para o grupo. O usuário pode expandir
progressivamente o grupo de notificações e o sistema mostra mais informações à medida que o
usuário aumenta o detalhamento. Quando o usuário expande o pacote, o sistema revela
mais informações para todas as notificações filhas. Quando o usuário
expande uma das notificações, o sistema revela todo o seu conteúdo.
</p>
<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
{@docRoot}preview/images/bundles_2x.png 2x" width="300">
<p class="img-caption">
<strong>Figura 3.</strong> O usuário pode expandir progressivamente o grupo
de notificações.
</p>
<p>Para saber como adicionar notificações a um grupo, consulte
<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Adicionar
cada notificação a um grupo</a>.</p>
<h3 id="best-practices">Práticas recomendadas para notificações empacotadas</h3>
<p>Esta seção oferece diretrizes sobre quando usar grupos de notificações em vez
de notificações {@link android.app.Notification.InboxStyle InboxStyle}
que foram disponibilizadas em versões anteriores da
plataforma Android.</p>
<h3>Quando usar notificações empacotadas</h3>
<p>Você deve usar grupos de notificações apenas quando todas as condições a seguir forem
verdadeiras para o seu caso de uso:</p>
<ul>
<li>As notificações filhas são notificações completas e podem ser exibidas
individualmente sem necessidade de um resumo do grupo.</li>
<li>A exibição individual de notificações filhas pode ser vantajosa. Por
exemplo:
</li>
<ul>
<li>Elas são acionáveis, sem ações específicas para cada filha.</li>
<li>Há mais informações na filha que as que o usuário quer ler.</li>
</ul>
</ul>
<p>Os exemplos de bons casos de uso para grupos de notificações incluem: um aplicativo de mensagens
exibindo uma lista de mensagens recebidas ou um aplicativo de e-mail exibindo uma lista de
e-mails recebidos.</p>
<p>
Os exemplos de casos em que uma única notificação é preferível
incluem mensagens individuais de uma única pessoa ou uma representação em lista
de itens de texto com uma única linha. Você pode usar
({@link android.app.Notification.InboxStyle InboxStyle} ou
{@link android.app.Notification.BigTextStyle BigTextStyle}) para
isso.
</p>
<h3 id ="post">Exibição de notificações empacotadas</h3>
<p>
O aplicativo deve sempre publicar um resumo do grupo, mesmo se o grupo tiver apenas uma
única filha. O sistema suprimirá o resumo e exibirá diretamente a
notificação filha se ela contiver apenas uma única notificação. Isso garante
que o sistema possa oferecer uma experiência consistente quando o usuário deslizar por
filhas de um grupo.
</p>
<p class="note">
<strong>Observação:</strong> esta versão do Android N ainda não
elimina o resumo de grupos de notificações contendo uma única filha. Essa
funcionalidade será adicionada em uma versão posterior do Android N.
</p>
<h3>Observação de notificações</h3>
<p>Embora o sistema normalmente exiba notificações filhas como grupo, você pode
configurá-las para exibição temporária como
<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">
notificações heads-up</a>. Esse recurso é particularmente útil porque permite
acesso imediato à filha mais recente e a suas ações associadas.
</p>
<h3>Compatibilidade com versões anteriores</h3>
<p>
Os grupos de notificações e as entradas remotas fazem parte da API {@link
android.app.Notification} desde o Android 5.0 (nível da API 21) para oferecer suporte a
dispositivos Android Wear. Se você já criou notificações com essas APIs,
a única ação necessária é verificar se o comportamento do aplicativo corresponde
às diretrizes descritas acima e considerar a implementação de {@code
setRemoteInputHistory()}.
</p>
<p>
Para compatibilidade com versões anteriores, as mesmas APIs estão disponíveis com
a classe {@link android.support.v4.app.NotificationCompat} da biblioteca de suporte
, permitindo criar notificações que funcionem em versões anteriores do
Android. Em celulares e tablets, os usuários somente visualizam as notificações resumidas.
Portanto, um aplicativo deve ter uma notificação no estilo de caixa de entrada ou equivalente,
representativa de todo o conteúdo de informações do grupo. Como dispositivos Android
Wear permite que os usuários vejam todos as notificações filhas, mesmo em níveis
de plataforma antigos, você deve criar notificações filhas independentemente do nível
da API.
</p>
<h2 id="custom"> Visualizações personalizadas</h2>
<p>Começando com o Android N, é possível personalizar visualizações de notificação e
continuar obtendo decorações de sistema, como cabeçalhos de notificação, ações e layouts
expansíveis.</p>
<p>Para ativar esses recursos, o Android N adiciona as seguintes APIs para aplicar estilo à
visualização personalizada:</p>
<dl>
<dt>
{@code DecoratedCustomViewStyle()}</dt>
<dd> Aplica estilo a notificações que não sejam notificações
de mídia.</dd>
<dt>
{@code DecoratedMediaCustomViewStyle()}</dt>
<dd> Aplica estilo a notificações de mídia.</dd>
</dl>
<p>Para usar essa nova API, chame o método {@code setStyle()}, passando o
estilo de visualização personalizada desejado.</p>
<p>Este fragmento mostra como construir um objeto de notificação personalizada com o método
{@code DecoratedCustomViewStyle()}.</p>
<pre>
Notification noti = new Notification.Builder()
.setSmallIcon(R.drawable.ic_stat_player)
.setLargeIcon(albumArtBitmap))
.setCustomContentView(contentView);
.setStyle(new Notification.DecoratedCustomViewStyle())
.build();
</pre>

View File

@@ -0,0 +1,186 @@
page.title=Imagem em imagem
page.keywords=preview,sdk,PIP,Picture-in-picture
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#declaring">Declarar que sua atividade oferece suporte ao modo de
imagem em imagem</a></li>
<li><a href="#pip_button">Alternar sua atividade para o modo de imagem em imagem</a>
</li>
<li><a href="#handling_ui">Lidar com a interface durante o modo de imagem em imagem</a>
</li>
<li><a href="#continuing_playback">Continuar a reprodução de vídeos no modo de
imagem em imagem</a></li>
<li><a href="#best">Práticas recomendadas</a></li>
</ol>
<h2>Veja também</h2>
<ol>
<li><a href="{@docRoot}preview/features/multi-window.html">Suporte a
várias janelas</a></li>
</ol>
</div>
</div>
<p>No Android N, os usuários do Android TV agora podem assistir a um vídeo
em uma janela fixada em um canto da tela enquanto navegam em
aplicativos. O modo de imagem em imagem (PIP) permite que os aplicativos executem uma atividade de vídeo
na janela fixada enquanto outra atividade continua em
segundo plano. A janela do PIP permite que os usuários realizem várias tarefas enquanto usam seu aplicativo, o que os
ajuda a ser mais produtivos.</p>
<p>Seu aplicativo pode decidir quando acionar o modo de PIP. Veja alguns exemplos de
quando entrar no modo de PIP:</p>
<ul>
<li>Seu aplicativo pode passar um vídeo para o modo de PIP quando o usuário
sai do vídeo para navegar por outro conteúdo.</li>
<li>Seu aplicativo pode passar um vídeo para o modo de PIP quando um usuário assiste ao final
de um episódio de conteúdo. A janela principal exibe informações promocionais ou de resumo
sobre o próximo episódio da série.</li>
<li>Seu aplicativo pode fornecer uma maneira de os usuários colocarem conteúdo adicional em uma fila enquanto
assistem a um vídeo. O vídeo continua a ser reproduzido no modo de PIP enquanto a tela principal
exibe uma atividade de seleção de conteúdo.</li>
</ul>
<p>A janela do modo de PIP tem 240x135 dp e é mostrada na camada superior de um dos
quatro cantos da tela, escolhido pelo sistema. O usuário pode exibir um
menu de PIP que permite que coloque a janela do PIP em tela inteira ou feche-a
ao pressionar o botão <b>Home</b> do controle remoto. Se outro
vídeo começar a ser reproduzido na tela principal, a janela do PIP será fechada
automaticamente. Os usuários também podem fechar a janela do PIP em Recents.</p>
<img src="{@docRoot}preview/images/pip-active.png" />
<p class="img-caption"><strong>Figura 1.</strong> Um vídeo no modo de imagem em imagem
visível no canto da tela enquanto o usuário navega por conteúdo
na janela principal.</p>
<p>O PIP utiliza as APIs de várias janelas disponíveis no Android N para
fornecer a janela sobreposta de vídeo fixo. Para adicionar o modo de PIP ao seu aplicativo, você deve
registrar as atividades que oferecem suporte a PIP, alternar a atividade para o modo de PIP conforme
a necessidade e garantir que os elementos de interface sejam ocultados e que a reprodução do vídeo continue quando
a atividade estiver no modo de PIP.</p>
<h2 id="declaring">Declarar que sua atividade oferece suporte ao modo de imagem em imagem</h2>
<p>Por padrão, o sistema não oferece suporte ao modo de PIP automaticamente para seus aplicativos.
Se quiser esse suporte para seu aplicativo, registre a atividade
de vídeo no manifesto definindo
<code>android:supportsPictureInPicture</code> e
<code>android:resizeableActivity</code> como <code>true</code>. Além disso, especifique
que a atividade processa alterações na configuração de layout de forma que a atividade
não seja reiniciada quando ocorrem essas alterações durante as transições do modo de PIP.</p>
<pre>
&lt;activity android:name="VideoActivity"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
</pre>
<p>Ao registrar a atividade, lembre-se de que, no modo de PIP, ela
é mostrada em uma pequena janela sobreposta em uma tela de TV. Atividades de reprodução de
vídeo com uma quantidade mínima de itens de interface oferecem a melhor experiência para o usuário. Atividades que contêm
pequenos elementos de interface podem não oferecer uma boa experiência para o usuário
no modo de PIP, pois ele não conseguirá enxergar os detalhes desses elementos
na janela do PIP.</p>
<h2 id="pip_button">Alternar sua atividade para o modo de imagem em imagem</h2>
Quando precisar colocar a atividade no modo de PIP, chame
<code>Activity.enterPictureInPicture()</code>. Os exemplos a seguir entram
no modo de PIP quando o usuário seleciona um botão dedicado ao PIP em uma barra de controle
de mídia:</p>
<pre>
&#64;Override
public void onActionClicked(Action action) {
if (action.getId() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPicture();
return;
}
...
</pre>
<p>Adicionar um botão de PIP à sua barra de controle de mídia permite que o usuário entre no
modo de PIP com facilidade ao controlar a reprodução de um vídeo.</p>
<img src="{@docRoot}preview/images/pip-button.png" />
<p class="img-caption"><strong>Figura 1.</strong> Um botão do
modo de imagem em imagem em uma barra de controle de mídia.</p>
<p>O Android N inclui uma nova classe
<code>PlaybackControlsRow.PictureInPictureAction</code> que define ações do PIP
para a barra de controle e usa o ícone do PIP.</p>
<h2 id="handling_ui">Lidar com a interface durante o modo de imagem em imagem</h2>
<p>Quando a atividade entra no modo de PIP, ela deve mostrar apenas a reprodução do
vídeo. Remova elementos de interface antes que a atividade entre no modo de PIP
e restaure esses elementos quando a atividade voltar ao modo de tela inteira.
Substitua <code>Activity.onPictureInPictureChanged()</code> ou
<code>Fragment.onPictureInPictureChanged()</code> e ative ou
desative os elementos de interface conforme for necessário. Por exemplo:</p>
<pre>
&#64;Override
public void onPictureInPictureChanged(boolean inPictureInPicture) {
if (inPictureInPicture) {
// Hide the controls in picture-in-picture mode.
...
} else {
// Restore the playback UI based on the playback status.
...
}
}
</pre>
<h2 id="continuing_playback">Continuar a reprodução de vídeos no modo de
imagem em imagem</h2>
<p>Quando a atividade entra no modo de PIP, o sistema a considera
pausada e chama o método <code>onPause()</code> da atividade. A reprodução
de vídeos não deverá ser pausada se a atividade
for pausada devido ao modo de PIP. Verifique o PIP no método
<code>onPause()</code> da atividade e realize a reprodução da forma apropriada. Por
exemplo:</p>
<pre>
&#64;Override
public void onPause() {
// If called due to PIP, do not pause playback
if (inPictureInPicture()) {
// Continue playback
...
}
// If paused but not in PIP, pause playback if necessary
...
}
</pre>
<p>Quando a atividade sai do modo de PIP e volta à tela inteira, o
sistema retoma a atividade e chama o método <code>onResume()</code>.</p>
<h2 id="best">Práticas recomendadas</h2>
<p>O PIP é destinado a atividades que reproduzem vídeos em tela inteira. Ao passar
a atividade para o modo de PIP, evite mostrar qualquer coisa que não seja o conteúdo do vídeo.
Rastreie quando a atividade entrar no modo de PIP e oculte os elementos de interface, conforme descrito
em <a href="#handling_ui">Lidar com a interface durante o modo de imagem em imagem</a>.</p>
<p>Como a janela do PIP é mostrada como uma janela flutuante no canto da
tela, você deve evitar exibir informações essenciais em qualquer área
da janela principal que possa ser ocultada pela janela do PIP.</p>
<p>Quando uma atividade está no modo de PIP, ela não recebe foco de entrada por padrão. Para
receber eventos de entrada no modo de PIP, use
<code>MediaSession.setMediaButtonReceiver()</code>.</p>

View File

@@ -0,0 +1,124 @@
page.title=Acesso a diretórios com escopo
page.keywords=preview,sdk,scoped directory access
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#accessing">Acessar um diretório de armazenamento externo</a></li>
<li><a href="#removable">Acessar um diretório em uma mídia removível</a></li>
<li><a href="#best">Práticas recomendadas</a></li>
</ol>
</div>
</div>
<p>Aplicativos, como aplicativos de fotos, normalmente só precisam acessar diretórios específicos de um
armazenamento externo, como o diretório <code>Pictures</code>. As abordagens
existentes para o acesso de armazenamentos externos não foram desenvolvidas para fornecer com facilidade
acesso direcionado a diretórios para esses tipos de aplicativos. Por exemplo:</p>
<ul>
<li>Solicitar {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}
ou {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} em seu manifesto
permite o acesso a todos os diretórios públicos no armazenamento externo, o que pode ser mais do
que o aplicativo precisa.</li>
<li>Usar a
<a href="{@docRoot}guide/topics/providers/document-provider.html">Estrutura de
acesso ao armazenamento</a> geralmente faz com que o usuário selecione diretórios
por meio de uma interface de sistema, o que é desnecessário se seu aplicativo sempre acessa o mesmo
diretório externo.</li>
</ul>
<p>O Android N fornece uma nova API simplificada para acessar
diretórios de armazenamento externo comuns. </p>
<h2 id="accessing">Acessar um diretório de armazenamento externo</h2>
<p>Use a classe <code>StorageManager</code> para obter a instância
<code>StorageVolume</code> apropriada. Em seguida, crie uma intenção chamando o método
<code>StorageVolume.createAccessIntent()</code> dessa instância.
Use essa intenção para acessar os diretórios de armazenamento externo. Para obter uma lista de
todos os volumes disponíveis, incluindo volumes de mídias removíveis, use
<code>StorageManager.getVolumesList()</code>.</p>
<p>O fragmento de código a seguir é um exemplo de como abrir o diretório
<code>Pictures</code> no armazenamento compartilhado principal:</p>
<pre>
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<p>O sistema tenta conceder acesso ao diretório externo e,
se necessário, confirma o acesso com o usuário usando uma interface simplificada:</p>
<img src="{@docRoot}preview/images/scoped-folder-access-framed.png" srcset="{@docRoot}preview/images/scoped-folder-access-framed.png 1x,
{@docRoot}preview/images/scoped-folder-access-framed_2x.png 2x" />
<p class="img-caption"><strong>Figura 1.</strong> Um aplicativo solicitando
acesso ao diretório Pictures.</p>
<p>Se o usuário conceder o acesso, o sistema chamará sua substituição de
<code>onActivityResult()</code> com um código de resultado de
<code>Activity.RESULT_OK</code> e os dados de intenção que contêm o URI. Use
o URI fornecido para acessar as informações do diretório, o que é semelhante a usar URIs
retornados pela
<a href="{@docRoot}guide/topics/providers/document-provider.html">Estrutura de
acesso ao armazenamento</a>.</p>
<p>Se o usuário não conceder o acesso, o sistema chamará sua substituição de
<code>onActivityResult()</code> com um código de resultado de
<code>Activity.RESULT_CANCELED</code> e dados de intenção nulos.</p>
<p class="note"><b>Observação</b>: Ao obter acesso a um diretório externo específico,
você também obtém acesso aos subdiretórios dentro do diretório em questão.</p>
<h2 id="removable">Acessar um diretório em uma mídia removível</h2>
<p>Para usar o Acesso a diretórios com escopo para acessar diretórios em uma mídia removível,
primeiro adicione um {@link android.content.BroadcastReceiver} que escute a notificação
{@link android.os.Environment#MEDIA_MOUNTED}. Por exemplo:</p>
<pre>
&lt;receiver
android:name=".MediaMountedReceiver"
android:enabled="true"
android:exported="true" &gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MEDIA_MOUNTED" /&gt;
&lt;data android:scheme="file" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>Quando o usuário monta uma mídia removível, como um cartão SD, o sistema envia uma notificação
{@link android.os.Environment#MEDIA_MOUNTED}. Essa notificação
fornece um objeto <code>StorageVolume</code> nos dados de intenção que
você pode usar para acessar os diretórios na mídia removível. O exemplo a seguir
acessa o diretório <code>Pictures</code> na mídia removível:</p>
<pre>
// BroadcastReceiver has already cached the MEDIA_MOUNTED
// notification Intent in mediaMountedIntent
StorageVolume volume = (StorageVolume)
mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);
</pre>
<h2 id="best">Práticas recomendadas</h2>
<p>Quando possível, mantenha o URI de acesso a diretórios externos para que você não precise
solicitar acesso ao usuário várias vezes. Quando o usuário conceder o acesso, chame
<code>getContentResolver().takePersistableUriPermssion()</code> com o
URI de acesso ao diretório. O sistema manterá o URI e as solicitações de acesso
subsequentes retornarão <code>RESULT_OK</code> e não mostrarão a mensagem de confirmação para o
usuário.</p>
<p>Se o usuário negar acesso a um diretório externo, não repita a
solicitação imediatamente. Insistir em solicitações de acesso repetidas vezes gera uma experiência
negativa para o usuário.</p>

View File

@@ -0,0 +1,744 @@
page.title=Configurações de segurança de rede
page.keywords=preview,security,network
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#manifest">Adicionar um arquivo de configurações de segurança</a></li>
<li><a href="#CustomTrust">Personalizar CAs confiáveis</a>
<ol>
<li><a href="#ConfigCustom">Configurar uma CA personalizada confiável</a></li>
<li><a href="#LimitingCas">Limitar o conjunto de CAs confiáveis</a></li>
<li><a href="#TrustingAdditionalCas">Confiar em CAs adicionais</a></li>
</ol>
</li>
<li><a href="#TrustingDebugCa">CAs somente de depuração</a></li>
<li><a href="#UsesCleartextTraffic">Cancelar uso de tráfego de texto simples</a></li>
<li><a href="#CertificatePinning">Fixar certificados</a></li>
<li><a href="#ConfigInheritance">Comportamento de herança de configuração</a></li>
<li><a href="#FileFormat">Formato do arquivo de configurações</a></li>
</ol>
</div>
</div>
<p>
O Android N inclui um recurso de configurações de segurança de rede
que permite que os aplicativos personalizem as configurações de segurança de rede em um arquivo de configurações declarativo e seguro
sem modificar o código do aplicativo. Essas configurações podem
ser definidas para domínios específicos e para um aplicativo específico. Os principais
recursos são:
</p>
<ul>
<li>
<b>Âncoras de confiança personalizadas:</b> personalize quais autoridades de certificado (CA)
são confiáveis para as conexões seguras de um aplicativo. Por
exemplo, confiar em certificados autoassinados privados ou restringir
o conjunto de CAs públicas nas quais o aplicativo confia.
</li>
<li>
<b>Substituições somente depuração:</b> depure conexões seguras do aplicativo com segurança,
sem adicionar riscos à base instalada.
</li>
<li>
<b>Cancelar uso de tráfego de texto simples:</b> proteja aplicativos contra
o uso acidental de tráfego de texto simples.
</li>
<li>
<b>Fixar certificados:</b> restrinja a conexão segura de um aplicativo
a certificados específicos.
</li>
</ul>
<h2 id="manifest">Adicionar um arquivo de configurações de segurança</h2>
<p>
O recurso de configurações de segurança de rede usa um arquivo XML no qual você especifica
as configurações do seu aplicativo. Inclua uma entrada no manifesto do seu
aplicativo para apontar para esse arquivo. Este trecho de código de um manifesto
demonstra como criar essa entrada:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
...
&lt;app ...&gt;
&lt;meta-data android:name="android.security.net.config"
android:resource="@xml/network_security_config" /&gt;
...
&lt;/app&gt;
</pre>
<h2 id="CustomTrust">Personalizar CAs confiáveis</h2>
<p>
Um aplicativo pode querer confiar em um conjunto personalizado de CAs em vez de no padrão
da plataforma. Os motivos mais comuns para isso são:
</p>
<ul>
<li>Conectar-se a um host com uma autoridade de certificado personalizada (autoassinada,
emitida por uma CA corporativa interna etc.).
</li>
<li>Limitar o conjunto de CAs para apenas aquelas nas quais você confia em vez de todas
as CAs pré-instaladas.
</li>
<li>Confiar em CAs adicionais não incluídas no sistema.
</li>
</ul>
<p>
Por padrão, conexões seguras (por exemplo, TLS, HTTPS) de todos os aplicativos confiam
nas CAs pré-instaladas do sistema e os aplicativos direcionados ao nível da API 23
(Android M) e inferior também confiam no repositório de CAs adicionadas pelo usuário por padrão. Um
aplicativo pode personalizar as próprias conexões usando {@code base-config} (para
personalização em todo o aplicativo) ou {@code domain-config} (para personalização
por domínio).
</p>
<h3 id="ConfigCustom">Configurar uma CA personalizada</h3>
<p>
Suponhamos que você queira se conectar a um host que use um certificado SSL autoassinado
ou a um host cujo certificado SSL foi emitido por uma CA não pública
na qual confia, como a CA interna da sua empresa.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
Adicione o certificado da CA autoassinada ou não pública em formato PEM ou DER em
{@code res/raw/my_ca}.
</p>
<h3 id="LimitingCas">Limitar o conjunto de CAs confiáveis</h3>
<p>
Um aplicativo que não queira confiar em todas as CAs nas quais o sistema confia
pode especificar o próprio conjunto limitado de CAs confiáveis. Isso protege o
aplicativo contra certificados fraudulentos emitidos por qualquer outra CA.
</p>
<p>
A configuração para limitar o conjunto de CAs confiáveis é semelhante a <a href="#TrustingACustomCa">confiar em uma CA personalizada</a> para um domínio específico, mas
fornecendo várias CAs no recurso.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;domain includeSubdomains="true"&gt;cdn.example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/trusted_roots"/&gt;
&lt;/trust-anchors&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<p>
Adicione as CAs confiáveis em formato PEM ou DER em {@code res/raw/trusted_roots}.
Observe que, ao usar o formato PEM, o arquivo deve conter <em>somente</em> dados PEM,
sem texto adicional. Você também pode fornecer vários elementos
<a href="#certificates"><code>&lt;certificates&gt;</code></a>
em vez de um.
</p>
<h3 id="TrustingAdditionalCas">
Confiar em CAs adicionais
</h3>
<p>
Um aplicativo pode querer confiar em CAs adicionais nas quais o sistema não confia.
Isso pode ocorrer se o sistema ainda não incluiu a CA ou se a CA
não atender aos requisitos de inclusão no sistema Android. O
aplicativo pode fazer isso ao especificar várias fontes de certificados para uma
configuração.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/extracas"/&gt;
&lt;certificates src="system"/&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="TrustingDebugCa">Configurar CAs para depuração</h2>
<p>
Ao depurar um aplicativo conectado por HTTPS, você pode querer
se conectar a um servidor de desenvolvimento local que não tenha o certificado SSL
do seu servidor de produção. Para fazer isso sem
modificar o código do aplicativo, você pode especificar CAs somente de depuração que
sejam confiáveis <i>apenas</i> quando <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">
android:debuggable</a>
for {@code true} ao usar {@code debug-overrides}. Normalmente, IDEs e ferramentas de compilação
definem esse sinalizador automaticamente para compilações de não lançamento.
</p>
<p>
Isso é mais seguro do que o código condicional normal, pois, como medida
de segurança, os repositórios do aplicativo não aceitam aplicativos marcados como
depuráveis.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/debug_cas"/&gt;
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="UsesCleartextTraffic">Cancelar uso de tráfego de texto simples</h2>
<p>
Aplicativos que pretendem se conectar a destinos usando apenas conexões
seguras podem cancelar o uso de texto simples de suporte (usando o protocolo HTTP não criptografado
em vez de HTTPS) para esses destinos. Essa opção ajuda a evitar
regressões acidentais em aplicativos devido a alterações nos URLs fornecidos por fontes externas,
como servidores de back-end.
Consulte {@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted
NetworkSecurityPolicy.isCleartextTrafficPermitted()} para saber mais.
</p>
<p>
Por exemplo, um aplicativo pode querer garantir que todas as conexões com {@code
secure.example.com} sejam sempre realizadas por HTTPS para proteger o tráfego confidencial
de redes hostis.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config usesCleartextTraffic="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="CertificatePinning">Fixar certificados</h2>
<p>
Normalmente, um aplicativo confia em todas as CAs pré-instaladas. Se qualquer uma dessas CAs
emitir um certificado fraudulento, o aplicativo estará em risco de ataques
MiTM. Alguns aplicativos optam por limitar o conjunto de certificados que aceitam
restringindo o conjunto de CAs ou fixando certificados.
</p>
<p>
A fixação de certificados é realizada ao fornecer um conjunto de certificados pelo hash da
chave pública (SubjectPublicKeyInfo do certificado X.509). Uma cadeia de certificados
é válida somente se contiver pelo menos uma
das chaves públicas fixadas.
</p>
<p>
Observe que, ao usar a fixação de certificados, você deve sempre incluir uma chave de backup
para que, se você for forçado a alternar para novas chaves ou alterar as CAs (ao
fixar um certificado de CA ou um intermediário dessa CA), a
conectividade do seu aplicativo não seja afetada. Caso contrário, você precisará enviar
uma atualização ao aplicativo para restaurar a conectividade.
</p>
<p>
Além disso, é possível definir um tempo de expiração para as fixações, após o qual
elas não sejam mais realizadas. Isso ajuda a evitar problemas de conectividade
em aplicativos que não foram atualizados. No entanto, definir um tempo de expiração
para fixações pode permitir que as fixações sejam ignoradas.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;pin-set expiration="2018-01-01"&gt;
&lt;pin digest="SHA-256"&gt;7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=&lt;/pin&gt;
&lt;!-- backup pin --&gt
&lt;pin digest="SHA-256"&gt;fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=&lt;/pin&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="ConfigInheritance">Comportamento de herança de configuração</h2>
<p>
Valores não definidos em uma configuração específica são herdados. Esse comportamento permite
configurações mais complexas, mantendo o arquivo de configuração legível.
</p>
<p>
Se um valor não for definido em uma entrada específica, o valor da próxima entrada
mais genérica será usado. Valores não definidos em um {@code domain-config} são
obtidos pelo {@code domain-config} pai, se aninhados, ou, caso contrário, pelo {@code
base-config}. Valores não definidos no {@code base-config} usam os
valores padrão da plataforma.
</p>
<p>
Por exemplo, considere um caso no qual todas as conexões para subdomínios de {@code
example.com} devem usar um conjunto personalizado de CAs. Além disso, o tráfego de texto simples para esses
domínios é permitido <em>exceto</em> ao se conectar com {@code
secure.example.com}. Ao aninhar a configuração para {@code
secure.example.com} dentro da configuração para {@code example.com}, o
{@code trust-anchors} não precisa ser duplicado.
</p>
<p>
<code>res/xml/network_security_config.xml</code>:
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;domain-config&gt;
&lt;domain includeSubdomains="true"&gt;example.com&lt;/domain&gt;
&lt;trust-anchors&gt;
&lt;certificates src="@raw/my_ca"/&gt;
&lt;/trust-anchors&gt;
&lt;domain-config cleartextTrafficPermitted="false"&gt;
&lt;domain includeSubdomains="true"&gt;secure.example.com&lt;/domain&gt;
&lt;/domain-config&gt;
&lt;/domain-config&gt;
&lt;/network-security-config&gt;
</pre>
</p>
<h2 id="FileFormat">Formato do arquivo de configurações</h2>
<p>
O recurso de configurações de segurança de rede usa um arquivo no formato XML.
A estrutura geral desse arquivo é mostrada no seguinte exemplo de código:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;network-security-config&gt;
&lt;base-config&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
&lt;domain-config&gt;
&lt;domain&gt;android.com&lt;/domain&gt;
...
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;pin-set&gt;
&lt;pin digest="..."&gt;...&lt;/pin&gt;
...
&lt;/pin-set&gt;
&lt;/domain-config&gt;
...
&lt;debug-overrides&gt;
&lt;trust-anchors&gt;
&lt;certificates src="..."/&gt;
...
&lt;/trust-anchors&gt;
&lt;/debug-overrides&gt;
&lt;/network-security-config&gt;
</pre>
<p>
As seções a seguir descrevem a sintaxe e outros detalhes do formato do
arquivo.
</p>
<h3 id="network-security-config">
&lt;network-security-config&gt;
</h3>
<dl class="xml">
<dt>
pode conter:
</dt>
<dd>
0 ou 1 de <code><a href="#base-config">&lt;base-config&gt;</a></code><br>
Qualquer número de <code><a href=
"#domain-config">&lt;domain-config&gt;</a></code><br>
0 ou 1 de <code><a href="#debug-overrides">&lt;debug-overrides&gt;</a></code>
</dd>
</dl>
<h3 id="base-config">
&lt;base-config&gt;
</h3>
<dl class="xml">
<dt>
sintaxe:
</dt>
</dl>
<pre class="stx">
&lt;base-config <a href=
"#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/base-config&gt;
</pre>
<dl class="xml">
<dt>
pode conter:
</dt>
<dd>
<code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
descrição:
</dt>
<dd>
A configuração padrão usada por todas as conexões cujo destino não é
coberto por um <a href="#domain-config"><code>domain-config</code></a>.
<p>
Qualquer valor não definido usa os valores padrão da plataforma. A configuração padrão
para aplicativos direcionados a níveis de API acima do 24:
</p>
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
A configuração padrão para aplicativos direcionados a níveis de API 23 e inferiores:
<pre>
&lt;base-config usesCleartextTraffic="true"&gt;
&lt;trust-anchors&gt;
&lt;certificates src="system" /&gt;
&lt;certificates src="user" /&gt;
&lt;/trust-anchors&gt;
&lt;/base-config&gt;
</pre>
</dd>
</dl>
<h3 id="domain-config">&lt;domain-config&gt;</h3>
<dl class="xml">
<dt>sintaxe:</dt>
<dd>
<pre class="stx">&lt;domain-config <a href="#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]&gt;
...
&lt;/domain-config&gt;</pre>
</dd>
<dt>Pode conter:</dt>
<dd>
1 ou mais <code><a href="#domain">&lt;domain&gt;</a></code>
<br/>0 ou 1 <code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
<br/>0 ou 1 <code><a href="#pin-set">&lt;pin-set&gt;</code></a>
<br/>Qualquer número de <code>&lt;domain-config&gt;</code> aninhados</dd>
<dt>Descrição</dt>
<dd>A configuração usada para conexões com destinos específicos, conforme é definido pelos elementos {@code domain}.
<p>Observe que, se vários elementos {@code domain-config} cobrirem um destino, a configuração com a regra de domínio correspondente
mais específica (mais longa) será usada.</p></dd>
</dl>
<h3 id="domain">&lt;domain&gt;</h3>
<dl class="xml">
<dt>
sintaxe:
</dt>
<dd>
<pre class="stx">
&lt;domain includeSubdomains=["true" | "false"]&gt;example.com&lt;/domain&gt;
</pre>
</dd>
<dt>
Atributos:
</dt>
<dd>
<dl class="attr">
<dt>
{@code includeSubdomains}
</dt>
<dd>
Se {@code "true"}, a regra de domínio corresponderá ao domínio e a todos os
subdomínios, incluindo subdomínios de subdomínios. Caso contrário, a regra
se aplica apenas a correspondências exatas.
</dd>
</dl>
</dd>
<dt>
Descrição:
</dt>
</dl>
<h3 id="debug-overrides">&lt;debug-overrides&gt;</h3>
<dl class="xml">
<dt>
sintaxe:
</dt>
<dd>
<pre class="stx">
&lt;debug-overrides&gt;
...
&lt;/debug-overrides&gt;
</pre>
</dd>
<dt>
Pode conter:
</dt>
<dd>
0 ou 1 <code><a href="#trust-anchors">&lt;trust-anchors&gt;</a></code>
</dd>
<dt>
Descrição:
</dt>
<dd>
Substituições a serem aplicadas quando <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
for {@code "true"}, o que normalmente ocorre em compilações de não lançamento
geradas por IDEs e ferramentas de compilação. Âncoras de confiança especificadas em {@code
debug-overrides} são adicionadas a todas as demais configurações e a fixação
de certificados não é realizada quando a cadeia de certificados do servidor usar uma
dessas âncoras de confiança de somente depuração. Se <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
for {@code "false"}, esta seção será ignorada por completo.
</dd>
</dl>
<h3 id="trust-anchors">&lt;trust-anchors&gt;</h3>
<dl class="xml">
<dt>
sintaxe:
</dt>
<dd>
<pre class="stx">
&lt;trust-anchors&gt;
...
&lt;/trust-anchors&gt;
</pre>
</dd>
<dt>
Pode conter:
</dt>
<dd>
Qualquer número de <code><a href="#certificates">&lt;certificates&gt;</a></code>
</dd>
<dt>
Descrição:
</dt>
<dd>
Conjunto de âncoras de confiança para conexões seguras.
</dd>
</dl>
<h3 id="certificates">&lt;certificates&gt;</h3>
<dl class="xml">
<dt>sintaxe:</dt>
<dd><pre class="stx">&lt;certificates src=["system" | "user" | "<i>raw resource</i>"]
overridePins=["true" | "false"] /&gt;
</pre></dd>
<dt>descrição:</dt>
<dd>Conjunto de certificados X.509 para elementos {@code trust-anchors}.</dd>
<dt>atributos:</dt>
<dd><dl class="attr">
<dt>{@code src}</dt>
<dd>
A fonte de certificados de CA, que pode ser um dos
<ul>
<li>IDs de recursos brutos que apontam para um arquivo que contém certificados X.509.
Os certificados devem ser codificados em formato DER ou PEM. No caso de certificados PEM,
o arquivo <em>não deve</em> conter dados não PEM adicionais, como
comentários.
</li>
<li>{@code "system"} para os certificados de CA pré-instalados do sistema
</li>
<li>{@code "user"} para certificados de CA adicionados pelo usuário
</li>
</ul>
</dd>
<dt>{@code overridePins}</dt>
<dd>
<p>
Especifica se as CAs dessa fonte ignoram a fixação de certificados. Se {@code
“true”} e forem certificadas cadeias de certificados que incluam uma das CAs dessa
fonte, a fixação não será realizada. Isso pode ser útil para depurar CAs
ou permitir que o usuário execute ataques MiTM no tráfego seguro do seu aplicativo.
</p>
<p>
O padrão é {@code "false"} a não ser que seja especificado em um elemento {@code debug-overrides}
. Nesse caso, o padrão será {@code "true"}.
</p>
</dd>
</dl>
</dd>
<h3 id="pin-set">&lt;pin-set&gt;</h3>
<dl class="xml">
<dt>
sintaxe:
</dt>
<dd>
<pre class="stx">
&lt;pin-set expiration="date"&gt;
...
&lt;/pin-set&gt;
</pre>
</dd>
<dt>
Pode conter:
</dt>
<dd>
Qualquer número de <code><a href="#pin">&lt;pin&gt;</a></code>
</dd>
<dt>
Descrição:
</dt>
<dd>
Um conjunto de fixações de chave pública. Para que uma conexão segura seja confiável, uma das
chaves públicas na cadeia de confiança deve estar presente no conjunto de fixações. Consulte
<code><a href="#pin">&lt;pin&gt;</a></code> para saber mais sobre o formato das fixações.
</dd>
<dt>
Atributos:
</dt>
<dd>
<dl class="attr">
<dt>
{@code expiration}
</dt>
<dd>
A data, no formato {@code yyyy-MM-dd}, após a qual as fixações
expiram e são desativadas. Se o atributo não for definido, as fixações
não expirarão.
<p>
A expiração ajuda a evitar problemas de conectividade em aplicativos que não
recebem atualizações para o conjunto de fixações, por exemplo, porque o usuário
desativou as atualizações do aplicativo.
</p>
</dd>
</dl>
</dd>
</dl>
<h3 id="pin">&lt;pin&gt;</h3>
<dl class="xml">
<dt>
sintaxe:
</dt>
<dd>
<pre class="stx">
&lt;pin digest=["SHA-256"]&gt;base64 encoded digest of X.509
SubjectPublicKeyInfo (SPKI)&lt;/pin&gt;
</pre>
</dd>
<dt>
Atributos:
</dt>
<dd>
<dl class="attr">
<dt>
{@code digest}
</dt>
<dd>
O algoritmo de resumo usado para gerar a fixação. No momento, apenas
{@code "SHA-256"} é permitido.
</dd>
</dl>
</dd>
</dl>

View File

@@ -0,0 +1,120 @@
page.title=Gravação para TV
page.keywords=preview,sdk,tv,recording
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Neste documento</h2>
<ol>
<li><a href="#supporting">Indicar suporte para gravação</a></li>
<li><a href="#recording">Gravar uma sessão</a></li>
<li><a href="#errors">Solucionar erros de gravação</a></li>
<li><a href="#sessions">Gerenciar sessões gravadas</a></li>
<li><a href="#best">Práticas recomendadas</a></li>
</ol>
</div>
</div>
<p>Serviços de entrada de TV permitem que o usuário pause e retome a reprodução do canal por meio de
APIs de time-shifting. O Android N expande o time-shifting
ao permitir que o usuário salve várias sessões gravadas.</p>
<p>Os usuários podem programar gravações antecipadamente ou iniciar uma gravação enquanto assistem a
um programa. Quando o sistema salvar a gravação, o usuário poderá navegar, gerenciar
e reproduzir a gravação usando o aplicativo de TV do sistema.</p>
<p>Se quiser fornecer recursos de gravação para seu serviço de entrada de TV,
indique para o sistema que seu aplicativo oferece suporte a gravação, implemente
a capacidade de gravar programas, solucione e comunique erros ocorridos
durante a gravação e gerencie as sessões gravadas.</p>
<h2 id="supporting">Indicar suporte para gravação</h2>
<p>Para informar ao sistema que seu serviço de entrada de TV oferece suporte a gravação, siga
estas etapas:</p>
<ol>
<li>No método <code>TvInputService.onCreate()</code>, crie um novo objeto
<code>TvInputInfo</code> usando a classe <code>TvInputInfo.Builder</code>
.</li>
<li>Ao criar o novo objeto <code>TvInputInfo</code>, chame
<code>setCanRecord(true)</code> antes de chamar <code>build()</code> para
indicar que seu serviço oferece suporte a gravação.</li>
<li>Registre seu objeto <code>TvInputInfo</code> com o sistema chamando
<code>TvInputService.updateTvInputInfo()</code>.</li>
</ol>
<h2 id="recording">Gravar uma sessão</h2>
<p>Depois que o serviço de entrada de TV registrar que oferece suporte ao recurso
de gravação, o sistema chamará seu
<code>TvInputService.onCreateRecordingSession()</code> quando precisar acessar
a implementação de gravação do seu aplicativo. Implemente sua própria subclasse
<code>TvInputService.RecordingSession</code> e retorne-a
quando o retorno de chamada <code>onCreateRecordingSession()</code>
for acionado. Essa subclasse é responsável por alternar para os dados de canal corretos,
gravando os dados solicitados e comunicando o status de gravação e os erros ao
sistema.</p>
<p>Quando o sistema chamar <code>RecordingSession.onTune()</code>, passando um
URI de canal, acesse o canal especificado pelo URI. Notifique o sistema de que
seu aplicativo acessou o canal desejado ao chamar <code>notifyTuned()</code>
ou, se o aplicativo não conseguiu acessar o canal correto, chame
<code>notifyError()</code>.</p>
<p>Em seguida, o sistema invoca o retorno de chamada <code>RecordingSession.onStartRecording()</code>
. O aplicativo deve iniciar a gravação imediatamente. Quando o sistema invoca
esse retorno de chamada, ele pode fornecer um URI que contenha informações sobre o programa
que será gravado. Quando a gravação for concluída, você deverá copiar esses
dados para a tabela de dados <code>RecordedPrograms</code>.</p>
<p>Por fim, o sistema chama <code>RecordingSession.onStopRecording()</code>.
Nesse momento, o aplicativo deve interromper a gravação imediatamente. Também é preciso
criar uma entrada na tabela <code>RecordedPrograms</code>. Essa entrada deve
incluir o URI dos dados da sessão gravada na coluna
<code>RecordedPrograms.COLUMN_RECORDING_DATA_URI</code> e qualquer informação
sobre o programa fornecida pelo sistema na chamada inicial em
<code>onStartRecording()</code>.</p>
<p>Para saber mais sobre como acessar a tabela <code>RecordedPrograms</code>,
consulte <a href="#sessions">Gerenciar sessões gravadas</a>.</p>
<h2 id="errors">Solucionar erros de gravação</h2>
<p>Se um erro ocorrer durante a gravação, inutilizando os dados gravados,
notifique o sistema chamando <code>RecordingSession.notifyError()</code>.
Também é possível chamar <code>notifyError()</code> depois que uma sessão de gravação é
criada para informar ao sistema que seu aplicativo não pode mais gravar sessões.</p>
<p>Se um erro ocorrer durante a gravação, mas você quiser fornecer uma gravação
parcial que pode ser usada pelos usuários para reprodução, chame
<code>RecordingSession.notifyRecordingStopped()</code> para permitir que o sistema
use a sessão parcial.</p>
<h2 id="sessions">Gerenciar sessões gravadas</h2>
<p>O sistema mantém as informações de todas as sessões gravadas de todos
os aplicativos de canais com recursos de gravação na tabela de provedor de conteúdo <code>TvContract.RecordedPrograms</code>
. Essas informações podem ser acessadas pelo URI de conteúdo
<code>RecordedPrograms.Uri</code>. Use APIs de provedores de conteúdos para
ler, adicionar e excluir entradas dessa tabela.</p>
<p>Para saber mais sobre como trabalhar com dados de provedores de conteúdo, consulte
<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
Fundamentos do provedor de conteúdo</a> .</p>
<h2 id="best">Práticas recomendadas</h2>
<p>Dispositivos de TV podem ter armazenamento limitado, então tenha bom senso ao
alocar armazenamento para salvar sessões gravadas. Use
<code>RecordingCallback.onError(RECORDING_ERROR_INSUFFICIENT_SPACE)</code> quando
não houver espaço suficiente para salvar uma sessão gravada.</p>
<p>Quando o usuário iniciar a gravação, comece a gravar os dados assim
que possível. Para facilitar esse processo, realize qualquer tarefa demorada imediatamente,
como acessar e alocar o espaço de armazenamento, quando o sistema invocar o retorno de chamada
<code>onCreateRecordingSession()</code>. Isso permite que você comece
a gravar imediatamente após o acionamento do retorno de chamada <code>onStartRecording()</code>
.</p>

View File

@@ -0,0 +1,120 @@
page.title=Android N Developer Preview
page.tags="preview","developer"
meta.tags="preview", "android"
fullpage=true
forcelocalnav=true
header.hide=1
footer.hide=1
@jd:body
<script>
$(document).ready(function() {
if (useUpdatedTemplates) {
$("#useUpdatedTemplates").css("display","block");
} else {
$("#useOldTemplates").css("display","block");
}
})
</script>
<section class="dac-expand dac-hero dac-light" style="background-color:#B2DFDB">
<div class="wrap" style="max-width:1100px;margin-top:0">
<div class="cols dac-hero-content" style="padding-bottom:1em;">
<div class="col-7of16 col-push-9of16" style="padding-left:2em">
<h1 class="dac-hero-title">Android N Developer Preview</h1>
<p class="dac-hero-description">
Prepare-se para o Android N!
<strong>Teste seus aplicativos</strong> no Nexus e em outros dispositivos. Ofereça suporte a novos
comportamentos de sistema para <strong>economizar energia e memória</strong>.
Estenda seus aplicativos com a <strong>interface de várias janelas</strong>,
<strong>direcione notificações de resposta</strong> e muito mais.
</p>
<a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
<span class="dac-sprite dac-auto-chevron"></span>
Primeiros passos
</a><!--<br>
<a class="dac-hero-cta" href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron"></span>
Update to Android N (final SDK)
</a><br>-->
</div>
<div class="col-9of16 col-pull-7of16 dac-hero-figure" style="margin-top:1.5em;padding-right:1.5em;">
<img class="dac-hero-image" src="{@docRoot}images/home/n-preview-hero.png" srcset="{@docRoot}images/home/n-preview-hero.png 1x,
{@docRoot}images/home/n-preview-hero_2x.png 2x">
</div>
</div>
<div class="dac-section dac-small">
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/resources"
data-cardSizes="6x2"
data-maxResults="6"></div>
</div>
</div>
</section>
<div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
<div class="wrap dac-offset-parent">
<a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
<i class="dac-sprite dac-arrow-down-gray"></i>
</a>
<ul class="dac-actions">
<li class="dac-action">
<a class="dac-action-link" href="https://developer.android.com/preview/bug">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Informe um problema
</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/support.html">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Veja as notas de versão
</a>
</li>
<li class="dac-action">
<a class="dac-action-link" href="{@docRoot}preview/dev-community">
<i class="dac-action-sprite dac-sprite dac-auto-chevron-large"></i>
Participe da comunidade de desenvolvedores
</a>
</li>
</ul>
</div><!-- end .wrap -->
</div><!-- end .dac-actions -->
<div id="useOldTemplates" style="display:none;color:black" class="actions-bar dac-expand dac-invert">
<div class="wrap dac-offset-parent">
<div class="actions">
<div><a href="https://developer.android.com/preview/bug">
<span class="dac-sprite dac-auto-chevron-large"></span>
Informe um problema
</a></div>
<div><a href="{@docRoot}preview/support.html">
<span class="dac-sprite dac-auto-chevron-large"></span>
Veja as notas de versão
</a></div>
<div><a href="{@docRoot}preview/dev-community">
<span class="dac-sprite dac-auto-chevron-large"></span>
Participe da comunidade de desenvolvedores
</a></div>
</div><!-- end .actions -->
</div><!-- end .wrap -->
</div>
<section class="dac-section dac-light"><div class="wrap">
<h1 class="dac-section-title">Recursos</h1>
<div class="dac-section-subtitle">
Informações essenciais para ajudar você a preparar seus aplicativos para o Android N.
</div>
<div class="resource-widget resource-flow-layout col-16"
data-query="collection:preview/landing/more"
data-cardSizes="6x6"
data-items-per-page="6"
data-maxResults="15"
data-initial-results="6"></div>
</div>
</section>

View File

@@ -0,0 +1,183 @@
page.title=Recursos de linguagem do Java 8
page.keywords="android N", "Java 8", "Jack"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li>
<a href="#supported-features">Recursos de linguagem e APIs do Java 8 com suporte</a>
</li>
<li>
<a href="#configuration">Como ativar os recursos do Java 8 e a cadeia de ferramentas Jack</a>
</li>
</ol>
</div>
</div>
<p>O Android N introduz o suporte aos recursos de linguagem do Java 8
que podem ser usados ao desenvolver aplicativos direcionados ao Android N.
Esta página descreve os novos recursos de linguagem com suporte no Android N
Preview, como configurar seu projeto para usá-los e os
problemas conhecidos que você poderá encontrar.
</p>
<p>Para começar a usar esses recursos, primeiro faça o download e instale o Android
Studio 2.1 (preview) e o Android N Preview SDK, que inclui a
cadeia de ferramentas Jack obrigatória e o Android Plugin for Gradle atualizado. Se você ainda não
instalou o Android N Preview SDK, consulte <a href="{@docRoot}preview/setup-sdk.html">Preparação para desenvolver para o Android N</a>.</p>
<p class="note">
<strong>Observação:</strong> o uso dos novos recursos de linguagem do Java 8 não é
obrigatório para desenvolver aplicativos direcionados à plataforma Android N. Se
não quiser escrever código com os recursos de linguagem do Java 8, você poderá manter
os valores de compatibilidade de origem e destino do seu projeto definidos para o Java 7, mas ainda
será necessário compilar com o JDK 8 para desenvolver para a plataforma Android N.
</p>
<h2 id="supported-features">
Recursos de linguagem e APIs do Java 8 com suporte
</h2>
<p>
Atualmente, o Android não oferece suporte a todos os recursos de linguagem do Java 8. No entanto, os
recursos a seguir agora estão disponíveis para o desenvolvimento de aplicativos direcionados ao
Android N Preview:
</p>
<ul>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html">Métodos
de interface padrão e estáticos</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html">
Expressões Lambda</a>
</li>
<li>
<a class="external-link" href="https://docs.oracle.com/javase/tutorial/java/annotations/repeating.html">Anotações
repetíveis</a>
</li>
</ul>
<p>
Além disso, as seguintes APIs de recursos de linguagem do Java 8 agora estão disponíveis:
</p>
<ul>
<li>APIs relacionadas a reflexo e linguagem:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.lang.FunctionalInterface}
</li>
<li>{@code java.lang.annotation.Repeatable}
</li>
<li>{@code java.lang.reflect.Method.isDefault()}
</li>
<li>e APIs de reflexo associadas a anotações repetíveis, como
{@code AnnotatedElement.getAnnotationsByType(Class)}
</li>
</ul>
</li>
<li>APIs utilitárias:
</li>
<li style="list-style: none; display: inline">
<ul>
<li>{@code java.util.function}
</li>
</ul>
</li>
</ul>
<p class="note">
<strong>Observação:</strong> o Android N baseia a implementação de
expressões lambda em classes anônimas. Essa abordagem permite que elas
sejam compatíveis e possam ser executadas em versões anteriores do Android. Para testar as
expressões lambda em versões mais antigas, lembre-se de acessar o arquivo {@code
build.gradle} e definir{@code compileSdkVersion} e {@code
targetSdkVersion} como 23 ou menos.
</p>
<h2 id="configuration">
Como ativar os recursos do Java 8 e a cadeia de ferramentas Jack
</h2>
<p>
Para usar os novos recursos de linguagem do Java 8, você também deve usar a
nova <a class="external-link" href="https://source.android.com/source/jack.html">cadeia de ferramentas Jack</a>. Essa nova
cadeia de ferramentas Android compila o código-fonte de linguagem Java em um código de bytes dex que pode ser lido no Android
, tem o próprio formato de biblioteca {@code .jack} e fornece a maioria dos recursos
de uma cadeia de ferramentas em uma só ferramenta: reempacotamento, redução, ofuscação e
multidex.
</p>
<p>Veja uma comparação entre duas cadeias de ferramentas usadas para compilar arquivos DEX Android:</p>
<ul>
<li>Cadeia de ferramentas legada javac:<br>
<b>javac</b> ({@code .java} --&gt; {@code .class}) --&gt; <b>dx</b> ({@code
.class} --&gt; {@code .dex})
</li>
<li>Nova cadeia de ferramentas Jack:<br>
<b>Jack</b> ({@code .java} --&gt; {@code .jack} --&gt; {@code .dex})
</li>
</ul>
<h3>
Configuração do Gradle
</h3>
<p>
Para ativar os recursos de linguagem do Java 8 e o Jack para seu projeto, insira
o seguinte no arquivo {@code build.gradle} específico do módulo:
</p>
<pre>
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
</pre>
<h3>
Problemas conhecidos
</h3>
<p>
O Instant Run, introduzido no Android Studio 2.0 (Beta), não funciona com o
Jack e será desativado enquanto a nova cadeia de ferramentas estiver em uso.
</p>
<p>Como o Jack não gera arquivos de classe intermediária ao compilar um
aplicativo, ferramentas que dependem desses arquivos não funcionam com o Jack. Alguns
exemplos dessas ferramentas:</p>
<ul>
<li>Detectores de códigos suspeitos que operam em arquivos de classe
</li>
<li>Ferramentas e bibliotecas que exigem os arquivos de classe do aplicativo (como JaCoCo
e Mockito)</li>
</ul>
<p>Se encontrar outros problemas ao usar o Jack, <a href="http://tools.android.com/filing-bugs">envie um relatório de erros</a>.</p>

View File

@@ -0,0 +1,440 @@
page.title=Visão geral do programa
page.metaDescription=Prepare seus aplicativos para a próxima versão do Android.
page.image=images/cards/card-n-overview_2x.png
meta.tags="preview", "developer", "android"
page.tags="preview", "developer", "android"
@jd:body
<!--
<div class="cols" style=
"background-color:#f2daf5; padding: 5px 0;margin-bottom:1em; text-align:center;">
<h3>
Developer Preview 3 is now available
</h3>
<p>Includes final SDK and near-final system images</p>
<div style="margin:auto 1em">
<ul class="dac-section-links">
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-notes">
<span class="dac-sprite dac-auto-chevron"></span>
Read the Notes</a>
</li>
<li class="dac-section-link">
<a href="{@docRoot}preview/support.html#preview3-get">
<span class="dac-sprite dac-auto-chevron"></span>
Get the Update</a>
</li>
<li class="dac-section-link">
<a href="https://code.google.com/p/android-developer-preview/">
<span class="dac-sprite dac-auto-chevron"></span>
Report Issues</a>
</li>
</ul>
</div>
</div>
-->
<p>
Bem-vindo ao <strong>Android N Developer Preview</strong>, um programa que
oferece tudo de que você precisa para testar e otimizar seus aplicativos para a próxima
versão do Android. Ele é gratuito e você pode começar imediatamente ao
fazer o download das ferramentas do N Developer Preview.
</p>
<div style="background-color:#eceff1;padding:1em;">
<div class="wrap">
<div class="cols">
<div class="col-4of12">
<h5>
Imagens de emulador e hardware
</h5>
<p>
Execute e teste seus aplicativos em diversos dispositivos ou em um emulador.
</p>
</div>
<div class="col-4of12">
<h5>
Código de plataforma mais recente
</h5>
<p>
Forneceremos atualizações mensais durante o Preview. Portanto, você testará de acordo com as alterações mais recentes da plataforma.
</p>
</div>
<div class="col-4of12">
<h5>
Prioridade para problemas de desenvolvimento
</h5>
<p>
Durante as primeiras semanas, nós daremos prioridade aos problemas informados
por desenvolvedores. Portanto, teste e forneça-nos feedback o quanto antes.
</p>
</div>
</div>
<div class="cols">
<div class="col-4of12">
<h5>
Novos comportamentos e recursos
</h5>
<p>
Comece a trabalhar mais cedo para oferecer suporte aos novos comportamentos da plataforma e desenvolver seus aplicativos com novos recursos.
</p>
</div>
<div class="col-4of12">
<h5>
Atualizações entregues por OTA
</h5>
<p>
Atualizações OTA eficientes para qualquer dispositivo compatível por meio do
programa beta do Android. Não é preciso atualizar manualmente.
</p>
</div>
<div class="col-4of12">
<h5>
Feedback e suporte
</h5>
<p>
Informe problemas e envie feedback usando nosso
<a href="{@docRoot}preview/bug">issue tracker</a>. Conecte-se com outros
desenvolvedores na
<a href="{@docRoot}preview/dev-community">Comunidade N&nbsp;Developer</a>.
</p>
</div>
</div>
</div>
</div>
<!--
<p>New in the Android N Developer Preview: </p>
<ul>
<li> Accompanying Android Beta Program for consumers, starting later in the preview</li>
<li> More supported devices, including devices from OEM partners</li>
<li> Seamless OTAs for your devices, from initial release to final N release without flashing</li>
</ul>
-->
<h2 id="timeline">Cronograma e atualizações</h2>
<img src="{@docRoot}images/n-preview-updates_2x.png">
<p>
O N Developer Preview será executado a partir de 3 de março de 2016 até o último lançamento público do Android N
para AOSP e OEMs, planejado para o terceiro trimestre de 2016.
</p>
<p>
Nos marcos mais importantes do desenvolvimento, fornecedores atualizações para seu ambiente de teste e
desenvolvimento. De modo geral, você pode esperar atualizações mensais (intervalo de
4 a 6 semanas). Os marcos estão listados abaixo.
</p>
<ul>
<li><strong><a href="{@docRoot}preview/support.html">Preview 1</a></strong> (versão inicial, alpha)</li>
<li><strong>Preview 2</strong> (atualização incremental, beta)</li>
<li><strong>Preview 3</strong> (atualização incremental, beta)</li>
<li><strong>Preview 4</strong> (APIs finais e SDK oficial, publicação no Play)</li>
<li><strong>Preview 5</strong> (imagens de sistema quase finalizadas para o teste final)</li>
<li><strong>Versão final</strong> para AOSP e ecossistema</li>
</ul>
<p>
Cada atualização inclui ferramentas do SDK, imagens de sistema do Preview, emuladores, documentação de
referência e diferenças entre as APIs.
</p>
<p>
Os <strong>três primeiros marcos do Preview</strong> oferecem um <strong>ambiente
de teste e desenvolvimento antecipado</strong> para ajudar você a identificar
problemas de compatibilidade em seus aplicativos atuais e planejar a migração ou o trabalho em recursos
necessários para desenvolver para a nova plataforma. Esse é o período prioritário no qual você deve
fornecer feedback sobre os recursos e as APIs e informar problemas de compatibilidade
&mdash; para isso, use o <a href="{@docRoot}preview/bug">issue
tracker</a>. As APIs sofrerão algumas alterações nessas atualizações.
</p>
<p>
Nos <strong>Previews 4 e 5</strong>, você terá acesso às <strong>versões finais
das APIs e do SDK do N</strong>, com as quais poderá desenvolver, além de imagens de sistema quase finalizadas
para testar comportamentos e recursos do sistema. O Android N fornecerá uma API de nível
padrão no momento. Você poderá iniciar os testes finais de compatibilidade dos seus aplicativos
legados e refinar códigos novos que usem as APIs ou os recursos do N.
</p>
<p>
Também a partir do Preview 4, você poderá <strong>publicar aplicativos
para dispositivos</strong> que executem o Android N no nível da API oficial, como
dispositivos de consumidor que optaram pelo programa beta do Android. Será possível
publicar nos canais alfa e beta do Google Play primeiro para testar
seus aplicativos com clientes beta do Android antes de distribuir para os demais clientes
da loja.
</p>
<p>
Ao testar e desenvolver no Android N, recomendamos que você <strong>mantenha
o ambiente de desenvolvimento atualizado</strong> à medida que atualizações do Preview são
lançadas. Para facilitar o processo, você pode inscrever seus dispositivos de teste no
programa beta do Android e receber <strong>atualizações por OTA</strong> durante
cada marco. Como alternativa, imagens atualizadas do Preview estão disponíveis para
download e atualização manual.
</p>
<p>
Notificaremos você quando as atualizações do Preview estiverem disponíveis por meio do <a href="http://android-developers.blogspot.com/">Android Developers Blog</a>, além
deste site e da <a href="{@docRoot}preview/dev-community">Comunidade
Android N Developer</a>.
</p>
<h2 id="preview_tools">O que o N Developer Preview inclui?</h2>
<p>
O N Developer Preview inclui tudo o que é necessário para testar seus aplicativos existentes
em uma variedade de tamanhos de tela, tecnologias de rede, chipsets de CPU/GPU
e arquiteturas de hardware.
</p>
<h3 id="sdk_tools">Ferramentas do SDK</h3>
<p>É possível fazer o download desses componentes pelo SDK Manager no <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a>:</p>
<ul>
<li> <strong>SDK e ferramentas</strong> do N Developer Preview
<li> <strong>Imagem do sistema de emulador</strong> (32 bits e 64 bits) do N Developer Preview
<li> <strong>Imagem do sistema de emulador para Android TV</strong> (32 bits) do N Developer Preview
<li> Bibliotecas de suporte do N Developer Preview (para novos modelos de aplicativos)
</ul>
<p>
Forneceremos atualizações para essas ferramentas de desenvolvimento em cada marco, conforme a necessidade.
</p>
<h3 id="hardware_system_images">Imagens do sistema de hardware</h3>
<p>
O N Developer Preview inclui imagens do Nexus e de outros sistemas de hardware que podem ser usadas ao
testar e desenvolver em dispositivos físicos. Consulte a página <a href="{@docRoot}preview/download.html">Imagens de dispositivo</a> para ver a lista completa
de imagens de hardware.
</p>
<p>
Forneceremos imagens de sistema atualizadas para esses dispositivos em cada marco. Você
pode fazer o download e atualizar as imagens de sistema manualmente
em seus dispositivos de teste com a frequência necessária. Isso é especialmente útil para ambientes
de teste automatizados nos quais seja preciso atualizar o dispositivo várias
vezes.
</p>
<p class="note"><strong>Observação</strong>:
<strong>dispositivos atualizados manualmente não receberão atualizações por OTA</strong> como no
Preview do ano anterior. Neste ano, você recebe OTAs ao inscrever os dispositivos no
programa beta do Android &mdash; veja detalhes na próxima seção.
</p>
<h3 id="android_beta">Atualizações por OTA no programa beta do Android</h3>
<p>
Uma novidade do Android N é um programa de atualização por OTA que automaticamente
fornece as últimas atualizações do Preview do Android N diretamente para os dispositivos inscritos
no programa. O programa é gratuito e está aberto a todos que tenham
um dispositivo compatível registrado na conta do Google.
</p>
<p>
Para se inscrever no programa, acesse o site do <a href="https://g.co/androidbeta">programa beta do Android
</a>. Você
verá uma lista de todos os dispositivos registrados em sua conta que estejam qualificados para inscrição no
programa beta do Android.
</p>
<ol>
<li> Escolha os dispositivos nos quais deseja receber atualizações do Android N
<li> Clique em Enroll, leia e concorde com os termos de serviço e clique em OK
</ol>
<p>
Seu dispositivo receberá uma atualização pouco tempo depois da inscrição. Na maioria dos casos,
não é necessário fazer uma redefinição completa para migrar para o Android N, mas
é recomendável fazer o backup de qualquer dado que você não queira perder antes de
inscrever o dispositivo.
</p>
<p>
Conforme as atualizações são enviadas ao seu dispositivo, recomendamos que elas sejam baixadas e
instaladas assim que possível. Mantenha-se atualizado com as
últimas mudanças na interface, no comportamento, nas APIs e nos recursos do sistema.
</p>
<p>
Quando o Developer Preview for concluído, os dispositivos inscritos
receberão uma atualização para a versão oficial do Android N.
</p>
<p>
É possível cancelar a inscrição dos seus dispositivos no programa beta do Android a qualquer momento no
site do programa. Antes de cancelar a inscrição, não deixe de fazer o backup dos dados
no dispositivo.
</p>
<p class="note"><strong>Observação</strong>:
ao cancelar a inscrição, <strong>seu dispositivo será redefinido para as configurações de fábrica</strong>
, recebendo a última versão
do Android 6.0 Marshmallow (não necessariamente a versão instalada
antes da inscrição do dispositivo). Para garantir uma instalação limpa,
seus dados serão apagados do dispositivo, incluindo contatos, mensagens,
fotos etc.
</p>
<h3 id="documentation_and_sample_code">Exemplo de código e documentação</h3>
<p>
Estes recursos de documentação estão disponíveis no site do Developer Preview para
ajudar você a saber mais sobre o Android&nbsp;N:
</p>
<ul>
<li> <a href="{@docRoot}preview/setup-sdk.html">Preparação para desenvolver para o
Android N</a> tem
instruções passo a passo para você iniciar o trabalho.</li>
<li> <a href="{@docRoot}preview/behavior-changes.html">Mudanças
de comportamento</a> indicam as principais áreas a serem testadas.</li>
<li> Documentação de novas APIs, incluindo uma <a href="{@docRoot}preview/api-overview.html">visão geral das APIs</a>, a
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">referência da
API</a> disponível para download e guias de desenvolvedor detalhados sobre os recursos principais, como
suporte para várias janelas, notificações agrupadas, suporte para vários idiomas e outros.
<li> <a href="{@docRoot}preview/samples.html">Exemplo de código</a> que
demonstra como oferecer suporte a permissões e outros novos recursos.
<li> <a href="{@docRoot}preview/support.html#release-notes">Notas de versão</a>
para a versão atual do N Developer Preview, incluindo notas de mudanças e
relatórios de diferenças.
</ul>
<h4 id="reference">Referência da API para download</h4>
<p>
Durante as primeiras atualizações do Preview, você pode fazer o download da
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">referência da API
mais recente para a plataforma Android N</a> como um arquivo zip separado. Esse download
também inclui um relatório de diferenças que ajuda você a identificar as mudanças da API em relação à
API 23 e à atualização anterior.
</p>
<p>
Quando as APIs do Android N forem finalizadas e um nível de API oficial for atribuído,
forneceremos a referência da API on-line em <a href="https://developer.android.com">https://developer.android.com</a>.
</p>
<h3 id="support_resources">
Recursos de suporte
</h3>
<p>
Ao testar e desenvolver no N Developer Preview, use estes canais para
informar problemas e enviar feedback.
</p>
<ul>
<li> O <a href="https://code.google.com/p/android-developer-preview/">issue tracker do N Developer Preview
</a> é seu <strong>principal canal de feedback.</strong> Você pode informar erros, problemas de
desempenho e enviar feedback geral pelo issue tracker. Também é possível consultar
<a href="{@docRoot}preview/bug">problemas conhecidos</a> e
encontrar etapas de soluções alternativas. Manteremos você atualizado sobre seu problema conforme ele for avaliado e
enviado para a equipe de engenharia do Android para análise. </li>
<li> A <a href="{@docRoot}preview/dev-community">Comunidade Android N Developer</a> é
uma comunidade do Google+ onde é possível <strong>se conectar a outros desenvolvedores</strong> que trabalham com o
Android N. É possível compartilhar observações ou ideias, além de encontrar respostas
para as dúvidas sobre o Android N. Moderaremos a comunidade e fornecemos respostas e
orientações conforme for necessário.</li>
</ul>
<h3 id="targeting">Direcionamento, APIs do Preview e publicação</h3>
<p>
O N Developer Preview fornece um sistema apenas para desenvolvimento e uma biblioteca Android
que <strong>não tem um nível de API padrão</strong>. Se desejar
optar por não utilizar comportamentos de compatibilidade para testar seu aplicativo (o que é altamente
recomendável), será possível direcionar seus esforços para a versão Preview do Android N ao definir
o <code><a href=
"{@docRoot}preview/setup-sdk.html#create-update">targetSdkVersion</a></code>
do seu aplicativo para <code>“N”</code>.
</p>
<p>
O Android N Developer Preview fornece <strong>APIs do Preview</strong>
&mdash; as APIs não serão oficiais até o lançamento do SDK final,
atualmente planejado para o terceiro trimestre de 2016. Isso significa que você pode
<strong>esperar pequenas mudanças na API</strong> ao longo do tempo, especialmente durante
as semanas iniciais do programa. Forneceremos um resumo das alterações com
cada atualização do Android N Developer Preview.
</p>
<p class="note">
<strong>Observação</strong>: apesar de as APIs do Preview poderem ser alteradas, os
comportamentos essenciais do sistema são estáveis e estão prontos para
serem testados.
</p>
<p>
O Google Play <strong>impede a publicação de aplicativos direcionados ao N Developer
Preview</strong>. Quando o SDK final do Android N estiver disponível, você poderá
direcionar seus esforços para o nível de API oficial do Android N e publicar seu aplicativo no Google
Play pelos canais de lançamento alfa e beta. Enquanto isso, caso queira
distribuir um aplicativo direcionado ao Android N para testadores, poderá fazê-lo por e-mail ou
por download direto pelo seu site.
</p>
<p>
No lançamento completo do Android N para AOSP e OEMs, planejado para o terceiro trimestre de 2016,
você poderá publicar seus aplicativos direcionados ao Android N no canal de lançamento
público do Google Play.
</p>
<h2 id="how_to_get_started">Como começar</h2>
<p>
Para começar o teste do seu aplicativo com o Android N:
</p>
<ol>
<li> Consulte a <a href="{@docRoot}preview/api-overview.html">Visão geral da API</a>
e as <a href="{@docRoot}preview/behavior-changes.html">Mudanças de comportamento</a> para
ter uma ideia das novidades e de como elas afetam seus aplicativos. Especificamente,
obtenha informações sobre os novos recursos de <a href="{@docRoot}preview/features/notification-updates.html">notificações</a> e
o <a href="{@docRoot}preview/features/multi-window.html">suporte a várias janelas</a>.</li>
<li> Configure seu ambiente seguindo as instruções para <a href="{@docRoot}preview/setup-sdk.html">Configurar o Preview SDK</a>
e configurar os dispositivos de teste.</li>
<li> Siga as instruções de <a href="https://developers.google.com/android/nexus/images">atualização
manual</a> para instalar a última imagem de sistema do Android N no seu dispositivo. </li>
<li> Consulte a <a href="{@docRoot}preview/setup-sdk.html#docs-dl">referência da API</a>
e os <a href="{@docRoot}preview/samples.html">exemplos do Android N</a> para obter mais
informações sobre os novos recursos de API e como usá-los no seu aplicativo.
<li> Participe da <a href="{@docRoot}preview/dev-community">Comunidade Android N
Developer</a> para obter as notícias mais recentes e conectar-se a outros
desenvolvedores que trabalham com a nova plataforma.</li>
</ol>
<p>
Agradecemos sua participação no programa Android N Developer Preview!
</p>

View File

@@ -0,0 +1,85 @@
page.title=Exemplos
page.tags="preview", "samples", "android"
page.image=images/cards/card-n-samples_2x.png
@jd:body
<p>
Os exemplos de código a seguir são fornecidos para o Android N. Para
fazer o download dos exemplos no Android Studio, selecione a opção de menu <b>File &gt; Import
Samples</b>.
</p>
<p class="note">
<strong>Observação:</strong> estes projetos disponíveis para download foram criados
para uso com o Gradle e o Android Studio.
</p>
<h3 id="mw">Interface com várias janelas</h3>
<img src="{@docRoot}preview/images/sample-multiwindow.png" style="float: left; padding-right: 0.5em" height="250" width="156" />
<p>
Este exemplo demonstra como aproveitar as vantagens de interfaces de usuário com várias janelas
com seu aplicativo.
</p>
<p>
<a href="https://github.com/googlesamples/android-MultiWindowPlayground">
Obter no GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="an">Notificações ativas</h3>
<img src="{@docRoot}preview/images/sample-activenotifications.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
Este é um exemplo pré-existente que mostra um serviço simples que envia
notificações usando NotificationCompat. Cada conversa não lida de um usuário
é enviada como uma notificação distinta.
</p>
<p>
Este exemplo foi atualizado para utilizar os novos recursos de notificação
disponíveis no Android N.
</p>
<p>
<a href="https://github.com/googlesamples/android-ActiveNotifications">
Obter no GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="ms">Serviço de mensagens</h3>
<img src="{@docRoot}preview/images/sample-messagingservice.png" style="float: left; padding-right: 0.5em" height="250" width="150" />
<p>
Este é um exemplo pré-existente que demonstra como usar o
NotificationManager para identificar quantas notificações um aplicativo está mostrando
no momento.
</p>
<p>
Este exemplo foi atualizado para utilizar os novos recursos de notificação
disponíveis no Android N.
</p>
<p>
<a href="https://github.com/googlesamples/android-MessagingService">
Obter no GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="fbe">Inicialização direta</h3>
<img src="{@docRoot}preview/images/sample-directboot.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
Este exemplo demonstra como armazenar e acessar dados no armazenamento criptografado de um dispositivo
que está sempre disponível enquanto o dispositivo é inicializado.
</p>
<p>
<a href="https://github.com/googlesamples/android-DirectBoot">
Obter no GitHub</a>
</p>
<div style="clear: both;"></div>
<h3 id="sda">Acessos a diretório com escopo</h3>
<img src="{@docRoot}preview/images/sample-scopeddirectoryaccess.png" style="float: left; padding-right: 0.5em" height="250" width="141" />
<p>
Este exemplo demonstra como ler e gravar dados de diretórios
específicos exigindo menos permissões.
</p>
<p>
<a href="https://github.com/googlesamples/android-ScopedDirectoryAccess">
Obter no GitHub</a>
</p>

View File

@@ -0,0 +1,226 @@
page.title=Configurar o Preview
meta.keywords="preview", "android"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-sdk_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<ol>
<li><a href="#get-as13">Obter o Android Studio 2.1</a></li>
<li><a href="#get-sdk">Obter o Android N SDK</a>
<ol>
<li><a href="#docs-dl">Documentação de referência</a>
</ol>
</li>
<li><a href="#java8">Obter o Java 8 JDK e JRE</a></li>
<li><a href="#create-update">Atualizar ou criar um projeto</a></li>
<li><a href="#next">Próximas etapas</a></li>
</ol>
</div>
</div>
<p>Para desenvolver aplicativos para o Android N Preview, você precisa fazer algumas atualizações
no ambiente de desenvolvedor, conforme é descrito nesta página.</p>
<p>Para simplesmente testar a compatibilidade do seu aplicativo na imagem do sistema
Android N, siga o guia para <a href="{@docRoot}preview/download.html">Testar em um dispositivo Android N</a>.</p>
<img src="{@docRoot}preview/images/n-preview-setup.png" width="700" alt="" />
<h2 id="get-as13">Obter o Android Studio 2.1 (preview)</h2>
<p>A plataforma Android N adiciona suporte para os <a href="{@docRoot}preview/j8-jack.html">recursos de linguagem do Java 8</a>,
que exigem um novo compilador chamado Jack. A versão mais recente do Jack
só é compatível com o Android Studio 2.1 no momento. Portanto, se quiser
usar os recursos de linguagem do Java 8, será preciso usar o Android Studio 2.1 para
compilar seu aplicativo. Caso contrário, não será preciso usar o Jack, mas ainda será
necessário atualizar para o JDK 8 para desenvolver para a plataforma Android N,
conforme é descrito abaixo.
</p>
<iframe width="400" height="225" src="//www.youtube.com/embed/SBbWGxXCMqQ?autohide=1&amp;showinfo=0" frameborder="0" allowfullscreen="" style="float: right; margin: 0 0 20px 20px;"></iframe>
<p>No momento, o Android Studio 2.1 está disponível como prévia no canal da versão canary
. Se já tiver
o Android Studio e não quiser atualizar para o canal canary, poderá
fazer o download do Android Studio 2.1 como uma instalação separada e usá-lo
para desenvolvimento com o Android N, não afetando o ambiente principal do Android Studio
.</p>
<p>Para fazer o download do Android Studio 2.1 como uma instalação separada, siga as etapas
abaixo (ou, se quiser receber o Android Studio 2.1 como uma atualização da sua
instalação existente, pule para a etapa 4):</p>
<ol>
<li>Edite o nome da sua
instalação existente do Android Studio e altere o número da versão. Assim,
quando você instalar a nova versão, ela não substituirá a existente.</li>
<li>Faça o download do arquivo ZIP apropriado para seu sistema operacional na
<a href="http://tools.android.com/download/studio/canary/latest">página de downloads do canal canary</a>.
</li>
<li>Descompacte o pacote e mova o conteúdo do Android Studio 2.1 para o
local apropriado para aplicativos no seu sistema. Em seguida, inicie-o.</li>
<li>Abra a caixa de diálogo Settings
(<strong>File &gt; Settings</strong> no Windows/Linux ou
<strong>Android Studio &gt; Preferences</strong> no Mac). No painel à
esquerda, selecione <strong>Appearance &amp; Behavior &gt; System Settings &gt;
Updates</strong>.
</li>
<li>No painel Updates, marque a caixa de seleção <strong>Automatically
check updates for</strong> e selecione
<strong>Canary Channel</strong> na lista suspensa.
</li>
</ol>
<p>Mantenha essa janela aberta para a próxima etapa.</p>
<h2 id="get-sdk">Obter o N Preview SDK</h2>
<p>Para começar a desenvolver com as APIs do Android N, instale o
Android N Preview SDK no Android Studio da seguinte maneira:</p>
<ol>
<li>Ainda no painel Updates (etapa 4 dos procedimentos acima),
marque a caixa de seleção <strong>Automatically
check updates for Android SDK</strong> e selecione
<strong>Preview Channel</strong> na lista suspensa.
</li>
<li>Clique em <strong>Check Now</strong>.</li>
<li>No painel à esquerda, selecione <strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>.
<li>Clique na guia <strong>SDK Platforms</strong> e marque a caixa de seleção
<strong>Android N Preview</strong>.</li>
<li>Clique na guia <strong>SDK Tools</strong> e marque as caixas de seleção
<strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong> e <strong>Android SDK Tools</strong>
.
</li>
<li>Clique em <strong>OK</strong> e aceite os termos de licença
de qualquer pacote que precise ser instalado.
</li>
</ol>
<h3 id="docs-dl">Obter a documentação de referência do N Preview SDK</h3>
<p>
Informações detalhadas sobre as APIs do Android N são disponibilizadas na documentação de referência do N Preview
, que pode ser baixada pela tabela a seguir.
Este pacote contém uma versão off-line resumida do site de desenvolvedores do Android
e inclui uma referência atualizada para as APIs do Android N, além de um relatório
das diferenças entre as APIs.
</p>
<table>
<tr>
<th scope="col">Documentação</th>
<th scope="col">Checksums</th>
</tr>
<tr>
<td style="white-space: nowrap">
<a href="{@docRoot}shareables/preview/n-preview-1-docs.zip">n-preview-1-docs.zip</a></td>
<td width="100%">
MD5: 4ab33ccbe698f46f125cc5b807cf9c2f<br>
SHA-1: 6a3880b3ccd19614daae5a4d0698ea6ae11c20a5
</td>
</tr>
<table>
<h2 id="java8">Obter o Java 8 JDK e JRE</h2>
<p>Para compilar seu aplicativo para a plataforma Android N, você deve usar
o Java 8 Developer Kit (JDK 8) e, para usar algumas ferramentas com o Android
Studio 2.1, é preciso instalar o Java 8 Runtime Environment (JRE 8). Portanto, se
não tiver as versões mais recentes desses recursos, faça o download do JDK 8 e do JRE 8
agora mesmo.</p>
<p>Em seguida, defina a versão do JDK no Android Studio da seguinte maneira:</p>
<ol>
<li>Abra um projeto Android no Android Studio e, em seguida, abra a caixa de diálogo
Project Structure selecionando <strong>File &gt;
Project Structure</strong>. (Como alternativa, é possível definir o padrão
para todos os projetos selecionando <strong>File &gt; Other Settings &gt;
Default Project Structure</strong>.)
</li>
<li>No painel à esquerda da caixa de diálogo, clique em <strong>SDK Location</strong>.
</li>
<li>No campo <strong>JDK Location</strong>, insira o local do
Java 8 JDK (clique no botão à direita
para procurar em seus arquivos) e clique em <strong>OK</strong>.
</li>
</ol>
<img src="{@docRoot}preview/images/studio-jdk-location.jpg" width="700" alt="" />
<h2 id="create-update">Atualizar ou criar um projeto</h2>
<p>
Para usar as APIs do Android N, seu projeto deve ser configurado da maneira apropriada.
</p>
<p>Se planeja usar os recursos de linguagem do Java 8, consulte
<a href="{@docRoot}preview/j8-jack.html">Recursos de linguagem do Java 8</a>
para saber mais sobre os recursos do Java 8 com suporte e
como configurar seu projeto com o compilador Jack.</p>
<h3 id="update">Atualizar um projeto existente</h3>
<p>Abra o arquivo
<code>build.gradle</code> de seu módulo e atualize os valores da seguinte
forma:
</p>
<pre>
android {
compileSdkVersion <strong>'android-N'</strong>
buildToolsVersion <strong>'24.0.0-rc1'</strong>
...
defaultConfig {
minSdkVersion <strong>'N'</strong>
targetSdkVersion <strong>'N'</strong>
...
}
...
}</pre>
<h3 id="create">Criar um novo projeto</h3>
<p>Para criar um novo projeto para desenvolvimento com o Android N Preview SDK:</p>
<ol>
<li>Clique em <strong>File &gt; New Project</strong> e siga as etapas
até chegar na página Target Android Devices.
</li>
<li>Nela, selecione a opção <strong>Phone and Tablet</strong>.</li>
<li>Na opção <strong>Phone and Tablet</strong>, na lista <strong>Minimum
SDK</strong>, selecione
<strong>N: Android API 23, N Preview (Preview)</strong>.</li>
</ol>
<h2 id="next">Próximas etapas</h2>
<ul>
<li>Siga o guia para <a href="{@docRoot}preview/download.html">Testar em um dispositivo Android N</a>.</li>
<li>Saiba mais sobre a plataforma Android N com
<a href="{@docRoot}preview/behavior-changes.html">Mudanças de comportamento</a>
e <a href="{@docRoot}preview/api-overview.html">Recursos de APIs do
Android N</a>.</li>
</ul>

View File

@@ -0,0 +1,676 @@
page.title=Android N для разработчиков
meta.tags="предварительная версия", "androidn"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-apis_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Основные возможности для разработчиков</h2>
<ol>
<ul style="list-style-type:none;">
<li><a href="#multi-window_support">Поддержка многооконного режима</a></li>
<li><a href="#notification_enhancements">Уведомления</a></li>
<li><a href="#jit_aot">Динамическая/предварительная компиляция</a></li>
<li><a href="#quick_path_to_app_install">Быстрый способ установки приложения</a></li>
<li><a href="#doze_on_the_go">Сон на ходу: режим Doze</a></li>
<li><a href="#background_optimizations">Оптимизация фоновых процессов</a></li>
<li><a href="#data_saver">Экономия трафика</a></li>
<li><a href="#tile_api">API панели быстрых настроек</a></li>
<li><a href="#number-blocking">Блокировка номеров</a></li>
<li><a href="#call_screening">Фильтрация вызовов</a></li>
<li><a href="#multi-locale_languages">Языки и языковые настройки</a></li>
<li><a href="#icu4">API-интерфейсы ICU4J в Android</a></li>
<li><a href="#gles_32">API OpenGL ES 3.2</a></li>
<li><a href="#android_tv_recording">Запись Android TV</a></li>
<li><a href="#android_for_work">Android for Work</a></li>
<li><a href="#accessibility_enhancements">Специальные возможности</a></li>
<li><a href="#direct_boot">Режим Direct Boot</a></li>
<li><a href="#key_attestation">Аттестация ключей</a></li>
<li><a href="#network_security_config">Конфигурация сетевой безопасности</a></li>
<li><a href="#default_trusted_ca">Доверенный центр сертификации по умолчанию</a></li>
<li><a href="apk_signature_v2">Схема получения подписи APK, версия 2</a></li>
<li><a href="#scoped_directory_access">Доступ к выделенным каталогам</a></li>
</ol>
</div>
</div>
<p>Система Android N еще находится в активной стадии разработки, но ее уже можно опробовать в виде предварительной версии
N Developer Preview. В следующих разделах рассматриваются некоторые из
ее новых возможностей для разработчиков. </p>
<p>
Обязательно изучите раздел <a href="{@docRoot}preview/behavior-changes.html">Изменения в работе</a>, в котором описаны
изменения платформы, способные повлиять на работу приложений, ознакомьтесь более подробно с основными возможностями
в руководствах для разработчиков и загрузите <a href="{@docRoot}preview/setup-sdk.html#docs-dl">справочник по API</a> с подробным описанием новых
API-интерфейсов.
</p>
<h2 id="multi-window_support">Поддержка многооконного режима</h2>
<p>В Android N представлена новая долгожданная функция многозадачности
многооконный режим. </p>
<p>Теперь пользователи смогут открывать на экране два приложения одновременно. </p>
<ul>
<li>На телефонах и планшетах под управлением
Android N пользователи могут запустить два приложения рядом или друг над другом
в режиме разделенного экрана. Размеры окон приложений можно изменить с помощью
разделителя между ними. </li>
<li>На устройствах Android TV для приложений будет доступен <a href="{@docRoot}preview/features/picture-in-picture.html">режим
"картинка в картинке"</a>, который позволит приложению отображать контент, пока пользователь просматривает другие приложения или
взаимодействует с ними. Более подробная информация приведена ниже. </li>
</ul>
<div class="col-4of10">
<img src="{@docRoot}preview/images/mw-portrait.png" alt="" style="height:460px;padding-left:1em;" id="img-split-screen" />
<p class="img-caption">
<strong>Рис. 1.</strong> Приложения в режиме разделенного экрана.
</p>
</div>
<p>Поддержка многооконного режима открывает новые возможности привлечения пользователей,
особенно на планшетах и других устройствах с большим размером экрана. Вы можете даже включить в своем приложении функцию перетаскивания
для удобного перемещения контента между приложениями – отличный
способ улучшить пользовательский интерфейс. </p>
<p>Вы можете легко добавить поддержку многооконного режима в свое приложение и настроить его
работу с окнами экрана. Например, вы можете определить минимальные допустимые размеры,
до которых пользователи могут уменьшить окно приложения.
Вы можете также отключить многооконный режим для своего приложения, чтобы
система отображала его только в полноэкранном режиме.</p>
<p>
Дополнительная информация содержится в документе для разработчиков <a href="{@docRoot}preview/features/multi-window.html">Поддержка многооконного режима</a>.
</p>
<h2 id="notification_enhancements">Новые возможности уведомлений</h2>
<p>В Android N изменен дизайн уведомлений, которые стали проще и удобнее.
Ниже приведены некоторые изменения.</p>
<ul>
<li>
<strong>Обновления шаблонов</strong>. В новых шаблонах уведомлений
сделан акцент на изображении и аватаре контакта. Разработчики смогут
использовать новые шаблоны с минимальными изменениями своего кода.
</li>
<li>
<strong>Группы уведомлений</strong>. Система может группировать уведомления,
например по теме сообщений, и отображать группу. Пользователь может применять к группам
действия, например, закрывать их или архивировать. Если вы ранее выполняли реализацию
уведомлений для Android Wear, то вам уже должна быть знакома эта
модель.
</li>
<li>
<strong>Непосредственный ответ в уведомлении</strong>.
Android теперь поддерживает функцию внутренних ответов в приложениях для общения в режиме реального времени. Это позволяет быстро ответить на
СМС или текстовое сообщение непосредственно в интерфейсе уведомления.
</li>
<li>
<strong>Собственные представления</strong>. Два новых API-интерфейса позволяют применять системные элементы,
такие как заголовки и действия уведомлений, при использовании собственных представлений в
уведомлениях.
</li>
</ul>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-1.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-3.png" alt="" style="padding:.5em;max-width:226px">
</div>
<div class="col-4of12">
<img src="{@docRoot}preview/images/notifications-2.png" alt="" style="padding:.5em;max-width:226px">
</div>
<p class="img-caption">
<strong>Рис. 2.</strong> Группы уведомлений и непосредственный ответ.
</p>
<p>Способы реализации новых возможностей описаны в руководстве
<a href="{@docRoot}preview/features/notification-updates.html">Уведомления</a>.
</p>
<h2 id="jit_aot">Профильная динамическая/предварительная компиляция</h2>
<p>В Android N добавлен динамический (JIT) компилятор с профилированием кода для среды
ART, который позволяет постоянно улучшать производительность приложений Android во время их работы.
JIT-компилятор дополняет текущий предварительный (AOT) компилятор ART
и помогает повысить производительность, сократить потребление памяти, а также ускорить обновления приложений и системы.
</p>
<p>Профильная компиляция позволяет ART управлять AOT/JIT-компиляцией каждого приложения
в соответствии с его фактическим использованием и характеристиками устройства. Например,
ART ведет профиль часто используемых методов каждого приложения, которые она может предварительно скомпилировать
и кэшировать для оптимальной производительности. Компиляция остальных частей приложения откладывается до того момента,
когда они действительно понадобятся.</p>
<p>Кроме повышения производительности основных частей приложения профильная
компиляция помогает сократить общее использование оперативной памяти приложением, в том числе связанными двоичными файлами.
Эта возможность особенно важна для устройств с небольшим объемом памяти.</p>
<p>ART управляет профильной компиляцией с минимальным потреблением заряда
аккумулятора. Предварительная компиляция выполняется только тогда, когда устройство неактивно
и находится на зарядке, поэтому заблаговременное выполнение этой работы экономит время и энергию.</p>
<h2 id="quick_path_to_app_install">Быстрый способ установки приложения</h2>
<p>Одним из наиболее ощутимых преимуществ JIT-компилятора ART является скорость установки приложений
и обновлений системы. Даже большие приложения, требовавшие нескольких минут для своей оптимизации и установки на
Android 6.0 , теперь могут быть установлены за секунды.
Обновления системы также выполняются быстрее, поскольку стадия оптимизации теперь отсутствует. </p>
<h2 id="doze_on_the_go">Сон на ходу: режим Doze</h2>
<p>В Android 6.0 был введен системный режим Doze для экономии заряда аккумулятора. В этом режиме
выполнение процессорных и сетевых операций приложений откладывается, когда устройство не используется и неподвижно – например, лежит на столе или в ящике.
</p>
<p>В Android N режим Doze сделал шаг вперед и экономит заряд аккумулятора на ходу.
Каждый раз, когда экран выключается на определенный промежуток времени и устройство не заряжается,
Doze применяет частичный набор знакомых ограничений процессорной и сетевой активности приложений.
Это означает, что пользователи могут экономить заряд аккумулятора, даже когда их устройство лежит в кармане.
</p>
<img src="/preview/images/doze-diagram-1.png" alt="" id="figure1" />
<p class="img-caption">
<strong>Рис. 3.</strong> Режим Doze теперь применяет
энергосберегающие ограничения, даже когда устройство находится в движении.
</p>
<p>Вскоре после блокировки экрана, когда устройство питается от аккумулятора, режим Doze
ограничивает сетевой доступ и откладывает выполнение заданий и синхронизации. В течение коротких периодов пробуждения
для приложений открывается доступ к сети и разрешается выполнение отложенных
заданий и операций синхронизации. Включение экрана или подключение к источнику питания выводит
устройство из режима Doze.</p>
<p>Если устройство снова остается неподвижным в течение определенного периода времени (с погашенным экраном и питанием от аккумулятора),
Doze применяет полный набор процессорных и сетевых ограничений к {@link
android.os.PowerManager.WakeLock}, {@link android.app.AlarmManager} оповещениям и сканированию
GPS/Wi-Fi.</p>
<p>Рекомендации по адаптации приложения для режима Doze не зависят от того, двигается устройство или нет,
поэтому если вы уже обновили свое приложение для оптимальной работы
в режиме Doze, то все уже готово. Если нет, начните <a href="{@docRoot}training/monitoring-device-state/doze-standby.html#assessing_your_app">адаптацию
приложения для режима Doze</a> прямо сейчас.</p>
<h2 id="background_optimizations">Проект Svelte: оптимизация фоновых процессов</h2>
<p>Продолжено развитие проекта Svelte, нацеленного на сокращение использования оперативной памяти системой и приложениями
в различных устройствах экосистемы Android. В Android N проект
Svelte уделяет особое внимание оптимизации работы приложений в фоновом режиме. </p>
<p>Работа в фоновом режиме является важной частью большинства приложений. Организация ее надлежащим образом
может сделать интерфейс пользователя быстрым, отзывчивым и контекстно-зависимым.
В противном случае фоновая обработка может напрасно потреблять оперативную память (и
заряд аккумулятора) и негативно влиять на производительность других приложений. </p>
<p>Начиная с Android 5.0, предпочтительным и оптимальным для пользователей способом выполнения фоновых операций стало использование планировщика {@link android.app.job.JobScheduler}.
Приложения могут планировать свои задания, позволяя системе оптимизировать их на основе состояния памяти,
питания и сетевого соединения. Планировщик JobScheduler прост в использовании и обеспечивает необходимый контроль,
поэтому он рекомендуется для применения во всех приложениях.
</p>
<p>
Другим хорошим вариантом является планировщик <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
<code>GCMNetworkManager</code></a> в составе служб Google Play, который
предлагает аналогичные возможности планирования заданий и совместимость с прежними версиями
Android.
</p>
<p>Мы продолжаем расширять область применения планировщиков <code>JobScheduler</code> и
<code>GCMNetworkManager</code>.
Например, в Android N теперь можно планировать фоновую обработку на основании
изменений поставщиков контента. В то же время мы начинаем исключать некоторые
устаревшие шаблоны, которые могут ухудшить производительность системы,
особенно на устройствах с малым объемом памяти.</p>
<p>В Android N удалены три часто используемые неявные рассылки &mdash;
{@link android.net.ConnectivityManager#CONNECTIVITY_ACTION}, {@link
android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
android.hardware.Camera#ACTION_NEW_VIDEO}, &mdash; поскольку они могут пробудить
фоновые процессы сразу нескольких приложений, повысив потребление памяти и заряда аккумулятора. Если
ваше приложение получает эти рассылки, используйте преимущество N Developer Preview для миграции на
<code>JobScheduler</code> и связанные с ним API-интерфейсы. </p>
<p>
Дополнительная информация содержится в документе <a href="{@docRoot}preview/features/background-optimization.html">Оптимизация
фоновых процессов</a>.
</p>
<h2 id="data_saver">Экономия трафика</h2>
<div class="col-5of12" style="margin-right:1.5em;">
<img src="{@docRoot}preview/images/datasaver.png" style="border:2px solid #ddd">
<p class="img-caption" style="padding-right:2em;">
<strong>Рис. 4.</strong> Настройка экономии трафика.
</p>
</div>
<p>В течение срока эксплуатации мобильного устройства стоимость сотового трафика обычно
превышает стоимость самого устройства. Для многих пользователей сотовый трафик является
весьма дорогим ресурсом, который они хотели бы сэкономить. </p>
<p>В Android N появился режим экономии трафика – новая системная служба, которая помогает сократить
использование сотового трафика приложениями в роуминге, в конце периода тарификации
или для небольших предоплаченных пакетов трафика. Режим экономии трафика дает пользователям возможность контроля использования сотового трафика приложениями
и позволяет разработчикам повысить эффективность работы служб.
</p>
<p>Когда пользователь включает экономию трафика в панели <strong>Settings</strong> и устройство подключено к тарифицируемой сети,
система блокирует использование фонового трафика и сигнализирует приложениям
о необходимости сократить по возможности использование трафика в активном режиме, например: ограничить скорость передачи данных
потокового вещания, уменьшить качество изображений, отложить оптимистичное предварительное кэширование
и т.д. Пользователи могут поместить определенные приложения в белый список, разрешив им тарифицируемую фоновую передачу данных
даже при включенном режиме экономии трафика.</p>
<p>Android N расширяет применение класса {@link android.net.ConnectivityManager}, позволяя приложениям
<a href="{@docRoot}preview/features/data-saver.html#status">выяснять пользовательские настройки
экономии трафика</a> и <a href="{@docRoot}preview/features/data-saver.html#monitor-changes">отслеживать
изменения этих настроек</a>. Все приложения должны проверять, был ли включен режим экономии трафика,
и пытаться ограничить использование трафика в фоновом и активном режимах.</p>
<h2 id="tile_api">API панели быстрых настроек</h2>
<div style="float:right;max-width:320px">
<img src="{@docRoot}preview/images/quicksettings.png" style="padding-left:1.5em;">
<p class="img-caption" style="padding-left:2em;">
<strong>Рис. 5.</strong> Плитки быстрых настроек в панели уведомлений.
</p>
</div><p>Быстрые настройки являются простым и популярным способом доступа к основным настройкам и действиям
непосредственно из панели уведомлений. В Android N возможности быстрых настроек
были расширены – они стали еще более полезными и удобными. </p>
<p>Добавлено пространство для дополнительных плиток быстрых настроек, к которым можно
обратиться с разбитой на страницы области экрана, проведя пальцем влево или вправо. Пользователи
также могут контролировать состав и место отображения этих элементов – их можно добавлять или двигать обычным перетаскиванием.
</p>
<p>Для разработчиков Android N также предлагает новый API, который позволяет определить собственные плитки
быстрых настроек для удобного доступа пользователей к основным элементам управления и действиям вашего приложения.</p>
<p>
Плитки быстрых настроек резервируются для элементов управления или действий, которые либо требуются срочно,
либо часто используются. Их не следует использовать в качестве ярлыков
для запуска приложений.
</p>
<p>
После определения плитки можно показать пользователям, которые смогут добавить их на
панель быстрых настроек обычным перетаскиванием.
</p>
<p>
Дополнительную информацию о создании плиток приложений можно найти в описании
<code>android.service.quicksettings.Tile</code> в загружаемом <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Справочнике по API</a>.
</p>
<h2 id="number-blocking">Блокировка номеров</h2>
<p>Платформа Android N теперь поддерживает блокировку номеров и предоставляет
API-интерфейс платформы, который позволяет поставщикам услуг вести список блокируемых номеров. Этот список доступен для чтения и записи стандартным приложениям
для СМС, звонков и приложениям поставщика.
Для других приложений это список недоступен.</p>
<p>Сделав блокировку номеров стандартной функцией платформы, Android предоставляет приложениям
единообразный способ поддержки блокировки номеров на разных устройствах.
Приложения также получают следующие преимущества:</p>
<ul>
<li> Номера, блокируемые при вызовах, также блокируются в текстовых сообщениях.
<li> Заблокированные номера могут быть сохранены при переустановках и переносах на другие устройства с помощью функции резервного копирования и восстановления.
<li> Разные приложения могут использовать один и тот же список блокируемых номеров.
</ul>
<p>Кроме того, возможность интеграции приложения оператора мобильной сети в Android означает, что операторы могут
читать список блокируемых номеров на устройстве и выполнять блокировку для пользователя на своей стороне,
предотвращая доставку пользователю нежелательных вызовов и текстовых сообщений через какого-либо посредника,
например, через конечную точку VOIP или переадресацию звонков.</p>
<p>
Дополнительную информацию можно найти в описании <code>android.provider.BlockedNumberContract</code>
в загружаемом <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Справочнике по API</a>.
</p>
<h2 id="call_screening">Фильтрация вызовов</h2>
<p>
Android N дает возможность стандартному приложению для звонков фильтровать входящие вызовы. Для этого
в приложении для звонков реализована новая служба <code>CallScreeningService</code>,
которая позволяет приложению выполнять ряд действий на основании
{@link android.telecom.Call.Details Call.Details} входящего вызова, например:
</p>
<ul>
<li> отклонить входящий вызов;
<li> не регистрировать вызов в журнале вызовов;
<li> не показывать пользователю уведомление о вызове.
</ul>
<p>
Дополнительную информацию можно найти в описании <code>android.telecom.CallScreeningService</code>
в загружаемом <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Справочнике по API</a>.
</p>
<h2 id="multi-locale_languages">Поддержка нескольких языковых настроек, дополнительные языки</h2>
<p>Android N теперь позволяет пользователям выбрать <strong>несколько языковых настроек</strong>
для улучшенной поддержки случаев двуязычного применения. Приложения могут использовать
новый API для получения выбранных пользователем языковых настроек и затем предоставлять более сложные
интерфейсы для многоязычных пользователей, например: показывать результаты поиска
на нескольких языках; не предлагать перевод веб-страниц с того языка, который уже знаком пользователю.
</p>
<p>Вместе с поддержкой нескольких языковых настроек Android N также расширяет список доступных языков.
Для каждого распространенного
языка, такого как английский, испанский, французский и арабский, предлагается более 25 вариантов. Также добавлена частичная
поддержка более 100 новых языков.</p>
<p>Приложения могут получить список языковых настроек, установленных пользователем, вызвав метод <code>LocaleList.GetDefault()</code>. Для поддержки расширенного количества языковых настроек в Android N изменен способ
разрешения ресурсов. Вам следует обязательно проверить и убедиться в том,
что ваши приложения работают надлежащим образом с новой логикой разрешения ресурсов.</p>
<p>Дополнительная информация о новом способе разрешения ресурсов и соответствующие рекомендации содержатся
в документе <a href="{@docRoot}preview/features/multilingual-support.html">Поддержка нескольких языков</a>.</p>
<h2 id="icu4">API-интерфейсы ICU4J в Android</h2>
<p>
Платформа Android N теперь предлагает частичный набор API-интерфейсов <a href="http://site.icu-project.org/">ICU4J</a> в
пакете <code>android.icu</code>. Миграция выполняется легко и в основном заключается
в простом изменении пространства имен с <code>com.java.icu</code> на
<code>android.icu</code>. Если вы уже используете пакет ICU4J в своих приложениях,
переход на API-интерфейсы <code>android.icu</code>, предоставленные платформой Android,
может существенно сократить размер пакетов APK.
</p>
<p>
Дополнительные сведения по Android ICU4J API содержатся в документе <a href="{@docRoot}preview/features/icu4j-framework.html">Поддержка ICU4J</a>.
</p>
<h2 id="gles_32">API OpenGL&trade; ES 3.2</h2>
<p>В платформу Android N добавлены интерфейсы и поддержка OpenGL ES 3.2, включая следующие возможности.</p>
<ul>
<li> Все расширения из <a class="external-link" href="https://www.khronos.org/registry/gles/extensions/ANDROID/ANDROID_extension_pack_es31a.txt">Android Extension Pack</a></a> (AEP) кроме <code>EXT_texture_sRGB_decode</code>.
<li> Кадровые буферы с плавающей запятой для HDR и отложенного затенения.
<li> Вызовы отрисовки BaseVertex для улучшения пакетной обработки и потоковой передачи данных.
<li> Эффективный контроль обращений к буферу для сокращения служебных операций WebGL.
</ul>
<p>API-интерфейс платформы для OpenGL ES 3.2 в Android N предоставляется классом
<code>GLES32</code>. При использовании OpenGL ES 3.2 обязательно следует объявить требование
в файле манифеста с помощью тега <code>&lt;uses-feature&gt;</code> и атрибута
<code>android:glEsVersion</code>. </p>
<p>Для получения дополнительных сведений об использовании OpenGL ES, включая
определение версии, поддерживаемой устройством, см. <a href="{@docRoot}guide/topics/graphics/opengl.html">Руководство по API OpenGL ES</a>.</p>
<h2 id="android_tv_recording">Запись Android TV</h2>
<p>В Android N добавлена возможность записи и воспроизведения контента из служб Android TV
через новые API-интерфейсы записи. Службы телевидения на основе существующих API
с временным сдвигом могут контролировать выбор данных телеканала для записи, сохранение
сеансов записи и управлять взаимодействием пользователя с записанным контентом. </p>
<p>Дополнительная информация содержится в документе <a href="{@docRoot}preview/features/tv-recording-api.html">API-интерфейсы записи Android TV</a>.</p>
<h2 id="android_for_work">Android for Work</h2>
<p>В Android for Work добавлены много новых возможностей и API-интерфейсов для устройств под управлением Android N.
Некоторые из них приведены ниже. Полный список обновлений Android for Work, касающихся
Android N, содержится в списке изменений Android for Work.</p>
<h3 id="work_profile_security_challenge">Пароль безопасности для рабочего профиля </h3>
<p>
Владельцы профиля могут установить отдельный пароль безопасности для приложений, запускаемых в рабочем профиле.
Когда пользователь пытается открыть любые рабочие
приложения, выводится запрос пароля. Успешный ввод пароля снимает блокировку рабочего профиля
и, при необходимости, дешифрует его. Владельцы профиля
могут отправить пользователю запрос <code>ACTION_SET_NEW_PASSWORD</code>, предлагающий установить рабочий пароль,
или запрос <code>ACTION_SET_NEW_PARENT_PROFILE_PASSWORD</code>, предлагающий установить пароль блокировки устройства.
</p>
<p>
Владельцы профиля могут устанавливать различные политики паролей для рабочей проверки безопасности
(например, длину PIN-кода, возможность использования отпечатка пальца
для разблокировки профиля) с помощью <code>setPasswordQuality()</code>,
<code>setPasswordMinimumLength()</code> и других связанных методов. Владелец
профиля может также установить блокировку устройства с помощью экземпляра <code>DevicePolicyManager</code>,
возвращаемого новым методом <code>getParentProfileInstance()</code>.
Кроме того, владельцы профиля могут настроить экран учетных данных для рабочей проверки безопасности
с помощью новых методов <code>setOrganizationColor()</code> и
<code>setOrganizationName()</code>.
</p>
<h3 id="turn_off_work">Выключение рабочего режима </h3>
<p>Пользователи устройства с рабочим профилем могут переключать рабочий режим. Когда рабочий режим
выключен, управляемый им пользователь временно выходит из системы, что отключает приложения рабочего профиля,
фоновую синхронизацию и уведомления. Также отключается приложение владельца профиля.
При выключенном рабочем режиме система отображает постоянный значок состояния,
напоминая пользователю о том, что он не может запустить рабочие приложения. Средство запуска при этом указывает,
что рабочие приложения и виджеты недоступны. </p>
<h3 id="always_on_vpn">Постоянное подключение к VPN </h3>
<p>Владельцы устройства и профиля могут обеспечить постоянное подключение рабочих приложений через указанную сеть
VPN. Система автоматически подключается к этой VPN после загрузки устройства.
</p>
<p>
Для этого в интерфейсе <code>DevicePolicyManager</code> используются новые методы
<code>setAlwaysOnVpnPackage()</code> и
<code>getAlwaysOnVpnPackage()</code>.
</p>
<p>Поскольку привязка служб VPN может быть выполнена непосредственно системой без взаимодействия с приложениями,
клиентам VPN требуется обрабатывать новые точки доступа для постоянного подключения к VPN. Как и раньше,
службы для системы указываются фильтром намерений, соответствующим действию
<code>android.net.VpnService</code>. </p>
<p>
Пользователи могут вручную установить клиентов постоянного подключения к VPN, реализующих методы
<code>VPNService</code>, на экране настроек основного пользователя
<strong>Settings&gt;More&gt;Vpn</strong>.
</p>
<h2 id="accessibility_enhancements">Расширение специальных возможностей</h2>
<p>Android N теперь предлагает настройки Vision Settings непосредственно на экране приветствия при начальной установке нового устройства.
Это значительно упрощает пользователям обнаружение и настройку на своих устройствах
специальных возможностей, включая жесты увеличения, размер шрифта, размер экрана и
функцию TalkBack. </p>
<p>Благодаря более приметному расположению этих настроек пользователи
чаще будут пробовать ваше приложение с включенными специальными возможностями. Обязательно протестируйте ваше приложение с этими настройками,
включив их на экране Settings &gt;
Accessibility.</p>
<p>Также в Android N предусмотрены службы специальных возможностей которые помогут пользователям с нарушениями двигательных функций
касаться экрана. Новый API позволяет встроить в службы такие
возможности, как отслеживание лица, отслеживание взгляда, сканирование точек и другой функционал, соответствующий потребностям
этих пользователей.</p>
<p>Дополнительную информацию можно найти в описании <code>android.accessibilityservice.GestureDescription</code>
в загружаемом <a href="{@docRoot}preview/setup-sdk.html#docs-dl">Справочнике по API</a>.</p>
<h2 id="direct_boot">Режим Direct Boot</h2>
<p>Режим Direct Boot ускоряет загрузку устройства и позволяет зарегистрированным приложениям
сохранить ограниченную функциональность даже после непредвиденной перезагрузки.
Например, если зашифрованное устройство перезагрузится, когда пользователь спит,
уведомления о зарегистрированных предупреждениях, сообщениях и входящих вызовах будут поступать пользователю, как в обычном режиме.
Это также означает, что специальные возможности могут быть доступны сразу после перезагрузки.
</p>
<p>Режим Direct Boot использует преимущество шифрования на уровне файлов в Android N
для применения детализированных политик шифрования к данным системы и приложений.
Система использует хранилище, зашифрованное на уровне устройства, для выбранных системных данных и данных из явным образом зарегистрированных приложений.
По умолчанию для всех остальных системных данных, пользовательских данных, приложений и
данных приложений используется хранилище, зашифрованное на уровне учетной записи. </p>
<p>При загрузке система запускается в ограниченном режиме с доступом к данным, зашифрованным
на уровне устройства, и без общего доступа к приложениям и данным.
Если у вас есть компоненты, которые должны быть запущены в этом режиме, их можно зарегистрировать,
установив соответствующий флаг в манифесте. После перезагрузки система активирует зарегистрированные
компоненты с помощью рассылки намерения <code>LOCKED_BOOT_COMPLETED</code>.
Система обеспечивает доступность зарегистрированных данных приложений, зашифрованных на уровне устройства,
до разблокировки экрана. Все остальные данные остаются недоступными, пока пользователь не подтвердит свои учетную информацию на экране блокировки,
после чего данные будут расшифрованы. </p>
Дополнительная информация приведена в документе <a href="{@docRoot}preview/features/direct-boot.html">Direct Boot</a>.</p>
</p>
<h2 id="key_attestation">Аттестация ключей</h2>
<p>Аппаратные хранилища ключей обеспечивают безопасный метод создания, хранения,
и использования криптографических ключей на устройствах Android. Они защищают ключи от
ядра Linux, потенциальных уязвимостей Android и извлечения из устройств
с корневым доступом.</p>
<p>Чтобы упростить и повысить безопасность использования аппаратных хранилищ ключей
в Android N введена возможность аттестации ключей. Приложения и внешние хранилища ключей могут использовать аттестацию,
чтобы определить, является ли пара ключей RSA или EC
аппаратной, какие свойства имеет эта пара ключей и какие ограничения применяются
к ее использованию и сроку действия. </p>
<p>Приложения и службы внешних хранилищ могут запросить информацию о паре ключей
через сертификат аттестации X.509, который должен быть подписан действительным ключом
аттестации. Ключ аттестации представляет собой ключ подписи ECDSA, который
встраивается в аппаратное хранилище ключей устройства при его изготовлении на заводе.
Поэтому сертификат аттестации, подписанный действительным ключом аттестации,
подтверждает существование аппаратного хранилища ключей вместе со сведениями о парах ключей в таком хранилище.
</p>
<p>Чтобы убедиться в том, что устройство использует безопасный официальный заводской образ Android,
для аттестации ключей требуется предоставление <a class="external-link" href="https://source.android.com/security/verifiedboot/verified-boot.html#bootloader_requirements">загрузчиком</a> устройства
следующей информации о <a class="external-link" href="https://source.android.com/security/trusty/index.html">доверенной
среде выполнения (TEE)</a>:</p>
<ul>
<li>версия ОС и исправлений, установленных на устройстве;</li>
<li>открытый ключ <a href="https://source.android.com/security/verifiedboot/index.html" class="external-link">подтвержденной загрузки</a> и состояние блокировки.</li>
</ul>
<p>Дополнительная информация об аппаратном хранилище ключей содержится
в соответствующем <a href="https://source.android.com/security/keystore/" class="external-link">руководстве</a>.</p>
<p>В дополнение к аттестации ключей в Android N также добавлены ключи,
привязанные к отпечаткам пальцев, которые не отменяются при регистрации новых отпечатков.</p>
<h2 id="network_security_config">Конфигурация сетевой безопасности</h2>
<p>В Android N приложения могут безопасно настраивать поведение своих защищенных (HTTPS, TLS)
подключений, без каких-либо изменений кода, используя декларативную
<em>конфигурацию сетевой безопасности</em> вместо обычных ненадежных
программных API-интерфейсов (например, X509TrustManager).</p>
<p>Поддерживаемые возможности:</p>
<ul>
<li><b>Пользовательские якоря доверия.</b> Позволяют приложению определить доверенные
центры сертификации (ЦС) для его защищенных соединений. Например,
приложение может доверять определенным самозаверенным сертификатам или ограниченному набору общих ЦС.
</li>
<li><b>Замена при отладке.</b> Позволяет разработчику безопасно отладить
защищенные соединения своего приложения без дополнительного риска для установленной базы.
</li>
<li><b>Отказ от передачи данных открытым текстом.</b> Позволяет приложению защитить себя от
случайной передачи данных открытым текстом.</li>
<li><b>Прикрепление сертификатов.</b> Дополнительная возможность, позволяющая приложению
ограничить доверенные ключи сервера для защищенных соединений.</li>
</ul>
<p>Дополнительная информация содержится в документе <a href="{@docRoot}preview/features/security-config.html">Конфигурация сетевой безопасности</a>.
</p>
<h2 id="default_trusted_ca">Доверенный центр сертификации по умолчанию</h2>
<p>По умолчанию приложения для Android N могут доверять только системным сертификатам
и не доверяют ЦС, добавленным пользователем. Если приложению для Android N
требуется доверять пользовательским ЦС, ему следует указать в
<a href="{@docRoot}preview/features/security-config.html">конфигурации сетевой безопасности</a> эти доверенные пользовательские ЦС.
</p>
<h2 id="apk_signature_v2">Схема получения подписи APK, версия 2</h2>
<p>Класс PackageManager теперь поддерживает подтверждение приложений с использованием схемы подписи APK
версии 2. Вторая версия схемы подписи APK применяется ко всему файлу,
что существенно ускоряет подтверждение и повышает надежность, позволяя обнаруживать любые несанкционированные изменения файлов APK.
</p>
<p>Для поддержки обратной совместимости пакет APK должен быть подписан с помощью первой версии схемы
(схема подписи JAR) до того, как он будет подписан по схеме версии 2.
Подпись по схеме версии 2 не пройдет подтверждение, если APK будет подписан дополнительным сертификатом
после добавления подписи по схеме версии 2. </p>
<p>Поддержка подписи APK по схеме версии 2 будет доступна в последующих выпусках N Developer
Preview.</p>
<h2 id="scoped_directory_access">Доступ к выделенным каталогам</h2>
<p>В Android N приложения могут использовать новые API-интерфейсы для запроса доступа к конкретным каталогам <a href="{@docRoot}guide/topics/data/data-storage.html#filesExternal">внешнего хранилища</a>,
включая каталоги на съемных носителях, таких как SD-карты.
Новые API-интерфейсы значительно упрощают доступ к стандартным каталогам
внешнего хранилища, таким как <code>Pictures</code>. Например, приложения, работающие с фотографиями,
могут использовать эти API-интерфейсы вместо
<code>READ_EXTERNAL_STORAGE</code>, который разрешает доступ ко всем каталогам
хранилища или платформы Storage Access Framework, благодаря чему выполняется переход к указанному каталогу.
</p>
<p>Кроме того, новые API-интерфейсы упрощают процедуру предоставления доступа к внешнему хранилищу для приложения.
Если вы применяете новые API, система использует простой интерфейс разрешений,
в котором четко указаны каталоги, к которым приложение запрашивает доступ.
</p>
<p>Дополнительная информация содержится в документации для разработчиков
<a href="{@docRoot}preview/features/scoped-folder-access.html">Доступ к выделенным каталогам</a>.
</p>

View File

@@ -0,0 +1,480 @@
page.title=Изменения в работе
page.keywords=preview,sdk,compatibility
meta.tags="предварительная версия", "совместимость"
page.tags="preview", "developer preview"
page.image=images/cards/card-n-changes_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа</h2>
<ol>
<li><a href="#perf">Повышение производительности</a>
<ol>
<li><a href="#doze">Режим Doze</a></li>
<li><a href="#bg-opt">Оптимизация фоновых процессов</a></li>
</ol>
</li>
<li><a href="#perm">Изменения разрешений</a></li>
<li><a href="#accessibility">Улучшенные специальные возможности</a>
<ol>
<li><a href="#screen-zoom">Масштабирование экрана</a></li>
<li><a href="#vision-settings">Vision Settings в мастере настройки</a></li>
</ol>
</li>
<li><a href="#ndk">Связь приложений NDK с библиотеками платформы</a></li>
<li><a href="#afw">Android for Work</a></li>
</ol>
<h2>Дополнительно</h2>
<ol>
<li><a href="{@docRoot}preview/api-overview.html">Обзор API-интерфейсов Android N</a>
</li>
</ol>
</div>
</div>
<p>
Наряду с новыми функциями и возможностями в Android N появились различные изменения
работы системы и API. В этом документе рассматриваются некоторые наиболее важные
изменения, которые следует понимать и учитывать при разработке приложений.
</p>
<p>
Если вы ранее публиковали приложения для Android, то примите во внимание,
что эти изменения в платформе могут повлиять на работу ваших уже опубликованных приложений.
</p>
<h2 id="perf">Повышение производительности</h2>
<p>
Изменения в работе системы Android N нацелены на более экономное использование заряда аккумулятора
и оперативной памяти, а также на повышение производительности приложений. Эти изменения могут повлиять
на системные уведомления и доступность системных ресурсов для вашего приложения. Вам следует
ознакомиться с этими изменениями и оценить, какие исправления могут понадобиться вашему приложению для соответствия этим изменениям.
</p>
<h3 id="doze">Режим Doze</h3>
<p>
Появившийся в Android 6.0 (уровень API 23), режим Doze экономит заряд аккумулятора,
откладывая процессорные и сетевые операции, когда устройство находится не на зарядке,
оно неподвижно, и его экран погашен. Android N расширяет возможности
режима Doze, применяя частичный набор процессорных и сетевых ограничений
в тех случаях, когда устройство находится не на зарядке, с погашенным экраном, но не обязательно неподвижно,
например, когда оно находится в кармане пользователя.
</p>
<img src="{@docRoot}preview/images/doze-diagram-1.png" alt="" height="251px" id="figure1" />
<p class="img-caption">
<strong>Рис. 1.</strong> Иллюстрация применения первого уровня ограничений активности системы в режиме Doze
для экономии заряда аккумулятора.
</p>
<p>
Когда устройство питается от аккумулятора и его экран отключен в течение некоторого промежутка времени,
устройство переходит в режим Doze и применяет первый частичный набор ограничений: закрывается доступ приложений
к сети, откладывается выполнение заданий и синхронизации. Если устройство
остается неподвижным в течение определенного времени после перехода в режим Doze, система применяет
остальные ограничения Doze для {@link android.os.PowerManager.WakeLock},
оповещений {@link android.app.AlarmManager}, сканирования GPS и Wi-Fi. Независимо от того, были применены
все или только некоторые ограничения режима Doze, устройство периодически пробуждается на короткий промежуток времени,
в течение которого приложениям разрешается сетевой доступ
и выполнение отложенных заданий или синхронизации.
</p>
<img src="{@docRoot}preview/images/doze-diagram-2.png" alt="" id="figure2" />
<p class="img-caption">
<strong>Рис. 2.</strong> Иллюстрация применения второго уровня ограничений активности системы в режиме Doze
после того, как устройство неподвижно в течение определенного времени.
</p>
<p>
Следует отметить, что включение экрана или подключение к источнику питания приводит
к выходу устройства из режима Doze и
снимает эти ограничения обработки. Эти дополнительные особенности поведения
не влияют на советы и рекомендации по адаптации приложений к предыдущей
версии режима Doze из Android 6.0 (уровень API 23), которые были рассмотрены в документе
<a href="{@docRoot}training/monitoring-device-state/doze-standby.html">Оптимизация для режима Doze и режима ожидания для приложений</a>.
Вы должны следовать этим рекомендациям (например, использовать Google Cloud Messaging (GCM)
для отправки и получения сообщений) и приступить к планированию обновлений для соответствия дополнительному поведению режима
Doze.
</p>
<h3 id="bg-opt">Проект Svelte: оптимизация фоновых процессов</h3>
<p>
В Android N удалены три неявных широковещательной рассылки с целью оптимизации
потребления памяти и энергии. Причиной этого изменения стало то, что неявные
широковещательные рассылки часто запускали приложения, которые прослушивали их в
фоновом режиме. Удаление этих рассылок может существенно улучшить производительность устройства
и работу интерфейса пользователя.
</p>
<p>
На мобильных устройствах часто могут происходить изменения подключения, например, при переключении
между Wi-Fi и мобильным трафиком. Сейчас приложения могут следить за изменениями
подключения, зарегистрировавшись в качестве получателя для неявных широковещательных рассылок {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} в своем манифесте.
Поскольку для получения этих рассылок регистрируются многие приложения, каждое
переключение сети может вызвать их активацию и одновременную обработку рассылки.
</p>
<p>
Подобным образом приложения могут регистрироваться для получения неявных широковещательных рассылок {@link
android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
android.hardware.Camera#ACTION_NEW_VIDEO} от других приложений, например от камеры.
Когда пользователь делает снимок с помощью приложения камеры, эти приложения активируются
для обработки широковещательной рассылки.
</p>
<p>
Для устранения этих проблем Android N применяет следующие
способы оптимизации.
</p>
<ul>
<li>Приложения для Android N не получают широковещательные рассылки {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION}, даже если в их манифесте
указаны требования получения уведомлений об этих событиях. Приложения в активном режиме
могут следить за событиями {@code CONNECTIVITY_CHANGE} в своем
основном потоке, если они запрашивают уведомление через {@link
android.content.BroadcastReceiver}.
</li>
<li>Приложения не могут отправлять или получать широковещательные рассылки {@link
android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Эта оптимизация влияет на все приложения, включая те, которые не предназначены для Android N.
</li>
</ul>
<p>
В будущих выпусках Android могут быть отменены другие неявные широковещательные рассылки,
а также отменена привязка некоторых фоновых служб. Поэтому следует избегать зависимостей
(или удалить их) в виде объявленных в манифесте получателей неявных широковещательных рассылок
или фоновых служб.
</p>
<p>
Платформа Android предоставляет несколько решений, позволяющих отказаться от таких
неявных широковещательных рассылок или фоновых служб. Например, в API {@link
android.app.job.JobScheduler} реализован надежный механизм планирования сетевых операций,
который запускается при выполнении определенных условий, например при подключении к безлимитной сети. Вы можете даже использовать {@link
android.app.job.JobScheduler}, чтобы реагировать на изменения поставщиков контента.
</p>
<p>
Дополнительная информация об этом изменении в работе системы и соответствующей
адаптации приложений содержится в документе <a href="{@docRoot}preview/features/background-optimization.html">Оптимизация фоновых процессов</a>.
</p>
<h2 id="perm">Изменения разрешений</h2>
<p>
В Android N внесены изменения разрешений, которые могут повлиять на ваше приложение,
включая разрешения учетных записей пользователей и новое разрешение на запись
во внешнем хранилище. Ниже приводится краткое описание разрешений, измененных в
предварительной версии.
</p>
<ul>
<li>{@code GET_ACCOUNTS} (устарело)
<p>
Разрешение GET_ACCOUNTS теперь считается устаревшим. Система игнорирует это разрешение
для приложений, разработанных для Android N.
</p>
</li>
</ul>
<h2 id="accessibility">Улучшенные специальные возможности</h2>
<p>
В Android N внесены изменения, которые должны сделать платформу более удобной для пользователей
со слабым или нарушенным зрением. Эти изменения в целом
не требуют исправления кода вашего приложения, однако вам следует проверить их
и протестировать на своем приложении, чтобы оценить их возможное влияние на интерфейс
пользователя.
</p>
<h3 id="screen-zoom">Масштабирование экрана</h3>
<p>
Android N позволяет пользователям установить параметр <strong>Display size</strong>, который увеличивает или уменьшает
все элементы на экране, делая таким образом устройство более удобным
для пользователей со слабым зрением. Пользователи не могут масштабировать экран до ширины менее
<a href="http://developer.android.com/guide/topics/resources/providing-resources.html"> sw320dp</a> (ширина экрана Nexus 4, обычного телефона среднего размера).
</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>Рис. 3.</strong> На экране справа показан эффект
увеличения параметра Display size на устройстве под управлением Android N.
</p>
<p>
При изменении плотности экрана устройства система уведомляет запущенные приложения следующим способами.
</p>
<ul>
<li>Если приложение предназначено для API уровня 23 или ниже, система автоматически завершает
все его фоновые процессы. Это означает, что если пользователь переходит из такого приложения
на экран <em>Settings</em> и изменяет параметр
<strong>Display size</strong>, то система завершает работу приложения таким же образом,
как в случае нехватки памяти. Если у приложения имеются процессы, работающие в активном режиме,
система уведомляет эти процессы об изменении конфигурации согласно описанию в документе
<a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений
в режиме выполнения</a>, как в случае изменения ориентации устройства.
</li>
<li>Если приложение разработано для Android N, все его процессы
(активные и фоновые) уведомляются об изменении конфигурации, как это описано в документе
<a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений в режиме выполнения</a>.
</li>
</ul>
<p>
Большинству приложений не требуются какие-либо изменения для поддержки этой возможности при условии,
что эти приложения соответствуют рекомендациям по разработке для Android. Необходимо проверить следующие моменты.
</p>
<ul>
<li>Протестируйте свое приложение на устройстве с шириной экрана <code><a href=
"{@docRoot}guide/topics/resources/providing-resources.html">sw320dp</a></code>
и убедитесь в его корректной работе.
</li>
<li>При изменении конфигурации устройства обновите в кэше все данные, зависящие от плотности экрана,
такие как кэшированные растровые изображения или ресурсы, загруженные из сети.
Проверьте изменения конфигурации, когда приложение возобновляет свою работу после паузы.
<p class="note">
<strong>Примечание.</strong> Если вы кэшируете данные, зависящие от конфигурации, рекомендуется
добавить к ним релевантные метаданные, описывающие, например, подходящий размер экрана
или плотность пикселей для этих данных. Эти метаданные помогут решить,
нужно ли обновлять кэшированные данные после изменения конфигурации.
</p>
</li>
<li>Избегайте указания абсолютных размеров в пикселях, поскольку они не масштабируются вместе с изменением плотности экрана.
Вместо этого указывайте размеры в <a href="{@docRoot}guide/practices/screens_support.html">независимых от плотности пикселях</a> (<code>dp</code>).
</li>
</ul>
<h3 id="vision-settings">Vision Settings в мастере настройки</h3>
<p>
В Android N появились настройки Vision Settings на экране приветствия, где пользователи могут установить
следующие параметры специальных возможностей на новом устройстве:
<strong>Magnification gesture</strong>, <strong>Font size</strong>,
<strong>Display size</strong> и <strong>TalkBack</strong>. В результате этого изменения
становятся более заметными ошибки, связанные с различными настройками экрана. Чтобы
оценить влияние этой функции, следует протестировать свое приложение, включив эти настройки
на экране <strong>Settings &gt;
Accessibility</strong>.
</p>
<h2 id="ndk">Связь приложений NDK с библиотеками платформы</h2>
<p>
В Android N внесены изменения пространства имен, предотвращающие загрузку закрытых API-интерфейсов.
Если вы используете NDK, то вы должны использовать только открытые API-интерфейсы платформы Android.
Использование закрытых API в следующем официальном выпуске Android
может привести к ошибке и завершению работы приложения.
</p>
<p>
Чтобы предупредить вас об использовании закрытых API, приложения, запущенные на устройстве с Android N,
создают сообщение об ошибке в журнале устройства (logcat) при вызове закрытого API.
Эта ошибка также отображается на экране устройства в виде сообщения, информирующего о ситуации.
Вам следует проверить код приложения, отказаться от применения
закрытых API и тщательно протестировать приложение на
тестовом устройстве или эмуляторе.
</p>
<p>
Если ваше приложение зависит от библиотек платформы, ознакомьтесь в документации NDK
со стандартными способами замены общих закрытых API их открытыми эквивалентами.
Вы можете ссылаться на библиотеки платформы, не замечая этого,
особенно если ваше приложение использует библиотеку, которая является частью платформы (например,
<code>libpng</code>), но не входит в состав NDK. В этом случае убедитесь, что ваш
пакет APK содержит все файлы .so, на которые вы намеревались ссылаться.
</p>
<p class="caution">
<strong>Внимание!</strong> Некоторые сторонние библиотеки могут ссылаться на закрытые
API. Приложение, использующее такие библиотеки, может завершиться с ошибкой при запуске в следующем
официальном выпуске Android.
</p>
<p>
Приложения не должны зависеть от библиотек платформы (или использовать их), которые не входят в состав
NDK, поскольку эти библиотеки могут изменяться или отсутствовать в разных выпусках Android.
Примером такого изменения может служить переход от OpenSSL к BoringSSL.
Разные устройства также могут обладать разными уровнями совместимости, поскольку
для библиотек платформы, не включенных в
NDK, отсутствуют требования к совместимости. Если вам необходимо обратиться к библиотекам не из состава NDK на более старых устройствах, эту загрузку следует
сделать зависимой от уровня Android API.
</p>
<p>
Для помощи в диагностике проблем подобного рода ниже приведены несколько примеров ошибок Java и NDK,
с которым вы можете столкнуться при создании приложения для Android N.
</p>
<p>Пример ошибки 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>Пример ошибки NDK:</p>
<pre class="no-pretty-print">
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
</pre>
<p>
Ниже приведены некоторые стандартные способы устранения подобных ошибок в приложениях.
</p>
<ul>
<li>Использование getJavaVM и getJNIEnv из libandroid_runtime.so может быть заменено
стандартными функциями 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>Использование символа {@code property_get} из {@code libcutils.so} может быть
заменено открытой альтернативой {@code __system_property_get}.
Для этого используйте {@code __system_property_get} со следующим включением include:
<pre>
#include &lt;sys/system_properties.h&gt;
</pre>
</li>
<li>Использование символа {@code SSL_ctrl} из {@code libcrypto.so} должно быть заменено локальной версией.
Например, вы должны статически связать
{@code libcyrpto.a} в своем файле {@code .so} или динамически включить в свое приложение собственную библиотеку
{@code libcrypto.so} из BoringSSL или OpenSSL.
</li>
</ul>
<h2 id="afw">Android for Work</h2>
<p>
Android N содержит изменения для приложений, предназначенных для Android for Work, включая изменения установки сертификата,
сброса пароля, управления вторичным пользователем,
и доступа к идентификаторам устройства. Если вы создаете приложение для среды
Android for Work, вам следует ознакомиться с этими изменениями и откорректировать
приложение соответствующим образом.
</p>
<ul>
<li>Вы должны установить делегированный установщик сертификатов, прежде чем DPC сможет его настроить.
Для приложений владельца профиля и устройства, разработанных под N SDK, необходимо установить
делегированный установщик сертификатов, прежде чем контроллер политик устройства
(DPC) вызовет метод
<code>DevicePolicyManager.setCertInstallerPackage()</code>. В случае отсутствия установщика
система выдаст ошибку
<code>IllegalArgumentException</code>.
</li>
<li>Ограничения сброса пароля для администраторов устройства теперь применяются для владельцев
профиля. Администраторы устройства более не могут использовать
<code>DevicePolicyManager.resetPassword()</code> для сброса или изменения
установленных паролей. Администраторы по-прежнему могут установить пароль, но только тогда, когда для устройства не установлен
пароль, PIN-код или графический шаблон.
</li>
<li>Владельцы устройства и профиля могут управлять учетными записями даже при наличии ограничений.
Они могут вызывать API-интерфейсы управления учетными записями
даже при установленных ограничениях пользователя <code>DISALLOW_MODIFY_ACCOUNTS</code>.
</li>
<li>Владельцам устройства стало проще управлять дополнительными пользователями. Когда устройство
находится в режиме владельца устройства, автоматически включается ограничение <code>DISALLOW_ADD_USER</code>.
Это предотвращает создание неуправляемых дополнительных пользователей.
Кроме того, прекращено использование методов <code>CreateUser()</code> и
<code>createAndInitial()</code>, которые заменены новым методом
<code>DevicePolicyManager.createAndManageUser()</code>.
</li>
<li>Владельцы устройства получили доступ к идентификаторам устройства. Владелец устройства может получить MAC-адрес
Wi-Fi для устройства, используя метод
<code>DevicePolicyManagewr.getWifiMacAddress()</code>. Если интерфейс Wi-Fi никогда не включался
на устройстве, этот метод возвращает значение {@code null}.
</li>
</ul>
<p>
Дополнительная информация об изменениях Android for Work в Android N содержится в документе
<a href="{@docRoot}preview/features/afw.html">Обновления Android for Work</a>.
</p>
<h2 id="other">Другие важные моменты</h2>
<ul>
<li>Процесс приложения, запущенного под Android N, но разработанного для API более низкого уровня,
завершается, если пользователь изменяет размер экрана. Приложение
должно корректно обработать такой сценарий. В противном случае оно завершится с ошибкой, если пользователь
запустит его с экрана последних задач.
<p>
Вы должны протестировать свое приложение и убедиться,
что оно не будет работать подобным образом.
Для этого можно вызвать аналогичную ошибку,
принудительно завершив процесс приложения через DDMS.
</p>
<p>
Приложения для N и последующих версий Android не завершаются автоматически при изменении плотности экрана,
однако они могут плохо реагировать на изменения конфигурации.
</p>
</li>
<li>
Приложения для Android N должны уметь корректно обрабатывать изменения конфигурации
и не должны завершаться с ошибкой при последующих запусках. Вы можете проверить поведение приложения,
изменив размер шрифта (<strong>Setting</strong> &gt;
<strong>Display</strong> &gt; <strong>Font size</strong>) и перезапустив затем приложение
с экрана последних задач.
</li>
</ul>

View File

@@ -0,0 +1,541 @@
page.title=Тестирование на устройстве
meta.tags="предварительная версия", "nexus","образ системы"
page.tags="preview", "androidn"
page.image=images/cards/card-n-downloads_2x.png
@jd:body
<div style="position:relative; min-height:600px">
<div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
<p class="sdk-terms-intro">Прежде чем приступить к загрузке и установке компонентов
пакета SDK для Android Preview, примите следующие положения и
условия.</p>
<h2 class="norule">Положения и условия</h2>
<div class="sdk-terms" onfocus="this.blur()" style="width:678px">
Это лицензионное соглашение для пакета Android SDK Preview (далее "Лицензионное соглашение").
1. Введение
1.1. Лицензия на пакет Android SDK Preview (далее по тексту настоящего Лицензионного соглашения – "Preview", который включает системные файлы Android, пакеты API-интерфейсов и файлы библиотеки Preview, если такие доступны) передается в соответствии с положениями настоящего Лицензионного соглашения. Настоящее Лицензионное соглашение является юридически обязывающим договором между компанией Google и любым лицом, использующим Preview.
1.2. В настоящем Лицензионном соглашении термин "Android" означает набор программного обеспечения Android для устройств, предлагаемый к использованию в рамках проекта Android Open Source Project, который доступен на веб-сайте http://source.android.com/ (сведения, размещенные на этом сайте, могут периодически обновляться).
1.3 "Совместимость с Android" означает любую реализацию Android, которая (i) соответствует документу "Определение совместимости с Android", доступному на веб-сайте о совместимости Android (http://source.android.com/compatibility), где оно периодически обновляется; а также (ii) успешно прошедшему проверку с помощью пакета Android Compatibility Test Suite (CTS).
1.4. Под термином "Google" понимается корпорация Google Inc., главный офис которой находится по адресу 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States (США).
2. Принятие лицензионного соглашения
2.1. Использование Preview возможно только после принятия условий настоящего Лицензионного соглашения. Запрещается использовать Preview, если вы не согласны с указанными в настоящем документе условиями и положениями.
2.2. Нажатие кнопки принятия условий и/или использование Preview означает, что вы согласны с положениями настоящего Лицензионного соглашения.
2.3. Вы не вправе использовать Preview и принимать условия данного Лицензионного соглашения, если по законам США или иных стран, включая страну вашего проживания или использования Preview, запрещается передавать Preview в ваш адрес.
2.4. Если вы используете Preview в рамках своей компании или организации, вы соглашаетесь взять на себя обязательства по соблюдению настоящего Лицензионного соглашения от имени своего работодателя или другого юридического лица, и вы тем самым подтверждаете и гарантируете, что обладаете полными юридическими полномочиями связать вашего работодателя или иное подобное юридическое лицо обязательствами по настоящему Лицензионному соглашению. Если вы не обладаете требуемыми полномочиями, вы не вправе принимать указанные в настоящем документе условия и положения или использовать Preview от имени вашего работодателя или другого юридического лица.
3. Лицензия на Preview от Google
3.1. В соответствии с условиями настоящего Лицензионного соглашения Google предоставляет вам ограниченную, бесплатную, неэксклюзивную лицензию, действующую во всем мире и не подлежащую сублицензированию, которая разрешает использовать Preview исключительно в целях разработки приложений для совместимых реализаций платформы Android.
3.2 Вы не должны использовать Preview для разработки приложений для других платформ (включая несовместимые реализации Android) или для разработки других SDK. У вас есть право разрабатывать приложения для других платформ (включая несовместимые реализации Android) при условии, что Preview не используется для этих целей.
3.3. Вы соглашаетесь с тем, что Google или третьим сторонам принадлежат все юридические и имущественные права, а также правовой интерес в отношении Preview, в том числе любые права на объекты интеллектуальной собственности, которые имеются в Preview. Термин "Права на интеллектуальную собственность" означает все возможные права в рамках патентного права, авторского права, закона о коммерческой тайне, закона о товарных знаках, а также иные возможные имущественные права. Google оставляет за собой все права, не предоставленные вам в явном виде.
3.4. Вам запрещается использовать Preview в любых целях, которые однозначно не определены в настоящем Лицензионном соглашении. За исключением случаев, предусмотренных применимыми сторонними лицензиями, вам запрещается: (a) копировать (за исключением резервного копирования), изменять, адаптировать, повторно распространять, декомпилировать, осуществлять инженерный анализ, деассемблировать или создавать производные элементы Preview или иной его части; а также (b) загружать любую часть Preview в мобильные телефоны или иные устройства, помимо персонального компьютера, объединять любые части Preview с другим программным обеспечением, распространять любое программное обеспечение или устройства, содержащие части Preview.
3.5. Использование, воспроизведение и распространение компонентов Preview, на которые распространяется лицензия на программное обеспечение с открытым исходным кодом, регулируются исключительно положениями и условиями такой лицензии на программное обеспечение с открытым исходным кодом, а не настоящим Лицензионным соглашением. Вы соглашаетесь обеспечивать хорошую репутацию получателя лицензии в отношении таких лицензии на программное обеспечение с открытым исходным кодом в рамках всех предоставленных ему прав, а также не допускать каких-либо действий, которые могут привести к аннулированию, приостановлению или нарушению таких прав
3.6. Вы соглашаетесь с тем, что форма и содержание Preview , предоставляемого Google, могут быть изменены без предварительного уведомления, а также с тем, что будущие версии Preview могут оказаться несовместимыми с приложениями, разработанными в предыдущих версиях Preview. Вы соглашаетесь с тем, что Google вправе на свое собственное усмотрение и без предварительного уведомления прекратить (временно или навсегда) предоставление Preview (или любых функций в составе Preview) вам или пользователям.
3.7. Ни одна из частей настоящего Лицензионного соглашения не предусматривает предоставления вам права использовать любые торговые наименования, товарные знаки, знаки обслуживания, логотипы, имена доменов или иные отличительные фирменные знаки, принадлежащие Google.
3.8. Вы соглашаетесь с тем, что обязуетесь не удалять, не скрывать или не изменять любые уведомления об имущественных правах (включая уведомления об авторских правах и товарных знаках), которые могут сопровождать Preview или содержаться в нем.
4. Использование Preview
4.1. Компания Google выражает согласие с тем, что ни по какому положению настоящего Лицензионного соглашения не получает от вас (или ваших лицензиаров) каких-либо юридических и имущественных прав, а также правового интереса в отношении любых программных приложений, разработанных вами с помощью Preview, включая любые права на объекты интеллектуальной собственности, которые имеются в таких приложениях.
4.2. Вы соглашаетесь использовать Preview и создавать приложения исключительно в целях, предусмотренных (a) настоящим Лицензионным соглашением и (b) любым применимым законом, нормативным актом или общепринятыми правилами или рекомендациями в соответствующей юрисдикции (включая любые законы, касающиеся экспорта данных или программного обеспечения из США или иных соответствующих стран, а также импорта в них).
4.3. Вы соглашаетесь с тем, что при использовании Preview для разработки приложений вы обязуетесь обеспечивать конфиденциальность и защищать юридические права пользователей. В случае если пользователи предоставляют вам свои имена, пароли или иные данные для входа либо свои персональные сведения, вы обязуетесь уведомить пользователей о том, что такая информация будет присутствовать в вашем приложении, и вы также обязуетесь предоставить таким пользователям юридически соответствующее уведомление о конфиденциальности и средства правовой защиты. Если в вашем приложении хранится персональная или конфиденциальная информация, предоставленная пользователями, вы обязуетесь обеспечить ее надлежащую защиту. Если пользователь предоставляет вам сведения о своей учетной записи Google, то ваше приложение может использовать такую информацию для доступа к учетной записи Google пользователя только тогда, когда пользователь предоставил вам разрешение на это, и только в тех целях, которые обозначил пользователь.
4.4. Вы соглашаетесь с тем, что обязуетесь не использовать Preview для любого рода деятельности, в том числе для разработки или распространения приложений, в целях нарушения работы и повреждения серверов, сетей или иной собственности или служб Google или любой третьей стороны.
4.5. Вы соглашаетесь с тем, что несете единоличную ответственность (и признаете, что компания Google не несет ответственности ни перед вами, ни перед любой третьей стороной) за любые данные, содержимое или ресурсы, которые вы создаете, передаете или демонстрируете посредством Android и/или приложений для Android, а также за любые последствия ваших действий, связанных с этим (в том числе за любые убытки и любой ущерб, которые могут быть причинены Google).
4.6. Вы соглашаетесь с тем, что несете единоличную ответственность (и признаете, что компания Google не несет ответственности ни перед вами, ни перед любой третьей стороной) за любое несоблюдение обязательств по настоящему Лицензионному соглашению, обязательств по любому применимому договору с третьей стороной или предусмотренных Условиями и положениями, за нарушение любых применимых законов или нормативных актов, а также за любые последствия ваших действий, связанных с таким нарушением (в том числе за любые убытки и любой ущерб, которые могут быть причинены Google).
4.7 Preview находится на стадии разработки, поэтому ваши отзывы и результаты тестирования являются важной частью процесса разработки. Используя Preview, вы признаете, что реализация некоторых функций по-прежнему находится на этапе разработки и вам не следует рассчитывать на полную функциональность стабильной версии. Вы соглашаетесь не распространять или предоставлять любые приложения, использующие Preview, поскольку поддержка Preview будет прекращена после выпуска официальной версии пакета Android SDK.
Ваши учетные данные разработчика
5.1. Вы соглашаетесь с тем, что несете ответственность за обеспечение конфиденциальности любых учетных данных разработчика, которые компания Google может вам предоставить или которые вы можете самостоятельно выбрать, а также с тем, что вы несете единоличную ответственность за все приложения, разработанные с использованием ваших учетных данных разработчика.
6. Конфиденциальность и личная информация
6.1. В целях постоянного совершенствования и улучшения Preview компания Google вправе собирать определенные статистические данные об использовании программного обеспечения, включая уникальный идентификатор, связанный IP-адрес, номер версии программного обеспечения, а также сведения об используемых в Preview инструментах и/или службах и способах их применения. Перед тем как любые из таких данных будут отправлены в Google, в Preview отобразится соответствующее уведомление с просьбой дать свое согласие. В случае вашего отказа предоставить такие сведения соответствующие данные собираться не будут.
6.2. Собранные данные изучаются в обобщенном виде с целью улучшения Preview и хранятся в соответствии с Политикой конфиденциальности Google, которая опубликована на веб-сайте по адресу http://www.google.com/policies/privacy/.
7. Сторонние приложения
7.1. Если вы используете Preview для запуска приложений, разработанных третьими сторонами или получающих доступ к данным, содержимому или ресурсам, предоставляемым третьей стороной, вы соглашаетесь с тем, что Google не несет ответственности за такие приложения, данные, содержимое или ресурсы. Вы осознаете, что единоличную ответственность за все данные, содержимое или ресурсы, доступ к которым вы можете получить посредством таких приложений третьих сторон, несет лицо, предоставившее их, а также то, что Google не несет ответственности за любые убытки или любой ущерб, которые могут возникнуть в результате использования вами любых таких сторонних приложений, данных, содержимого или ресурсов и в результате обращения к ним.
7.2. Вы должны быть осведомлены о том, что данные, содержимое и ресурсы, предоставляемые вам посредством таких сторонних приложений, могут быть защищены правами на объекты интеллектуальной собственности, принадлежащие предоставляющим их лицам (или иным лицам либо компаниям от их имени). Вам запрещается изменять, сдавать в аренду, передавать, продавать, распространять такие данные, содержимое или ресурсы (полностью или частично), а также создавать на их основе производные элементы, если у вас нет на это разрешения от соответствующих владельцев.
7.3. Вы осознаете, что использование вами таких сторонних приложений, данных или ресурсов может регулироваться отдельными условиями, заключенными между вами и соответствующей третьей стороной.
8. Использование API-интерфейсов Google
8.1. API-интерфейсы для получения данных Google.
8.1.1. В случае использования вами любых API для получения данных из Google вы осознаете, что такие данные могут быть защищены правами на объекты интеллектуальной собственности, принадлежащие Google или предоставляющим их сторонам (или иным лицам либо компаниям от их имени). Использование вами подобных API может регулироваться дополнительными Условиями использования. Вам запрещается изменять, сдавать в аренду, передавать, продавать, распространять такие данные (полностью или частично), а также создавать на их основе производные элементы, если это не разрешено соответствующими Условиями использования.
8.1.2. Если вы используете какие-либо API-интерфейсы для получения данных пользователя из Google, вы осознаете и соглашаетесь с тем, что вы обязуетесь получать такие данные исключительно с прямого согласия пользователя и только в тех целях, которые обозначил пользователь.
9. Прекращение действия Лицензионного соглашения
9.1 Настоящее Лицензионное соглашение остается в силе до тех пор, пока его действие не будет прекращено вами или Google, как указано ниже.
9.2. Если вы желаете прекратить действие настоящего Лицензионного соглашения, вы вправе сделать это, прекратив использование Preview и любых соответствующих учетных данных разработчика.
9.3. Google вправе в любое время прекратить действие настоящего Лицензионного соглашения, отправив предварительное уведомление или без него.
9.4 Действие настоящего Лицензионного соглашения автоматически прекращается без предварительного уведомления или выполнения иных действий сразу после следующего:
(A) компания Google прекращает предоставление Preview или определенных частей Preview пользователям в той стране, в которой вы проживаете или используете услуги компании;
(B) компания Google выпускает окончательную версию Android SDK.
9.5 В случае прекращения действия настоящего Лицензионного соглашения прекращается действие лицензии, предоставленной в рамках Лицензионного соглашения, и вам следует незамедлительно прекратить любое использование Preview, тогда как положения, изложенные в разделах 10, 11, 12 и 14 продолжают действовать бессрочно.
10. ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
10.1. ВЫ ЧЕТКО ОСОЗНАЕТЕ И БЕЗОГОВОРОЧНО СОГЛАШАЕТЕСЬ С ТЕМ, ЧТО ВЫ ИСПОЛЬЗУЕТЕ PREVIEW ИСКЛЮЧИТЕЛЬНО НА СВОЙ СТРАХ И РИСК И ЧТО PREVIEW ПРЕДОСТАВЛЯЕТСЯ ВАМ НА УСЛОВИЯХ "КАК ЕСТЬ" И "КАК ДОСТУПНО" БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ СО СТОРОНЫ КОМПАНИИ GOOGLE.
10.2 ИСПОЛЬЗОВАНИЕ ВАМИ PREVIEW И ЗАГРУЗКА ЛЮБЫХ МАТЕРИАЛОВ И ИХ ПОЛУЧЕНИЕ ИНЫМ СПОСОБОМ С ПОМОЩЬЮ PREVIEW ВЫПОЛНЯЕТСЯ ПО ВАШЕМУ СОБСТВЕННОМУ УСМОТРЕНИЮ НА СВОЙ СТРАХ И РИСК. ВСЯ ОТВЕТСТВЕННОСТЬ ЗА ЛЮБОЙ УЩЕРБ, ПРИЧИНЕННЫЙ ВАШЕЙ ВЫЧИСЛИТЕЛЬНОЙ СИСТЕМЕ ИЛИ ДРУГОМУ ОБОРУДОВАНИЮ, А ТАКЖЕ ЗА ПОТЕРЮ ДАННЫХ, ВЫЗВАННУЮ ПОДОБНЫМ ИСПОЛЬЗОВАНИЕМ, ВОЗЛАГАЕТСЯ НА ВАС. НЕ ОГРАНИЧИВАЯ ВЫШЕСКАЗАННОЕ, ВЫ ПОНИМАЕТЕ, ЧТО PREVIEW НЕ ЯВЛЯЕТСЯ СТАБИЛЬНЫМ ВЫПУСКОМ И МОЖЕТ СОДЕРЖАТЬ ОШИБКИ, ДЕФЕКТЫ И УЯЗВИМОСТИ В СИСТЕМЕ БЕЗОПАСНОСТИ, КОТОРЫЕ МОГУТ ПРИВЕСТИ К СЕРЬЕЗНЫМ ПОВРЕЖДЕНИЯМ, ВКЛЮЧАЯ ПОЛНУЮ И БЕЗВОЗВРАТНУЮ ПОТЕРЮ РАБОТОСПОСОБНОСТИ ВАШЕГО КОМПЬЮТЕРА ИЛИ ИНОГО УСТРОЙСТВА.
10.3. КОМПАНИЯ GOOGLE БЕЗОГОВОРОЧНО ОТКАЗЫВАЕТСЯ ОТ ЯВНЫХ И НЕЯВНЫХ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО РОДА, ВКЛЮЧАЯ ПОМИМО ПРОЧЕГО НЕЯВНЫЕ ГАРАНТИИ И УСЛОВИЯ ТОВАРНОГО СОСТОЯНИЯ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ СОБСТВЕННОСТИ.
11. ОГРАНИЧЕНИЕ ОТВЕТСТВЕННОСТИ
11.1. ВЫ ЧЕТКО ОСОЗНАЕТЕ И БЕЗОГОВОРОЧНО СОГЛАШАЕТЕСЬ С ТЕМ, ЧТО КОМПАНИЯ GOOGLE, ЕЕ ДОЧЕРНИЕ И АФФИЛИРОВАННЫЕ КОМПАНИИ И ЛИЦЕНЗИАРЫ НЕ НЕСУТ ПЕРЕД ВАМИ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ ЕЕ ПРИЧИНЫ И ВИДА, ЗА КАКИЕ-ЛИБО ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОПОСРЕДОВАННЫЕ И ШТРАФНЫЕ УБЫТКИ, ПОНЕСЕННЫЕ ВАМИ, ВКЛЮЧАЯ ПОМИМО ПРОЧЕГО ПОТЕРЮ ДАННЫХ, ВНЕ ЗАВИСИМОСТИ ОТ ТОГО, БЫЛА ЛИ КОМПАНИЯ GOOGLE ИЛИ ЕЕ ПРЕДСТАВИТЕЛИ ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКОГО УЩЕРБА.
12. Освобождение от ответственности
12.1. В максимально допустимой законом степени вы соглашаетесь защищать, освобождать от ответственности и возможных претензий компанию Google, ее аффилированные компании и их соответствующих руководителей, служащих, сотрудников и агентов от всех возможных правовых требований, действий, судебных исков или разбирательств, а также от всех возможных убытков, обязательств, ущерба, издержек и расходов (включая обоснованные вознаграждения для адвокатов), возникающих (a) в связи с использованием вами Preview, (b) в связи с любыми приложениями, разрабатываемыми вами с помощью Preview и нарушающими любые права на объекты интеллектуальной собственности любого лица, а также порочащие любое лицо либо нарушающие права таких лиц на публичность и конфиденциальность, а также (c) в связи с любым несоблюдением вами положений настоящего Лицензионного соглашения.
13. Изменения в Лицензионном соглашении
13.1. Компания Google вправе вносить изменения в настоящее Лицензионное соглашение по мере выхода новых версий Preview. При внесении изменений Google создает новую версию Лицензионного соглашения и размещает ее на веб-сайте, на котором размещена Preview.
14. Общие правовые условия
14.1. Настоящее Лицензионное соглашение составляет полный текст юридического соглашения между вами и компанией Google, регулирует использование вами Preview (за исключением услуг, которые Google предоставляет на основании отдельного письменного соглашения) и полностью заменяет собой все предыдущие соглашения между вами и компанией Google в отношении Preview.
14.2. Вы соглашаетесь с тем, что отсутствие каких-либо действий или судебных исков со стороны Google, направленных на соблюдение каких-либо правовых норм или исполнение средств правовой защиты, установленных настоящим Лицензионным соглашением (или которыми Google обладает в соответствии с каким-либо действующим законом), не означает отказ компании Google от своих прав и не препятствует компании Google использовать эти права или средства защиты.
14.3. Если какой-либо судебный орган, уполномоченный рассматривать этот вопрос, признает недействительность какого-либо положения данного Лицензионного соглашения, то соответствующее положение будет исключено из Лицензионного соглашения с сохранением действия всех остальных его положений. Остальные положения Лицензионного соглашения по-прежнему будут действовать, и их соблюдение может обеспечиваться в судебном порядке.
14.4. Вы признаете и соглашаетесь с тем, что все участники группы компаний, среди которых Google является материнской компанией, являются сторонними бенефициарами Лицензионного соглашения и что эти компании имеют право пользоваться привилегиями (или правами), предоставляемыми по настоящему Лицензионному соглашению, и напрямую требовать их соблюдения в судебном порядке. Все остальные физические и юридические лица не являются сторонними бенефициарами Лицензионного соглашения.
14.5. ОГРАНИЧЕНИЯ НА ЭКСПОРТ. ИСПОЛЬЗОВАНИЕ PREVIEW РЕГУЛИРУЕТСЯ ЗАКОНАМИ И НОРМАТИВНЫМИ АКТАМИ США, КАСАЮЩИМИСЯ ЭКСПОРТА. ВЫ ОБЯЗУЕТЕСЬ СОБЛЮДАТЬ ВСЕ НАЦИОНАЛЬНЫЕ И МЕЖДУНАРОДНЫЕ ЗАКОНЫ ОБ ЭКСПОРТЕ, ПРИМЕНИМЫЕ К PREVIEW. ДАННЫЕ ЗАКОНЫ НАЛАГАЮТ ОГРАНИЧЕНИЯ НА РЕГИОНЫ, КРУГ ЛИЦ И СПОСОБ КОНЕЧНОГО ИСПОЛЬЗОВАНИЯ.
14.6. Вы не вправе переуступать либо передавать права, предоставляемые по настоящему Лицензионному соглашению, без предварительного письменного согласия Google; любые попытки переуступки без такого согласия считаются недействительными. Вы обязуетесь не делегировать свои полномочия или обязательства по настоящему Лицензионному соглашению без предварительного письменного согласия Google.
14.7. Лицензионное соглашение, а также взаимоотношения между вами и компанией Google в рамках настоящего Лицензионного соглашения регулируются законодательством штата Калифорния за исключением его норм коллизионного права. Вы и компания Google признаете, что урегулирование любых правовых вопросов, связанных с данным Лицензионным соглашением, относится исключительно к юрисдикции судов округа Санта-Клара, штат Калифорния. Несмотря на это, вы соглашаетесь с тем, что компания Google по-прежнему имеет право обращаться за наложением судебного запрета (или за получением аналогичного вида неотложной судебной защиты) в суды любой юрисдикции.
</div><!-- sdk terms -->
<div id="sdk-terms-form">
<p>
<input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
<label id="agreeLabel" for="agree">Я ознакомился и принимаю указанные выше положения и условия.</label>
</p>
<p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
</div>
</div><!-- end TOS -->
<div id="landing">
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа</h2>
<ol>
<li><a href="#device-preview">Настройка устройства</a>
<ol>
<li><a href="#ota">Получение обновлений по беспроводной связи</a></li>
<li><a href="#flash">Запись во флэш-память устройства вручную</a></li>
<li><a href="#revertDevice">Удаление</a></li>
</ol>
</li>
<li><a href="#setupAVD">Настройка эмулятора</a></li>
</ol>
</div>
</div>
<p>
Для запуска и тестирования приложения на новой платформе необходимо настроить среду выполнения Android N
. Это можно выполнить одним из следующих способов:
</p>
<ul>
<li>установить Android N на поддерживаемом устройстве;</li>
<li>настроить эмулятор Android с операционной системой Android N.</li>
</ul>
<p>
Если вы хотите выполнить просто тестирование совместимости приложения и
новой платформы, вам нужен только текущий APK и устройство или
эмулятор. Для простого тестирования не требуется обновлять всю среду
разработки.
</p>
<p>
Если вы хотите изменить приложение, сделав Android N целевой ОС, или использовать новые API-интерфейсы Android N,
необходимо настроить среду разработки, которая поддерживает
Android N. <a href="{@docRoot}preview/setup-sdk.html">Настройка в целях разработки для
Android N</a> имеет ряд особенностей.
</p>
<h2 id="device-preview">Настройка устройства</h2>
<p>
Программа N Developer Preview предлагает системные обновления,
которые можно использовать для тестирования приложений на различных устройствах: от телефонов до планшетов и телевизоров.
</p>
<p>
Если у вас есть поддерживаемое устройство, вы сможете обновить его до ключевой сборки Developer
Preview одним из следующих способов.
</p>
<ul>
<li><strong>Зарегистрируйте устройство для получения автоматических обновлений системы по беспроводной связи</strong> в рамках
<a href="https://g.co/androidbeta">программы бета-тестирования Android</a>. После регистрации ваше устройство будет регулярно получать
по беспроводной связи обновления всех ключевых сборок в N Developer Preview. Такой
способ рекомендуется потому, что он обеспечивает простой переход с текущей
среды с помощью различных выпусков N Developer Preview.</li>
<li><strong>Загрузите системный образ Developer Preview и запишите его во флэш-память устройства</strong>.
Обновления по беспроводной связи не предоставляются для устройств, запись во флэш-память которых выполнялась вручную, но такие
устройства можно зарегистрировать в программе бета-тестирования Android для получения обновлений по беспроводной связи. </li>
</ul>
<h3 id="ota">Регистрация устройства для получения автоматических обновлений по беспроводной связи</h3>
<p>
Если у вас есть поддерживаемое устройство (см. список в таблице "Загрузки"),
вы можете получать обновления предварительных версий Android по беспроводной связи,
зарегистрировав устройство в <a href="https://g.co/androidbeta">программе бета-тестирования Android</a>. Эти обновления автоматически
загружаются и устанавливаются на устройство как официальные
системные обновления.
</p>
<p>
Отменить регистрацию устройства можно в любое время. Устройство будет по беспроводной связи получать последнюю
версию Android, доступную для него
(например, Android 6.0 Marshmallow). Для обновления потребуется полный сброс
настроек устройства в целях удаления с устройства всех данных пользователя. Перед отменой регистрации устройства <strong>выполните резервное копирование
наиболее важных данных</strong>.
</p>
<p>
Для получения дополнительной информации по регистрации устройства см.
веб-сайт <a href="https://g.co/androidbeta">программы бета-тестирование Android</a>.
</p>
<p class="note"><strong>Примечание.</strong>
Для отмены регистрации требуется полный сброс настроек устройства. Выполните
резервное копирование наиболее важных данных.
</p>
<h3 id="flash">Запись во флэш-память устройства вручную</h3>
<p>
В любое время вы можете загрузить последний системный образ Developer Preview и
вручную записать его во флэш-память устройства. См. информацию в следующей таблице, чтобы загрузить системный образ
для своего тестового устройства. Запись вручную во флэш-память устройства удобна, если требуется
точное управление средой тестирования или частая переустановка,
например при автоматическом тестировании.
</p>
<!-- You can flash by ota or system image --><p>
При установке системного образа <strong>с устройства будут удалены все
данные</strong>, поэтому сначала необходимо выполнить резервное копирование данных.
</p>
<p>
После резервного копирования данных устройства и загрузки системного образа,
соответствующего этому устройству, выполните инструкции, которые приведены по адресу <a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>,
чтобы записать этот образ во флэш-память устройства.
</p>
<p>
Записанные вручную системные образы <strong>не
получают автоматические обновления</strong> ключевых сборок Developer Preview
по беспроводной связи. Регулярно обновляйте свою среду и выполняйте запись
нового системного образа во флэш-память устройства при каждом выпуске ключевой сборки Developer Preview.
</p>
<p>
Если вы захотите получить обновления по беспроводной связи после записи на устройство вручную,
вам нужно просто зарегистрировать устройство в <a href="https://g.co/androidbeta">программе
бета-тестировании Android</a>. Вы можете зарегистрировать устройство в любое время для получения следующего обновления предварительной версии
по беспроводной связи.
</p>
<table>
<tr>
<th scope="col">Устройство</th>
<th scope="col">Файлы для загрузки и контрольные суммы</th>
</tr>
<tr id="bullhead">
<td>Nexus 5X <br>"bullhead"</td>
<td><a href="#top" onclick="onDownload(this)">bullhead-npc56p-preview-6c877a3d.tgz</a><br>
MD5: b5cf874021023b398f5b983b24913f5d<br>
SHA-1: 6c877a3d9fae7ec8a1678448e325b77b7a7b143a
</td>
</tr>
<tr id="shamu">
<td>Nexus 6 <br>"shamu"</td>
<td><a href="#top" onclick="onDownload(this)">shamu-npc56p-preview-54b13c67.tgz</a><br>
MD5: af183638cf34e0eb944a1957d7696f60<br>
SHA-1: 54b13c6703d369cc79a8fd8728fe4103c6343973
</td>
</tr>
<tr id="angler">
<td>Nexus 6P <br>"angler"</td>
<td><a href="#top" onclick="onDownload(this)">angler-npc56p-preview-85ffc1b1.tgz</a><br>
MD5: bc4934ea7bd325753eee1606d3725a24<br>
SHA-1: 85ffc1b1be402b1b96f9ba10929e86bba6c6c588
</td>
</tr>
<tr id="volantis">
<td>Nexus 9 <br>"volantis"</td>
<td><a href="#top" onclick="onDownload(this)">volantis-npc56p-preview-0e8ec8ef.tgz</a><br>
MD5: c901334c6158351e945f188167ae56f4<br>
SHA-1: 0e8ec8ef98c7a8d4f58d15f90afc5176303efca4
</td>
</tr>
<tr id="volantisg">
<td>Nexus 9G <br>"volantisg"</td>
<td><a href="#top" onclick="onDownload(this)">volantisg-npc56p-preview-1bafdbfb.tgz</a><br>
MD5: 7bb95bebc478d7257cccb4652899d1b4<br>
SHA-1: 1bafdbfb502e979a9fe4c257a379c4c7af8a3ae6
</td>
</tr>
<tr id="fugu">
<td>Nexus Player <br>"fugu"</td>
<td><a href="#top" onclick="onDownload(this)">fugu-npc56r-preview-7027d5b6.tgz</a><br>
MD5: f5d3d8f75836ccfe4c70e8162e498be4<br>
SHA-1: 7027d5b662bceda4c80a91a0a14ef0e5a7ba795b
</td>
</tr>
<tr id="ryu">
<td>Pixel C <br>"ryu"</td>
<td><a href="#top" onclick="onDownload(this)">ryu-npc56p-preview-335a86a4.tgz</a><br>
MD5: 4e21fb183bbbf467bee91598d587fd2e<br>
SHA-1: 335a86a435ee51f18464de343ad2e071c38f0e92
</td>
</tr>
<tr id="seed">
<td>General Mobile 4G (Android One) <br>"seed"</td>
<td><a href="#top" onclick="onDownload(this)">seed_l8150-npc56p-preview-82472ebc.tgz</a><br>
MD5: 983e083bc7cd0c4a2d39d6ebaa20202a<br>
SHA-1: 82472ebc9a6054a103f53cb400a1351913c95127
</td>
</tr>
</table>
<h3 id="revertDevice">Удаление предварительной версии с устройства</h3>
<p>
Удаление предварительной версии с устройства можно выполнить одним из
следующих способов. </p>
<ul>
<li><strong>Получить заводской образ системы</strong> и вручную
записать его во флэш-память устройства.
<ul>
<li>При использовании <strong>устройств Nexus и Pixel C</strong> ссылки для загрузки см. на странице
<a href="http://developers.google.com/android/nexus/images">Заводские образы
для устройств Nexus</a>. </li>
<li>Для <strong>других устройств</strong> обратитесь напрямую к производителю устройства.
Если устройство поддерживается
программой бета-тестирования Android, вы можете зарегистрировать его для
участия в программе, а затем, если потребуется, отменить регистрацию (см. ниже).</li>
</ul>
</li>
<li><strong>Отмена регистрации устройства в программе бета-тестировании Android</strong>. Если
устройство зарегистрировано в <a href="https://g.co/androidbeta">программе бета-тестировании
Android</a>, можно в любое время отменить регистрацию независимо от типа устройства.
<p>
Устройство будет получать по беспроводной связи последнюю версию
Android, доступную для устройства (например, Android 6.0 Marshmallow).
Для обновления требуется полный сброс настроек устройства в целях удаления с устройства
всех данных пользователя. Поэтому перед отменой регистрации устройства <strong>выполните резервное копирование наиболее важных данных</strong>.
</p>
</li>
</ul>
<p class="note"><strong>Примечание.</strong>
Удаление системного образа Developer Preview до
завершения программы требует полного сброса настроек устройства и приводит к удалению всех данных пользователя
на этом устройстве.
</p>
<h2 id="setupAVD">Настройка эмулятора</h2>
<p>Чтобы использовать эмулятор Android для запуска Android N Preview, необходимо
загрузить Android N Preview SDK и создать виртуальное устройство для
эмулятора.</p>
<p>Сначала загрузите Android N Preview SDK, сделав это следующим образом (если вы получили его
во время <a href="{@docRoot}preview/setup-sdk.html">настройки
в целях разработки для Android N</a>, этот шаг можно пропустить).
<ol>
<li>В Android Studio откройте окно "Settings"
(<strong>File &gt; Settings</strong> в Windows/Linux или
<strong>Android Studio &gt; Preferences</strong> для Mac). В левой
панели выберите <strong>Appearance &amp; Behavior &gt;
System Settings &gt; Android SDK</strong>.
<li>Перейдите на вкладку <strong>SDK Platforms</strong> и установите флажок
<strong>Android N Preview</strong>.</li>
<li>Откройте вкладку <strong>SDK Tools</strong> и затем установите флажки
<strong>Android SDK Build Tools</strong>, <strong>Android SDK
Platform-Tools</strong>, <strong>Android SDK Tools</strong>.
</li>
<li>Нажмите <strong>OK</strong> и примите лицензионные
соглашения для всех устанавливаемых пакетов.
</li>
</ol>
<p>У вас должны быть пакеты <strong>Android SDK Built-Tools 24.0 0 rc1</strong>,
<strong>Platform-Tools 24.0.0 rc1</strong> и <strong>SDK Tools
25.0.9</strong>. Если вы не обновите SDK Tools до версии 25.0.9, вы не сможете
запустить системный образ x86_64 для Android N.</p>
<p>Теперь необходимо создать виртуальное устройство с системным образом Android N.</p>
<ol>
<li>Откройте AVD Manager, выбрав <strong>Tools &gt; Android &gt;
AVD Manager</strong>.</li>
<li>Нажмите <strong>Create Virtual Device</strong>.</li>
<li>Выберите устройство, например: Nexus 5X, Nexus 6P, Nexus 9 или Android TV,
затем нажмите <strong>Next</strong>.</li>
<li>Выберите системный образ <strong>N</strong> (с
<strong>x86</strong> ABI), затем нажмите <strong>Next</strong>.
(Эмулятором Android в настоящий момент поддерживаются только системные образы x86
для Android N Preview.)
<li>Выполните остальные настройки конфигурации AVD и нажмите
<strong>Finish</strong>.</li>
</ol>
<p>Теперь можно запустить эмулятор Android с Android N Preview AVD.</p>
<p>
Для обеспечения эффективной работы эмулятора Android установите
Android Studio 2.1 Preview с поддержкой <a href="http://tools.android.com/tech-docs/emulator">Android Emulator 2.0 Beta</a>,
который обеспечивает более высокую производительность по сравнению с эмулятором в
Android Studio 1.5.</p>
<p class="note"><strong>Примечание.</strong>
Если вы используете Android Studio 2.0 Beta, в нем есть известная неисправность,
которая не позволяет создавать AVD с системными образами N Preview, поэтому вам потребуется
использовать Android Studio 2.1 Preview для создания AVD.
</p>
<p>Для получения дополнительной информации о создании виртуальных устройств см. страницу <a href="{@docRoot}tools/devices/index.html">Управление виртуальными устройствами</a>.
</p>
</div><!-- landing -->
</div><!-- relative wrapper -->
<script>
var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
function onDownload(link) {
$("#downloadForRealz").html("Download " + $(link).text());
$("#downloadForRealz").attr('href', urlRoot + $(link).text());
$("#tos").fadeIn('fast');
$("#landing").fadeOut('fast');
return true;
}
function onAgreeChecked() {
/* verify that the TOS is agreed */
if ($("input#agree").is(":checked")) {
/* reveal the download button */
$("a#downloadForRealz").removeClass('disabled');
} else {
$("a#downloadForRealz").addClass('disabled');
}
}
function onDownloadForRealz(link) {
if ($("input#agree").is(':checked')) {
/*
$("#tos").fadeOut('fast');
$("#landing").fadeIn('fast');
*/
ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
/*
location.hash = "";
*/
return true;
} else {
return false;
}
}
$(window).hashchange( function(){
if (location.hash == "") {
location.reload();
}
});
</script>

View File

@@ -0,0 +1,388 @@
page.title=Оптимизация фоновых процессов
page.metaDescription=Новые ограничения для неявных широковещательных сообщений.
page.keywords="android N", "implicit broadcasts", "job scheduler"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>
Содержание документа
</h2>
<ol>
<li>
<a href="#connectivity-action">Ограничения для CONNECTIVITY_ACTION</a>
</li>
<li>
<a href="#sched-jobs">Планирование сетевых заданий для безлимитных
подключений</a>
</li>
<li>
<a href="#monitor-conn">Отслеживание сетевого подключения во время работы
приложения</a>
</li>
<li>
<a href="#media-broadcasts">Ограничения для NEW_PICTURE и
NEW_VIDEO</a>
</li>
<li>
<a href="#new-jobinfo">Новые методы JobInfo</a>
</li>
<li>
<a href="#new-jobparam">Новые методы JobParameter</a>
</li>
<li>
<a href="#further-optimization">Дальнейшая оптимизация приложения</a>
</li>
</ol>
</div>
</div>
<p>
Фоновые процессы могут потреблять много памяти и заряда аккумулятора. Например,
неявное широковещательное сообщение может запускать множество фоновых процессов,
которые его прослушивают, даже если они сами не выполняют полезной работы. Это
может значительно снизить производительность устройства и быстродействие пользовательского интерфейса.
</p>
<p>
Чтобы устранить подобные проблемы, в N Developer Preview применяются следующие
ограничения.
</p>
<ul>
<li>Приложения для версии Preview не получают рассылок {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION}, если они
зарегистрированы для их получения в манифесте. Приложения в активном режиме
по-прежнему могут прослушивать {@code CONNECTIVITY_CHANGE} в главном потоке,
зарегистрировав {@link android.content.BroadcastReceiver} с помощью метода {@link
android.content.Context#registerReceiver Context.registerReceiver()}.
</li>
<li>Приложения не могут отправлять или получать широковещательные сообщения {@link
android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Эта оптимизация
затрагивает все приложения, а не только предназначенные для версии Preview.
</li>
</ul>
<p>
Платформа Android предоставляет несколько решений, позволяющих отказаться
от таких неявных рассылок. Например, в {@link android.app.job.JobScheduler}
и <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> реализованы надежные механизмы для планирования сетевых
операций, которые запускаются при выполнении определенных условий, таких как наличие безлимитной
сети. Теперь вы также можете использовать {@link android.app.job.JobScheduler}
, чтобы реагировать на изменения поставщиков контента. В объектах {@link android.app.job.JobInfo}
инкапсулированы параметры, которые {@link android.app.job.JobScheduler}
использует для планирования заданий. Если условия задания выполнены, система
выполняет его через {@link android.app.job.JobService} вашего приложения.
</p>
<p>
Здесь мы рассмотрим, как использовать альтернативные методы, такие как
{@link android.app.job.JobScheduler}, для адаптации приложения к новым
ограничениям.
</p>
<h2 id="connectivity-action">
Ограничения для CONNECTIVITY_ACTION
</h2>
<p>
Приложения для N Developer Preview не получают широковещательные сообщения {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION}, если они
зарегистрированы для их получения в своем манифесте. При этом процессы, которые зависят от этого
широковещательного сообщения, не запускаются. Это может вызвать проблемы для приложений, которым необходимо
прослушивать изменения сети или выполнять
массовые сетевые операции, когда устройство подключается к безлимитной сети. Платформа Android уже предоставляет ряд способов обойти
это ограничение, но выбор нужного метода
зависит от того, чего вы хотите добиться от приложения.
</p>
<p class="note">
<strong>Примечание.</strong> Объект {@link android.content.BroadcastReceiver}, зарегистрированный с помощью метода
{@link android.content.Context#registerReceiver Context.registerReceiver()},
продолжает получать такие рассылки, если приложение работает в активном режиме.
</p>
<h3 id="sched-jobs">
Планирование сетевых заданий для безлимитных подключений
</h3>
<p>
При использовании класса {@link android.app.job.JobInfo.Builder JobInfo.Builder} для создания
объекта {@link android.app.job.JobInfo} примените метод {@link
android.app.job.JobInfo.Builder#setRequiredNetworkType
setRequiredNetworkType()} и передайте {@link android.app.job.JobInfo
JobInfo.NETWORK_TYPE_UNMETERED} в качестве параметра задания. В следующем примере кода
служба запускается, если устройство подключается к безлимитной
сети и заряжается:
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo job = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MyJobService.class))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.build();
js.schedule(job);
}
</pre>
<p>
Если условия задания выполнены, приложение получает обратный вызов для запуска
метода {@link android.app.job.JobService#onStartJob onStartJob()} в указанном
классе {@code JobService.class}. Другие примеры реализации {@link
android.app.job.JobScheduler} см. в <a href="{@docRoot}samples/JobScheduler/index.html">примере приложения JobScheduler</a>.
</p>
<p>
В приложениях, использующих службы GMSCore и предназначенных для Android 5.0 (уровень API 21)
или предыдущих версий, можно воспользоваться <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> и указать {@code Task.NETWORK_STATE_UNMETERED}.
</p>
<h3 id="monitor-conn">
Отслеживание сетевого подключения во время работы приложения
</h3>
<p>
Приложения в активном режиме по-прежнему могут прослушивать {@code
CONNECTIVITY_CHANGE} с помощью зарегистрированного объекта {@link
android.content.BroadcastReceiver}. Однако в API-интерфейсе {@link
android.net.ConnectivityManager} есть более надежный метод для запроса
обратного вызова только при выполнении указанных сетевых условий.
</p>
<p>
В объектах {@link android.net.NetworkRequest} параметры
сетевого обратного вызова задаются с помощью {@link android.net.NetworkCapabilities}. Объекты {@link android.net.NetworkRequest} создаются
с использованием класса {@link
android.net.NetworkRequest.Builder NetworkRequest.Builder}. Затем метод {@link
android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest,
android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()}
передает объект {@link android.net.NetworkRequest} системе. Если
сетевые условия выполнены, приложение получает обратный вызов для выполнения метода
{@link android.net.ConnectivityManager.NetworkCallback#onAvailable
onAvailable()}, определенного в своем классе {@link
android.net.ConnectivityManager.NetworkCallback}.
</p>
<p>
Приложение продолжает получать обратные вызовы, пока оно не будет закрыто или не будет вызван метод
{@link android.net.ConnectivityManager#unregisterNetworkCallback
unregisterNetworkCallback()}.
</p>
<h2 id="media-broadcasts">
Ограничения для NEW_PICTURE и NEW_VIDEO
</h2>
<p>
В N Developer Preview приложения не могут отправлять или получать широковещательные сообщения {@link
android.hardware.Camera#ACTION_NEW_PICTURE} и {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Это ограничение
позволяет улучшить производительность, если для обработки нового изображения или видео должны
активироваться несколько приложений. N Developer Preview
расширяет классы {@link android.app.job.JobInfo} и {@link
android.app.job.JobParameters}, что дает разработчикам альтернативное решение.
</p>
<h3 id="new-jobinfo">
Новые методы JobInfo
</h3>
<p>
Для активации заданий при изменении URI контента в N Developer Preview
были добавлены следующие методы для API-интерфейса {@link android.app.job.JobInfo}.
</p>
<dl>
<dt>
{@code JobInfo.TriggerContentUri()}
</dt>
<dd>
Инкапсулирует параметры, необходимые для активации задания при изменении URI контента.
</dd>
<dt>
{@code JobInfo.Builder.addTriggerContentUri()}
</dt>
<dd>
Передает объект {@code TriggerContentUri} в контейнер {@link
android.app.job.JobInfo}. Объект {@link android.database.ContentObserver}
отслеживает инкапсулированный URI контента. Если с заданием связано несколько объектов {@code
TriggerContentUri}, система предоставляет
обратный вызов, даже если изменился только один из URI контента.
</dd>
<dd>
Добавьте флаг {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS}, чтобы
активировать задание при изменении любых потомков указанного URI. Этот флаг
соответствует параметру {@code notifyForDescendants}, переданному методу {@link
android.content.ContentResolver#registerContentObserver
registerContentObserver()}.
</dd>
</dl>
<p class="note">
<strong>Примечание.</strong> Метод {@code TriggerContentUri()} не может использоваться
вместе с {@link android.app.job.JobInfo.Builder#setPeriodic
setPeriodic()} или {@link android.app.job.JobInfo.Builder#setPersisted
setPersisted()}. Чтобы непрерывно отслеживать изменения контента, запланируйте новый объект задания
{@link android.app.job.JobInfo}, прежде чем {@link
android.app.job.JobService} завершит обработку последнего обратного вызова.
</p>
<p>
В следующем примере кода планируется задание, которое активируется, когда система сообщает
об изменении URI контента {@code MEDIA_URI}:
</p>
<pre>
public static final int MY_BACKGROUND_JOB = 0;
...
public static void scheduleJob(Context context) {
JobScheduler js =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(
MY_BACKGROUND_JOB,
new ComponentName(context, MediaContentJob.class));
builder.addTriggerContentUri(
new JobInfo.TriggerContentUri(MEDIA_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
js.schedule(builder.build());
}
</pre>
<p>
Если система сообщает об изменении указанных URI контента, приложение
получает обратный вызов, а объект {@link android.app.job.JobParameters} передается
методу {@link android.app.job.JobService#onStartJob onStartJob()}
в {@code MediaContentJob.class}.
</p>
<h3 id="new-jobparam">
Новые методы JobParameter
</h3>
<p>
В N Developer Preview также расширен класс {@link android.app.job.JobParameters}, чтобы
приложения могли получать полезные сведения о том, какие источники контента
и URI инициировали задание.
</p>
<dl>
<dt>
{@code Uri[] getTriggeredContentUris()}
</dt>
<dd>
Возвращает массив URI, которые активировали задание. Возвращается значение {@code
null}, если ни один URI не инициировал задание (например, задание было
активировано по времени или из-за другой причины), или число измененных
URI больше 50.
</dd>
<dt>
{@code String[] getTriggeredContentAuthorities()}
</dt>
<dd>
Возвращает строковый массив источников контента, которые активировали задание.
Если возвращенный массив не равен {@code null}, используйте метод {@code getTriggeredContentUris()},
чтобы получить сведения об измененных URI.
</dd>
</dl>
<p>
В следующем примере кода перегружается метод {@link
android.app.job.JobService#onStartJob JobService.onStartJob()} и
записываются источники и URI контента, вызвавшие задание:
</p>
<pre>
&#64;Override
public boolean onStartJob(JobParameters params) {
StringBuilder sb = new StringBuilder();
sb.append("Media content has changed:\n");
if (params.getTriggeredContentAuthorities() != null) {
sb.append("Authorities: ");
boolean first = true;
for (String auth :
params.getTriggeredContentAuthorities()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append(auth);
}
if (params.getTriggeredContentUris() != null) {
for (Uri uri : params.getTriggeredContentUris()) {
sb.append("\n");
sb.append(uri);
}
}
} else {
sb.append("(No content)");
}
Log.i(TAG, sb.toString());
return true;
}
</pre>
<h2 id="further-optimization">
Дальнейшая оптимизация приложения
</h2>
<p>
Оптимизация приложений для устройств с малым объемом памяти
или для условий с ограниченным объемом памяти помогает улучшить производительность и удобство работы пользователей. Удаление
зависимостей от фоновых служб и статически зарегистрированных приемников неявных широковещательных сообщений
способно помочь приложению более эффективно работать на таких устройствах. Хотя
на платформе N Developer Preview приняты меры для устранения некоторых из этих проблем,
рекомендуется оптимизировать приложения, полностью отказавшись
от подобных фоновых процессов.
</p>
<p>
В N Developer Preview представлен ряд дополнительных команд <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a>, с помощью
которых можно тестировать поведение приложения с отключенными фоновыми процессами.
</p>
<ul>
<li>Для эмуляции условий, в которых неявные широковещательные сообщения и фоновые службы
недоступны, введите следующую команду:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
</pre>
</li>
<li>Чтобы снова включить неявные широковещательные сообщения и фоновые службы, введите
следующую команду:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
</pre>
</li>
</ul>

View File

@@ -0,0 +1,180 @@
page.title=Режим Direct Boot
page.keywords=preview,sdk,direct boot
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа</h2>
<ol>
<li><a href="#run">Запрос доступа для запуска в режиме Direct Boot</a></li>
<li><a href="#access">Доступ к шифрованному хранилищу данных устройства</a></li>
<li><a href="#notification">Уведомление о разблокировке пользователем</a></li>
<li><a href="#migrating">Перенос имеющихся данных</a></li>
<li><a href="#testing">Тестирование приложения с поддержкой шифрования</a></li>
</ol>
</div>
</div>
<p>Android N работает в защищенном режиме <i>Direct Boot,</i> когда
устройство было включено, но не разблокировано пользователем.
Для поддержки такого режима работы в системе имеется два хранилища данных:</p>
<ul>
<li><i>Хранилище, зашифрованное на уровне учетных данных.</i>Это хранилище используется по умолчанию
и доступно только тогда, когда пользователь разблокирует устройство.</li>
<li><i>Хранилище, зашифрованное на уровне устройства.</i>Это хранилище доступно в режиме
Direct Boot и тогда, когда пользователь разблокирует устройство.</li>
</ul>
<p>По умолчанию в режиме Direct Boot приложения не работают.
Если вашему приложению требуется выполнять какие-то действия в режиме Direct Boot, вы можете зарегистрировать
компоненты приложения, которые должны быть запущены в этом режиме. Некоторые распространенные примеры использования
приложений, выполняющих операции в режиме Direct Boot:</p>
<ul>
<li>Приложения с уведомлениями по расписанию, например,
будильники.</li>
<li>Приложения, посылающие пользователю важные уведомления, например, приложения СМС.</li>
<li>Приложения для лиц с ограниченными возможностями, например, Talkback.</li>
</ul>
<p>Если вашему приложению требуется доступ к данным в режиме Direct Boot, используйте
шифрованное хранилище устройства. Шифрованное хранилище устройства содержит данные,
зашифрованные с помощью ключа, доступного только после
успешной подтвержденной загрузки устройства.</p>
<p>Если данные следует шифровать с помощью ключа, связанного с учетными данными
пользователя (например, с PIN-кодом или паролем), используйте хранилище, требующее ввода учетных данных.
Такое хранилище доступно только после успешной
разблокировки устройства пользователем и до тех пор, пока пользователь не перезапустит устройство. Если
пользователь включает экран блокировки после разблокировки устройства, шифрованное хранилище,
требующее ввода учетных данных, не блокируется.</p>
<h2 id="run">Запрос доступа для запуска в режиме Direct Boot</h2>
<p>Прежде
чем работать в режиме Direct Boot или получать доступ к шифрованному
хранилищу устройства, приложения должны зарегистрировать свои компоненты в системе. Приложения регистрируются в системе, помечая компоненты как
<i>поддерживающие шифрование</i>. Чтобы пометить компонент как поддерживающий шифрование, нужно установить для атрибута
<code>android:encryptionAware</code> в манифесте значение true.<p>
<p>Компоненты, поддерживающие шифрование, можно регистрировать для получения
<code>LOCKED_BOOT_COMPLETED</code> широковещательных сообщений от
системы после перезапуска устройства. В этот момент шифрованное хранилище устройства
доступно, и компонент может выполнять необходимые задачи в режиме
Direct Boot, например, включать будильник по расписанию.</p>
<p>В следующем фрагменте кода приведен пример регистрации компонента
{@link android.content.BroadcastReceiver} как поддерживающего шифрование и добавления
фильтра намерения <code>LOCKED_BOOT_COMPLETED</code> в манифест приложения:</p>
<pre>
&lt;receiever
android:encryptionAware="true" &gt;
...
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /&gt;
&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<p>После разблокировки устройства пользователем все компоненты имеют доступ к шифрованному хранилищу устройства
и к шифрованному хранилищу, требующему ввода учетных данных.</p>
<h2 id="access">Доступ к шифрованному хранилищу данных устройства</h2>
<p>Для получения доступа к шифрованному хранилищу устройства следует создать второй экземпляр
{@link android.content.Context} посредством вызова
<code>Context.createDeviceEncryptedStorageContext()</code>. Все вызовы API
системы хранения данных с использованием этого контекста получают доступ к шифрованному хранилищу устройства. В
следующем примере показано, как получить доступ к шифрованному хранилищу устройства и открыть существующий
файл данных приложения:</p>
<pre>
Context directBootContext = Context.createDeviceEncryptedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...
</pre>
<p>Шифрованное хранилище устройства следует использовать только для
информации, которая должна быть доступна в режиме Direct Boot.
Шифрованное хранилище устройства не следует использовать в качестве шифрованного хранилища общего назначения.
Для хранения данных пользователя или шифрованных данных, которые не требуются в режиме
Direct Boot, следует использовать шифрованное хранилище, требующее ввода учетных данных.</p>
<h2 id="notification">Уведомление о разблокировке пользователем</h2>
<p>Когда после перезагрузки устройства пользователь разблокирует его, ваше приложение может переключиться на
шифрованное хранилище, требующее ввода учетных данных, и использовать обычные системные службы,
зависящие от учетных данных пользователя.</p>
<p>Чтобы приложение получало уведомления о разблокировке устройства пользователем после перезагрузки,
необходимо зарегистрировать {@link android.content.BroadcastReceiver} работающего компонента
для отслеживания сообщения <code>ACTION_USER_UNLOCKED</code>. Также приложение может
получать существующее сообщение {@link android.content.Intent#ACTION_BOOT_COMPLETED
ACTION_BOOT_COMPLETED}, которое теперь указывает, что устройство загружено и разблокировано
пользователем.</p>
<p>Приложение может направлять запрос напрямую, если пользователь разблокирует устройство посредством вызова
<code>UserManager.isUserUnlocked()</code>.</p>
<h2 id="migrating">Перенос имеющихся данных</h2>
<p>Если пользователь обновит свое устройство для использования режима Direct Boot, вашему приложению может потребоваться перенести
имеющиеся данные в шифрованное хранилище устройства. Используйте
<code>Context.migrateSharedPreferencesFrom()</code> и
<code>Context.migrateDatabaseFrom()</code> для переноса данных о настройках и содержимого баз данных
между шифрованным хранилищем, требующим ввода учетных данных, и шифрованным хранилищем устройства.</p>
<p>Хорошо обдумайте, какие данные следует перенести из
шифрованного хранилища, требующего ввода учетных данных, в шифрованное хранилище устройства. Не следует переносить в
шифрованное хранилище устройства личные данные пользователя, такие как
пароли или токены авторизации. В некоторых случаях вашему приложению может потребоваться работать
с отдельными наборами данных в двух шифрованных хранилищах.</p>
<h2 id="testing">Тестирование приложения с поддержкой шифрования</h2>
<p>Протестируйте свое приложение с поддержкой шифрования в новом режиме Direct Boot. Существуют
два способа включить режим Direct Boot.</p>
<p class="caution"><strong>Внимание!</strong> При включении режима Direct Boot
с устройства удаляются все данные пользователя.</p>
<p>Чтобы включить режим
Direct Boot на поддерживаемых устройствах с Android N, выполните одну из следующих последовательностей действий.</p>
<ul>
<li>Включите на устройстве параметры разработчика <b>Developer options</b>, если вы еще не сделали этого ранее. Для этого
перейдите на экран <b>Settings &gt; About phone</b> и нажмите семь раз <b>Build number</b>.
Когда параметры разработчика станут доступны, откройте раздел
<b>Settings &gt; Developer options</b> и выберите
<b>Convert to file encryption</b>.</li>
<li>Используйте следующие команды оболочки adb для включения режима Direct Boot:
<pre class="no-pretty-print">
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
</pre>
</li>
</ul>
<p>Если вам требуется переключать
режимы на тестовых устройствах, вы можете использовать эмуляцию режима Direct Boot. Режим эмуляции следует использовать только для целей
разработки, в нем возможна потеря данных. Чтобы включить эмуляцию режима Direct Boot,
установите режим блокировки устройства, выберите пункт "No thanks", если система предлагает открыть
защищенный экран запуска при установке режима блокировки, а затем используйте
следующую команду оболочки adb:</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe true
</pre>
<p>Для отключения эмуляции режима Direct Boot нужно использовать следующую команду:</p>
<pre class="no-pretty-print">
$ adb shell sm set-emulate-fbe false
</pre>
<p>При использовании этих команд устройство перезагружается.</p>

View File

@@ -0,0 +1,158 @@
page.title=API-интерфейсы ICU4J в платформе Android
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа:</h2>
<ol>
<li><a href="#relation">Связь с ICU4J</a></li>
<li><a href="#migration">Переход на API-интерфейсы android.icu с ICU4J</a></li>
<li><a href="#licence">Лицензирование</a></li>
</ol>
<h2>См. также:</h2>
<ol>
<li>
<a class="external-link" href="http://userguide.icu-project.org">Документация по ICU4J</a>
</li>
<li>
<a class="external-link" href="http://site.icu-project.org/#TOC-What-is-ICU-">Последние стандарты, поддерживаемые
ICU4J</a>
</li>
</ol>
</div>
</div>
<p>
ICU4J — широко используемый набор библиотек Java с открытым кодом, обеспечивающий для приложений поддержку формата Unicode
и глобализации. Android N
открывает в платформе Android частичный набор API-интерфейсов ICU4J, который разработчики приложений
могут использовать в составе пакета {@code android.icu}. Эти API используют
данные локализации, присутствующие на устройстве. Это позволяет уменьшить размеры APK
, не компилируя библиотеки ICU4J в APK, а
просто вызывая их в платформе. (В этом случае может оказаться удобно предоставлять
<a href="{@docRoot}google/play/publishing/multiple-apks.html">несколько версий
вашего APK</a>, чтобы пользователи с версиями Android ниже Android N
могли загружать версию приложения, содержащую библиотеки ICU4J.)
</p>
<p>
В начале этого документа предоставляется базовая информация по минимальным уровням
Android API, которые требуются для поддержки этих библиотек. Далее приводятся необходимые пояснения
о реализации ICU4J в Android. В заключение
в нем рассказывается, как использовать API-интерфейсы ICU4J в платформе Android.
</p>
<h2 id="relation">Связь с ICU4J</h2>
<p>
В Android N частичный набор API-интерфейсов ICU4J открывается через пакет
<code>android.icu</code>, а не через <code>com.ibm.icu</code>. Для платформы
Android может быть принято решение не
открывать API-интерфейсы ICU4J по различным причинам. Например, Android N не открывает
некоторые устаревшие API-интерфейсы, а также те, которые рабочая группа ICU еще не объявила
стабильными. По мере того, как рабочая группа ICU будет объявлять API-интерфейсы устаревшими, они будут так же помечаться и в Android,
но при этом будут и дальше входить в состав платформы.
</p>
<p class="table-caption"><strong>Таблица 1.</strong> Версии ICU и CLDR, используемые
в Android N.</p>
<table>
<tr>
<th>Уровень Android API</th>
<th>Версия ICU</th>
<th>Версия CLDR</th>
</tr>
<tr>
<td>Android N</td>
<td>56</td>
<td>28</td>
</tr>
</table>
<p>Следует отметить несколько важных моментов:</p>
<ul>
<li>В состав API-интерфейсов ICU4J платформы Android входят не все API-интерфейсы ICU4J.</li>
<li>Разработчикам NDK следует помнить, что Android ICU4C не поддерживается.</li>
<li>API-интерфейсы в платформе Android не заменяют поддержку
<a href="{@docRoot}guide/topics/resources/localization.html">локализации с
ресурсами</a> в Android.</li>
</ul>
<h2 id="migration">Переход на пакет android.icu с com.ibm.icu</h2>
<p>
Если вы уже используете в своем приложении API-интерфейсы ICU4J, и если API
<code>android.icu</code> соответствуют вашим требованиям, то для перехода на
API-интерфейсы платформы вам нужно будет изменить импорт Java
с <code>com.ibm.icu</code> на <code>android.icu</code>. После этого вы сможете
удалить свои копии файлов ICU4J из APK.
</p>
<p class="note">
<b>Примечание</b>. API-интерфейсы ICU4J в платформе используют пространство имен {@code android.icu}
вместо {@code com.ibm.icu}. Это позволяет избежать конфликтов пространств имен
в пакетах APK, содержащих собственные библиотеки {@code com.ibm.icu}.
</p>
<h3 id="migrate-from-android">
Переход на API-интерфейсы android.icu с других API Android SDK
</h3>
<p>
Некоторые классы в пакетах <code>java</code> и <code>android</code> имеют
эквиваленты в ICU4J. Однако ICU4J обычно обеспечивает более широкую
поддержку стандартов и языков.
</p>
<p>Ниже приведены несколько примеров для начала работы:</p>
<table>
<tr>
<th>Класс</th>
<th>Альтернативы</th>
</tr>
<tr>
<td><code>java.lang.Character</code> </td>
<td><code>android.icu.lang.UCharacter</code> </td>
</tr>
<tr>
<td><code>java.text.BreakIterator</code> </td>
<td><code>android.icu.text.BreakIterator</code> </td>
</tr>
<tr>
<td><code>java.text.DecimalFormat</code> </td>
<td><code>android.icu.text.DecimalFormat</code> </td>
</tr>
<tr>
<td><code>java.util.Calendar</code></td>
<td>
<code>android.icu.util.Calendar</code></td>
</tr>
<tr>
<td><code>android.text.BidiFormatter</code>
</td>
<td><code>android.icu.text.Bidi</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateFormat</code>
</td>
<td><code>android.icu.text.DateFormat</code>
</td>
</tr>
<tr>
<td><code>android.text.format.DateUtils</code> </td>
<td><code>android.icu.text.DateFormat</code>
<code>android.icu.text.RelativeDateTimeFormatter</code>
</td>
</tr>
</table>
<h2 id="licence">Лицензирование</h2>
<p>
ICU4J выпускается по лицензии ICU. Более подробную информацию можно найти в <a class="external-link" href="http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-">Руководстве пользователя
ICU.</a>
</p>

View File

@@ -0,0 +1,582 @@
page.title=Поддержка многооконного режима
page.metaDescription=Новые возможности в Android N для одновременного отображения нескольких приложений.
page.keywords="multi-window", "android N", "split screen", "free-form"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа</h2>
<ol>
<li><a href="#overview">Обзор</a></li>
<li><a href="#lifecycle">Жизненный цикл многооконного режима</a></li>
<li><a href="#configuring">Настройка приложения для многооконного
режима</a></li>
<li><a href="#running">Запуск приложения в многооконном режиме</a></li>
<li><a href="#testing">Тестирование приложения в многооконном режиме</a></li>
</ol>
<h2>См. также:</h2>
<ol>
<li><a class="external-link" href="https://github.com/googlesamples/android-MultiWindowPlayground">Пример
многооконного демонстрационного приложения</a></li>
</ol>
</div>
</div>
<p>
В Android N добавлена поддержка отображения нескольких приложений
одновременно. На мобильных устройствах два приложения могут быть запущены рядом
или друг над другом в режиме <em>разделения экрана</em>. На телевизорах приложения могут
использовать режим <em>"картинка в картинке"</em>, чтобы воспроизводить видео,
пока пользователи работают с другим приложением.
</p>
<p>
Если вы создаете приложение с использованием N Preview SDK, вы можете указать, как оно
будет действовать в многооконном режиме. Например, можно задать минимальные
допустимые размеры окна приложения. Также можно отключить многооконный режим для приложения,
чтобы оно отображалось только в полноэкранном
режиме.
</p>
<h2 id="overview">Обзор</h2>
<p>
В Android N несколько приложений могут одновременно находиться на экране. Например,
пользователь может разделить экран, чтобы просматривать веб-страницу
слева и писать сообщение электронной почты справа. Возможности пользователя зависят от
устройства.
</p>
<ul>
<li>На мобильных устройствах с Android N доступен режим
разделения экрана. В этом режиме два приложения отображаются рядом
или друг над другом. Пользователь может перетащить
линию разделения, чтобы увеличить окно одного приложения и уменьшить окно другого.
</li>
<li>На устройствах Nexus Player с Android N для приложений
будет доступен <a href="picture-in-picture.html">режим "картинка в картинке"</a>, который
позволит приложению отображать контент, пока пользователь просматривает
другие приложения или взаимодействует с ними.
</li>
<li>Производители более крупных устройств могут активировать
режим произвольной формы, где пользователь может любым образом изменять размер каждого окна. В этом случае
помимо режима разделения экрана
на устройстве будет доступен и этот режим.
</li>
</ul>
<img src="{@docRoot}preview/images/mw-splitscreen.png" alt="" width="650" srcset="{@docRoot}preview/images/mw-splitscreen.png 1x,
{@docRoot}preview/images/mw-splitscreen_2x.png 2x," id="img-split-screen" />
<p class="img-caption">
<strong>Рис. 1.</strong> Два приложения отображаются рядом в режиме разделения экрана.
</p>
<p>
Пользователь может перейти в многооконный режим следующими способами.
</p>
<ul>
<li>Если пользователь откроет <a href="{@docRoot}guide/components/recents.html">экран
обзора</a> и длительно нажмет
название операции, ее можно будет перетащить в выделенную часть
экрана и переключить в многооконный режим.
</li>
<li>Если пользователь длительно нажмет кнопку "Обзор", устройство
переключит текущую операцию в многооконный режим и откроет экран обзора,
где пользователь сможет выбрать другую операцию для совместного отображения.
</li>
</ul>
<p>
Пользователи могут <a href="{@docRoot}guide/topics/ui/drag-drop.html">перетаскивать</a>
данные между окнами операций в режиме
совместного отображения. (Ранее перетаскивать данные можно было только в рамках
одной операции).
</p>
<h2 id="lifecycle">Жизненный цикл многооконного режима</h2>
<p>
Многооконный режим не меняет <a href="{@docRoot}training/basics/activity-lifecycle/index.html">жизненный
цикл операции</a>.
</p>
<p>
В этом режиме в каждый момент времени активной
является только последняя операция, с которой взаимодействовал пользователь. Такая операция считается <em>самой верхней</em>.
Все другие операции приостановлены, даже если они отображаются.
Однако система отдает приостановленным, но видимым операциям более
высокий приоритет, чем невидимым. Если пользователь взаимодействует с
одной из приостановленных операций, она возобновляется, а прежняя самая верхняя
операция приостанавливается.
</p>
<p class="note">
<strong>Примечание.</strong> В многооконном режиме приложение может быть приостановлено
и по-прежнему видимо для пользователя. Приложению может потребоваться
продолжать свои операции, даже если оно приостановлено. Например, видимое приостановленное приложение,
воспроизводящее видео, будет по-прежнему показывать видео. Поэтому
мы <em>не</em> рекомендуем приостанавливать воспроизведение
в обработчиках {@link android.app.Activity#onPause onPause()} таких приложений.
Вместо этого следует приостановить видео в {@link android.app.Activity#onStop
onStop()} и возобновить воспроизведение в {@link android.app.Activity#onStart
onStart()}.
</p>
<p>
Если пользователь переводит приложение в многооконный режим, система
уведомляет операцию об изменении конфигурации, как указано в документе <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений
во время выполнения</a>. По сути это изменение так же действует
на жизненный цикл операции, как уведомление приложения системой
о переходе устройства из вертикальной ориентации в
горизонтальную, только изменяются размеры экрана, а не ориентация. Как описано в документе <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Обработка изменений
во время выполнения</a>, операция может обработать изменение
конфигурации самостоятельно или может позволить системе
удалить окно операции и создать его заново с новыми размерами.
</p>
<p>
Если пользователь увеличивает одну из сторон окна, система меняет
размер окна операции в соответствии с действием пользователя и применяет <a href="{@docRoot}guide/topics/resources/runtime-changes.html">изменения в режиме выполнения</a>
по мере необходимости. Если приложение не успевает отрисовать новые области, система
временно заполняет их цветом, заданным атрибутом {@link
android.R.attr#windowBackground windowBackground} или атрибутом стиля
<code>windowBackgroundFallback</code> по умолчанию.
</p>
<h2 id="configuring">Настройка приложения для многооконного режима</h2>
<p>
Если ваше приложение предназначено для Android N, вы
можете указать, каким образом поддерживают (и поддерживают ли) операции вашего приложения многооконный режим. Атрибуты управления размером и макетом устанавливаются
в манифесте.
Настройки атрибутов корневой операции применяются
ко всем операциям в ее стеке задач.
</p>
<p class="note">
<strong>Примечание.</strong> Если приложение с поддержкой различной
ориентации было создано с версией SDK,
более ранней, чем Android N, и пользователь запустит это приложение в многооконном режиме, система принудительно изменит размер приложения. Система отображает диалоговое окно
с предупреждением о том, что приложение может работать непредвиденным образом. Система
<em>не</em> меняет размер окна для приложений с
фиксированной ориентацией. Если пользователь попытается открыть такое приложение
в многооконном режиме, оно займет весь экран.
</p>
<h4 id="resizeableActivity">android:resizeableActivity</h4>
<p>
Установите этот атрибут в узле <code>&lt;activity&gt;</code> или
<code>&lt;application&gt;</code> манифеста, чтобы включить или отключить многооконный
режим:
</p>
<pre>
android:resizeableActivity=["true" | "false"]
</pre>
<p>
Если для этого атрибута задано значение true, операцию можно запускать
в режимах разделения экрана и произвольной формы. Если для атрибута задано значение false,
операция не поддерживает многооконный режим. Если значение равно false и
пользователь пытается запустить операцию в многооконном режиме, она
занимает весь экран.
</p>
<p>
Если приложение предназначено для Android N, но
значение для этого атрибута не было указано, то по умолчанию используется значение true.
</p>
<h4 id="supportsPictureInPicture">android:supportsPictureInPicture</h4>
<p>
Установите этот атрибут в узле <code>&lt;activity&gt;</code> манифеста,
чтобы указать, поддерживает ли операция режим "картинка в картинке". Этот
атрибут не принимается во внимание, если для <code>android:resizeableActivity</code> установлено значение false.
</p>
<pre>
android:supportsPictureInPicture=["true" | "false"]
</pre>
<h3 id="layout">Атрибуты макета</h3>
<p>
В Android N элемент манифеста <code>&lt;layout&gt;</code> поддерживает
несколько атрибутов, которые определяют поведение
операции в многооконном режиме.
</p>
<dl>
<dt>
<code>android:defaultWidth</code>
</dt>
<dd>
Ширина окна операции по умолчанию в режиме произвольной формы.
</dd>
<dt>
<code>android:defaultHeight</code>
</dt>
<dd>
Высота окна операции по умолчанию в режиме произвольной формы.
</dd>
<dt>
<code>android:gravity</code>
</dt>
<dd>
Начальная позиция окна операции в режиме произвольной формы. Допустимые значения
см. в описании класса {@link android.view.Gravity}.
</dd>
<dt>
<code>android:minimalSize</code>
</dt>
<dd>
Минимальные значения высоты и ширины окна операции в режимах разделения экрана
и произвольной формы. Если пользователь перемещает разделительную линию
в режиме разделения экрана, чтобы сделать размер окна операции
меньше указанного минимума, система обрезает его до запрошенного пользователем размера.
</dd>
</dl>
<p>
В следующем примере кода показано, как задать размер и
позицию окна операции по умолчанию, а также ее минимальный размер в
режиме произвольной формы:
</p>
<pre>
&lt;activity android:name=".MyActivity"&gt;
&lt;layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end"
android:minimalSize="450dp" /&gt;
&lt;/activity&gt;
</pre>
<h2 id="running">Запуск приложения в многооконном режиме</h2>
<p>
Android N предоставляет новые возможности для поддержки
приложений в многооконном режиме.
</p>
<h3 id="disabled-features">Недоступные возможности в многооконном режиме</h3>
<p>
Некоторые возможности отключены или игнорируются в многооконном
режиме, потому что они не имеют смысла для операции, которая отображается
на экране устройства одновременно с другими операциями или приложениями. Ниже приведены примеры таких возможностей.
<ul>
<li>Отключены некоторые параметры настройки <a href="{@docRoot}training/system-ui/index.html">системного интерфейса</a>.
Например, приложения не могут
скрыть строку состояния, если они не работают в полноэкранном режиме.
</li>
<li>Система не учитывает изменения атрибута <code><a href=
"{@docRoot}guide/topics/manifest/activity-element.html#screen"
>android:screenOrientation</a></code>.
</li>
</ul>
<h3 id="change-notification">Уведомления об изменениях и запросы в многооконном режиме</h3>
<p>
Для поддержки многооконного режима в класс {@link android.app.Activity}
были добавлены следующие методы. Подробнее о каждом из них см. в
<a href="{@docRoot}preview/setup-sdk.html#docs-dl">справочнике по N Preview SDK</a>.
</p>
<dl>
<dt>
<code>Activity.inMultiWindow()</code>
</dt>
<dd>
Вызовите этот метод, чтобы узнать, находится ли операция в многооконном режиме.
</dd>
<dt>
<code>Activity.inPictureInPicture()</code>
</dt>
<dd>
Вызовите этот метод, чтобы узнать, находится ли операция в режиме "картинка в картинке".
<p class="note">
<strong>Примечание.</strong> Режим "картинка в картинке" — это частный
случай многооконного режима. Если метод <code>myActivity.inPictureInPicture()</code>
возвращает значение true, <code>myActivity.inMultiWindow()</code> также возвращает
true.
</p>
</dd>
<dt>
<code>Activity.onMultiWindowChanged()</code>
</dt>
<dd>
Система вызывает этот метод, когда операция переходит в многооконный
режим или выходит из него. Система передает методу значение true, если
операция входит в многооконный режим, и значение false, если
она выходит из него.
</dd>
<dt>
<code>Activity.onPictureInPictureChanged()</code>
</dt>
<dd>
Система вызывает этот метод, когда операция переходит в режим
"картинка в картинке". Система передает методу значение true,
если операция входит в режим "картинка в картинке", и значение false,
если она выходит из него.
</dd>
</dl>
<p>
Также существуют версии {@link android.app.Fragment} для этих методов,
например, <code>Fragment.inMultiWindow()</code>.
</p>
<h3 id="entering-pip">Переход в режим "картинка в картинке"</h3>
<p>
Чтобы перевести операцию в режим "картинка в картинке",
вызовите новый метод <code>Activity.enterPictureInPicture()</code>. Этот метод игнорируется, если
устройство не поддерживает режим "картинка в картинке". Дополнительная информация содержится в документации
<a href="picture-in-picture.html">Режим "картинка в картинке"</a>.
</p>
<h3 id="launch">Запуск новых операций в многооконном режиме</h3>
<p>
При запуске новой операции можно сообщить системе, что окно новой
операции следует показать рядом с текущим, если это возможно. Для этого
используйте флаг
<code>Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT</code>. Этот
флаг запрашивает следующее поведение.
</p>
<ul>
<li>Если устройство находится в режиме разделения экрана, система пытается
создать окно новой операции рядом с окном запустившей ее операции,
чтобы разместить две операции на экране. Не гарантируется, что система сможет это сделать, но если
это возможно, операции отображаются рядом друг с другом.
</li>
<li>Если устройство не находится в режиме разделения экрана, этот флаг не учитывается.
</li>
</ul>
<p>
Если при запуске
новой операции устройство находится в режиме произвольной формы, вы можете задать размеры и позицию окна новой операции,
вызвав метод <code>ActivityOptions.setLaunchBounds()</code>. Этот метод игнорируется, если
устройство не находится в многооконном режиме.
</p>
<p class="note">
<strong>Примечание.</strong> Если запустить операцию в стеке задач,
она заменит операцию на экране, унаследовав все ее
свойства многооконного режима. Чтобы запустить новую операцию в отдельном
окне в многооконном режиме, ее следует запустить в новом стеке задач.
</p>
<h3 id="dnd">Поддержка перетаскивания</h3>
<p>
Пользователи могут <a href="{@docRoot}guide/topics/ui/drag-drop.html">перетаскивать</a> данные
между окнами операций в режиме
совместного отображения. (Ранее перетаскивать данные можно было только в рамках
одной операции). Поэтому вы можете реализовать функции перетаскивания
в своем приложении, если оно еще их не поддерживает.
</p>
<p>
В N Preview SDK пакет <a href="{@docRoot}reference/android/view/package-summary.html"><code>android.view</code></a>
расширен для поддержки перетаскивания между приложениями. Дополнительная информация о нижеприведенных классах
и методах содержится в <a href="{@docRoot}preview/setup-sdk.html#docs-dl">справочнике по N
Preview SDK</a>.
</p>
<dl>
<dt>
<code>android.view.DropPermissions</code>
</dt>
<dd>
Объект токена для указания разрешений
приложению, в которое перетаскиваются данные.
</dd>
<dt>
<code>View.startDragAndDrop()</code>
</dt>
<dd>
Новый псевдоним для {@link android.view.View#startDrag View.startDrag()}. Чтобы
разрешить перетаскивание между операциями, передайте
новый флаг <code>View.DRAG_FLAG_GLOBAL</code>. Если вам нужно предоставить принимающей операции разрешения на чтение или запись URI,
передайте новый флаг
<code>View.DRAG_FLAG_GLOBAL_URI_READ</code> или
<code>View.DRAG_FLAG_GLOBAL_URI_WRITE</code> соответственно.
</dd>
<dt>
<code>View.cancelDragAndDrop()</code>
</dt>
<dd>
Отменяет текущую операцию перетаскивания. Этот метод может вызвать только
приложение, в котором была инициирована операция перетаскивания.
</dd>
<dt>
<code>View.updateDragShadow()</code>
</dt>
<dd>
Заменяет тень текущей операции перетаскивания. Этот метод может вызвать только приложение,
в котором была инициирована операция перетаскивания.
</dd>
<dt>
<code>Activity.requestDropPermissions()</code>
</dt>
<dd>
Запрашивает разрешения для URI контента, переданных в объекте {@link
android.content.ClipData} в {@link android.view.DragEvent}.
</dd>
</dl>
<h2 id="testing">Тестирование приложения в многооконном режиме</h2>
<p>
Независимо от того, обновляете ли вы свое приложение для Android N, вам необходимо
подтвердить его поведение в многооконном
режиме на тот случай, если пользователь попытается запустить его в этом режиме на устройстве с Android N.
</p>
<h3 id="configuring">Настройка тестового устройства</h3>
<p>
Если установить Android N на устройстве, режим разделения
экрана будет поддерживаться автоматически.
</p>
<h3 id="test-non-n">Если приложение было создано без использования N Preview SDK</h3>
<p>
Если вы не применяли N Preview SDK для создания приложения и пользователь
попытается запустить его в многооконном режиме, система принудительно
изменит размер окна приложения, если его ориентация не зафиксирована.
</p>
<p>
Если для приложения не задана фиксированная ориентация, вам
следует запустить его на устройстве с Android N и попытаться
перевести его в режим разделения экрана. Убедитесь, что приложение
работает нормально после принудительного изменения размера.
</p>
<p>
Если для приложения задана фиксированная ориентация, попытайтесь
перевести его в многооконный режим. Убедитесь, что при этом
приложение остается в полноэкранном режиме.
</p>
<h3 id="test-mw">Если приложение поддерживает многооконный режим</h3>
<p>
Если вы использовали N Preview SDK для создания приложения и не
отключили поддержку многооконного режима, проверьте работу
приложения, как описано далее, в режимах разделения экрана и произвольной формы.
</p>
<ul>
<li>Запустите приложение в полноэкранном режиме, а затем переключитесь
в многооконный режим долгим нажатием кнопки "Обзор". Убедитесь, что приложение корректно переключается между режимами.
</li>
<li>Запустите приложение непосредственно в многооконном режиме
и убедитесь, что оно работает нормально. Вы можете запустить приложение в многооконном режиме, нажав
кнопку "Обзор", затем длительно нажав строку заголовка приложения и
перетащив ее в одну из выделенных областей на экране.
</li>
<li>Измените размер окна приложения в режиме разделения экрана, перетащив линию разделения.
Убедитесь, что изменение размера не приводит к сбою и что необходимые
элементы интерфейса остаются видимыми.
</li>
<li>Если вы указали минимальные размеры окна приложения, попытайтесь
установить размер меньше минимального. Убедитесь в невозможности установить размер
меньше указанного минимума.
</li>
<li>Во время всех тестов следите за производительностью приложения — она должна быть приемлемой. Например,
убедитесь, что после изменения размера окна приложения не возникает большой
задержки обновления интерфейса.
</li>
</ul>
<h4 id="test-checklist">Контрольный список тестирования</h4>
<p>
Для проверки производительности приложения в многооконном режиме
выполните следующие операции. Попытайтесь выполнить их в режиме разделения экрана и
в многооконном режиме, если не указано иное.
</p>
<ul>
<li>Перейдите в многооконный режим и выйдите из него.
</li>
<li>Переключитесь из своего приложения в другое приложение и убедитесь,
что приложение работает нормально, если оно видимо, но не активно. Например, если приложение
показывает видео, оно должно продолжать воспроизведение, когда
пользователь работает с другим приложением.
</li>
<li>В режиме разделения экрана попробуйте перемещать линию
разделения, увеличивая и уменьшая окно приложения. Попробуйте выполнить эти операции, когда окна двух
приложений находятся рядом и друг над другом. Убедитесь, что приложение не завершается с ошибкой,
необходимые элементы видны и изменение размера не занимает
слишком много времени.
</li>
<li>Быстро измените размер окна приложения несколько раз подряд. Убедитесь, что
приложение не зависает и не вызывает утечку памяти. Информация о проверке использования памяти
приложением содержится в документе <a href="{@docRoot}tools/debugging/debugging-memory.html">
Анализ использования оперативной памяти</a>.
</li>
<li>Поработайте с приложением в различных оконных конфигурациях и
убедитесь, что оно ведет себя должным образом. Текст должен легко читаться, а
элементы интерфейса не должны быть слишком маленькими.
</li>
</ul>
<h3 id="test-disabled-mw">Если вы отключили поддержку многооконного режима</h3>
<p>
Если вы отключили поддержку многооконного режима,
установив атрибут <code>android:resizableActivity="false"</code>, запустите
приложение на устройстве с Android N и
попытайтесь перевести его в режимы произвольной формы и разделения экрана. Убедитесь, что при этом
приложение остается в полноэкранном режиме.
</p>

View File

@@ -0,0 +1,214 @@
page.title=Язык и языковой стандарт
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа:</h2>
<ol>
<li><a href="#preN">Сложности с разрешением языковых ресурсов</a></li>
<li><a href="#postN">Улучшение стратегии разрешения ресурсов</a></li>
<li><a href="#design">Проектирование приложения для поддержки дополнительных
языковых стандартов</a></li>
</ol>
</div>
</div>
<p>Android N обеспечивает расширенную поддержку многоязычных пользователей,
позволяя им выбирать в настройках из нескольких языковых стандартов. Эта возможность реализована в Android N
за счет значительного увеличения числа поддерживаемых языковых стандартов
и изменения способа разрешения ресурсов в системе. Новый метод разрешения
ресурсов более надежен и разработан с учетом совместимости с существующими APK. Тем не менее,
при его использовании следует очень внимательно следить за признаками непредвиденного поведения приложения. Например, при его использовании
следует провести тесты и убедиться, что приложение по умолчанию использует ожидаемый язык. Если
ваше приложение поддерживает несколько языков, нужно убедиться, что поддержка работает
ожидаемым образом. Также следует попытаться обеспечить корректную работу приложения с
языками, поддержка которых не предусматривалась явным образом в его коде.</p>
<p>В начале этого документа рассказывается о стратегии разрешения ресурсов, которая использовалась до появления
Android N. Далее в нем описывается улучшенная стратегия
разрешения ресурсов в Android N. В последней части документа рассказывается о том, как использовать
дополнительные языковые стандарты для поддержки большего числа многоязычных пользователей.</p>
<h2 id="preN">Сложности с разрешением языковых ресурсов</h2>
<p>До выпуска Android N в Android не всегда удавалось успешно сопоставлять
языковые стандарты приложений и системы. Допустим, по умолчанию в вашем приложении используется английский язык
(США), но оно также содержит строки на испанском, локализованные в файлах ресурсов {@code es_ES}.
</p>
<p>В коде Java разрешение языков строк происходило следующим
образом:</p>
<ul>
<li>Если на устройстве был установлен язык {@code es_MX} (испанский, Мексика), Android загружал
строки из файлов ресурсов {@code es_ES}.</li>
<li>Если на устройстве был установлен язык {@code en_AU}, Android возвращался к языку {@code
en_US}. Также система использовала по умолчанию язык {@code en_US}, если пользователь выбирал язык,
который вообще не поддерживался приложением, например, французский.</li>
</ul>
<p>Проблемы с разрешением возникали из-за того, что система удаляла код страны
из строки языкового стандарта при отсутствии точного совпадения. Например:</p>
<p class="table-caption" id="t-resource-res">
<strong>Таблица 1.</strong> Разрешение ресурсов без точного совпадения языковых стандартов.
</p>
<table>
<tbody>
<tr>
<th>Пользовательские настройки</th>
<th>Ресурсы приложения</th>
<th>Разрешение ресурсов</th>
</tr>
<tr>
<td>fr_CH</td>
<td>
по умолчанию (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Попытка использования fr_CH =&gt; Отказ<br>
Попытка использования fr =&gt; Отказ<br>
Использование языка по умолчанию (en)
</td>
</tr>
</tbody>
</table>
<p>В этом примере система отображает строки на английском,
не зная, понимает ли пользователь английский язык. Такое поведение приложений сейчас довольно
распространено. С выпуском Android N подобные ситуации
будут возникать намного реже.</p>
<h2 id="postN">Улучшение стратегии разрешения ресурсов</h2>
<p>В Android N используется более надежная система разрешения ресурсов,
которая автоматически находит более подходящие альтернативные варианты. Однако для ускорения процесса разрешения и упрощения
обслуживания ресурсы следует хранить на наиболее распространенном языке верхнего уровня.
Например, если вы хранили ресурсы на испанском в каталоге{@code es-US}
, их следует переместить в каталог {@code es-419}, где содержатся ресурсы на латиноамериканском диалекте испанского языка.
Аналогичным образом, если вы хранили строки ресурсов в папке {@code en-GB}, вам следует изменить название папки
на {@code en-001} (международная версия английского языка), поскольку {@code en-001} — наиболее распространенный
язык верхнего уровня для строк <code>en-GB</code>.
В следующих примерах объясняется, почему такая практика повышает производительность и
надежность процесса разрешения ресурсов.</p>
<h3>Примеры разрешения ресурсов</h3>
<p>В Android N ситуация, описанная в <strong>Таблице 1</strong>, разрешается
иначе:</p>
<p class="table-caption" id="t-improved-res">
<strong>Таблица 2.</strong> Улучшенная стратегия разрешения при отсутствии
точного совпадения языкового стандарта.</p>
<table>
<tr>
<th>Пользовательские настройки</th>
<th>Ресурсы приложения</th>
<th>Разрешение ресурсов</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
по умолчанию (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Попытка использования fr_CH =&gt; Отказ<br>
Попытка использования fr =&gt; Отказ<br>
Попытка использования диалекта fr =&gt; fr_FR<br>
Использование fr_FR
</td>
</tr>
</table>
<p>В этом примере пользователь получает ресурсы на французском языке, а не на английском. В этом примере также показано, почему для Android N
следует хранить строки на французском языке в каталоге {@code fr}, а не в каталоге {@code fr_FR}.
Здесь целью разрешения является нахождение наиболее близкого диалекта верхнего уровня,
что ускоряет процесс разрешения и делает его более предсказуемым.</p>
<p>Помимо улучшенной логики разрешения в Android добавлены
дополнительные языки. Рассмотрим предыдущий пример в ситуации, когда итальянский
указан как дополнительный язык пользователя, а приложение не поддерживает французский язык. </p>
<p class="table-caption" id="t-2d-choice">
<strong>Таблица 3.</strong> Разрешение ресурсов в ситуации, когда приложение находит соответствие только для
второго предпочитаемого пользователем языкового стандарта.</p>
<table>
<tr>
<th>Пользовательские настройки</th>
<th>Ресурсы приложения</th>
<th>Разрешение ресурсов</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
<li> it_CH</li>
</ol>
</td>
<td>
по умолчанию (en)<br>
de_DE<br>
es_ES<br>
it_IT<br>
</td>
<td>
Попытка использования fr_CH =&gt; Отказ<br>
Попытка использования fr =&gt; Отказ<br>
Попытка использования диалекта fr =&gt; Отказ<br>
Попытка использования it_CH =&gt; Отказ<br>
Попытка использования it =&gt; Отказ<br>
Попытка использования диалекта it =&gt; it_IT<br>
Использование it_IT
</td>
</tr>
</table>
<p>Пользователь получает данные на понятном ему языке, хотя приложение и не
поддерживает французский язык.</p>
<h2 id="design">Проектирование приложения для поддержки дополнительных языковых стандартов</h2>
<h3>API LocaleList</h3>
<p>В Android N добавлен новый API {@code LocaleList.GetDefault()},
позволяющий приложениям напрямую запрашивать список языков, выбранных пользователем. Этот API
позволяет реализовать более сложное поведение
приложений и лучше оптимизировать отображение содержимого на экране. Например, результаты поиска
могут отображаться на разных языках в зависимости от пользовательских настроек. Приложения в браузере
могут не предлагать пользователю перевести приложения на знакомый ему язык,
а приложения, использующие клавиатуру, могут автоматически включать все подходящие раскладки. </p>
<h3>Средства форматирования</h3>
<p>Версии Android до 6.0 включительно (уровень API 23) поддерживали только один или два языковых стандарта
для большинства распространенных языков
(en, es, ar, fr, ru). Поскольку у каждого языка имелось лишь немного вариантов,
приложения могли хранить числа и даты в виде жестко закодированных строк
в файлах ресурсов. Однако с расширением числа поддерживаемых Android языковых стандартов
могут возникнуть
значительные различия форматов даты, времени, валюты и другой подобной
информации даже в рамках одного языкового стандарта. Жесткое кодирование форматов может запутать
конечных пользователей. Поэтому при разработке приложений для Android N
следует использовать средства форматирования, а не жесткое кодирование строк с числами и датами.</p>
<p>В качестве наглядного примера можно привести арабский язык, поддержка которого в Android N расширена
с одного {@code ar_EG} до 27 языковых стандартов. Большинство ресурсов этих языковых стандартов общие, но
в некоторых из них используются цифры формата ASCII, а в других — собственные цифры. Например,
если вы хотите создать предложение с числовой переменной
"Выберите ПИН-код из 4 цифр", вам нужно использовать средства форматирования следующим образом:</p>
<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>

View File

@@ -0,0 +1,328 @@
page.title=Уведомления
page.tags=notifications
helpoutsWidget=true
page.image=/preview/images/notifications-card.png
trainingnavtop=true
@jd:body
<div id="qv-wrapper">
<div id="qv">
<!-- table of contents -->
<h2>Содержание:</h2>
<ol>
<li><a href="#direct">Прямой ответ</a></li>
<li><a href="#bundle">Группы уведомлений</a></li>
<li><a href="#custom">Собственные представления</a></li>
</ol>
</div>
</div>
<p>В Android N представлено несколько новых API-интерфейсов, позволяющих
публиковать заметные и интерактивные уведомления.</p>
<p>Существующий API-интерфейс уведомлений {@link android.support.v4.app.RemoteInput}
в Android N расширен для поддержки внутренних ответов на смартфонах. С помощью этой возможности
пользователи могут быстро отвечать на сообщения в панели уведомлений, не открывая приложение.</p>
<p>
Android N также позволяет группировать несколько похожих
уведомлений, чтобы они отображались как одно. Для этого в Android N используется существующий метод {@link
android.support.v4.app.NotificationCompat.Builder#setGroup
NotificationCompat.Builder.setGroup()}. Пользователи могут развернуть все
уведомления и выполнить различные действия, например ответить на сообщение
или закрыть каждое из уведомлений по отдельности в панели уведомлений.
</p>
<p>Наконец, в Android N представлены новые API-интерфейсы, позволяющие
использовать системные элементы в собственных представлениях уведомлений вашего приложения. Благодаря им
уведомления отображаются единообразно на основе
стандартных шаблонов.</p>
<p>В этом документе рассматриваются некоторые наиболее важные изменения,
которые следует учитывать при использовании новых уведомлений в приложениях.</p>
<h2 id="direct">Прямой ответ</h2>
<p>С помощью прямых ответов пользователи
Android N могут быстро отвечать на текстовые сообщения и обновлять списки задач непосредственно в интерфейсе
уведомлений. На мобильных устройствах действие внутреннего ответа обозначается
как дополнительная кнопка в уведомлении. Если пользователь набирает ответ на клавиатуре, система
прикрепляет текст ответа к намерению,
указанному для действия уведомления, и передает намерение в ваше
приложение.
<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
{@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
<p class="img-caption">
<strong>Рисунок 1.</strong> В Android N добавлена кнопка <strong>Reply</strong>.
</p>
<h3>Добавление действий внутренних ответов</h3>
<p>Создание действия уведомления, которое поддерживает прямой ответ:
</p>
<ol>
<li>Создайте экземпляр класса {@link android.support.v4.app.RemoteInput.Builder},
который можно добавить в действие
уведомления. Конструктор класса принимает строку, которую система использует как
ключ для введенного текста. Потом ваше приложение использует этот ключ для получения
текста.
<pre>
// Key for the string that's delivered in the action's intent
private static final String KEY_TEXT_REPLY = "key_text_reply";
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
</pre>
</li>
<li>Прикрепите объект {@link android.support.v4.app.RemoteInput}
к действию с помощью метода <code>addRemoteInput()</code>.
<pre>
// Create the reply action and add the remote input
Notification.Action action =
new Notification.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
.build();
</pre>
</li>
<li>Примените действие к уведомлению и отправьте его.
<pre>
// Build the notification and add the action
Notification notification =
new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.content))
.addAction(action))
.build();
// Issue the notification
NotificationManager notificationManager =
NotificationManager.from(mContext);
notificationManager.notify(notificationId, notification);
</pre>
</li>
</ol>
<p> Система запрашивает у пользователя ввод ответа, если он инициирует
действие уведомления. </p>
<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
{@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
<p class="img-caption">
<strong>Рисунок 2.</strong> Пользователь вводит текст в панели уведомлений.
</p>
<h3>Получение введенного пользователем текста из внутреннего ответа</h3>
<p>Получение введенного пользователем текста из интерфейса
уведомлений в операции, объявленной в намерении действия:</p>
<ol>
<li> Вызовите метод {@link android.support.v4.app.RemoteInput#getResultsFromIntent
getResultsFromIntent()}, передав намерение действия уведомления
в качестве входного параметра. Этот метод возвращает объект {@link android.os.Bundle},
содержащий текст ответа.
</li>
<pre>
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
</pre>
<li>Запросите группу, используя ключ результата (предоставленный конструктору {@link
android.support.v4.app.RemoteInput.Builder}).
</li>
</ol>
<p>В следующем фрагменте кода показано, как метод извлекает введенный
текст из группы:</p>
<pre>
// Obtain the intent that started this activity by calling
// Activity.getIntent() and pass it into this method to
// get the associated string.
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
return null;
}
</pre>
<p>Приложения могут применять логику, чтобы определить, какие действия следует выполнить с полученным
текстом.
Для интерактивных приложений (например, чатов) предоставьте больше контекста в самом уведомлении
(например, несколько строк истории чата, в том числе собственные сообщения пользователя),
чтобы у пользователя было достаточно информации для ответа.
Когда пользователь отвечает через {@link android.support.v4.app.RemoteInput},
добавьте текст в историю ответов, применив метод {@code setRemoteInputHistory()}.
</p>
<h2 id="bundle">Группы уведомлений</h2>
<p>Android N предоставляет разработчикам новый способ отображения
очереди уведомлений: <i>группы уведомлений</i>. Они похожи на
<a href="{@docRoot}training/wearables/notifications/stacks.html">стеки
уведомлений</a> в Android Wear. Например, если приложение создает уведомления
для входящих сообщений и получено несколько сообщений, объедините
уведомления в одну группу. Для группировки похожих уведомлений используйте
существующий метод {@link android.support.v4.app.NotificationCompat.Builder#setGroup
Builder.setGroup()}.</p>
<p>
Уведомления в группе формируют иерархию,
на вершине которой находится родительское уведомление, отображающее
сводную информацию о группе. Пользователь может постепенно
раскрывать группу уведомлений, при этом система показывает дополнительные
сведения. Если пользователь раскрывает группу, система отображает больше
информации о всех дочерних уведомлениях. Если же пользователь
развернет одно из уведомлений, его содержимое показывается полностью.
</p>
<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
{@docRoot}preview/images/bundles_2x.png 2x" width="300">
<p class="img-caption">
<strong>Рисунок 3.</strong> Пользователь может постепенно раскрывать группу уведомлений.
</p>
<p>Добавление уведомлений в группу описано в разделе
<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Добавление
каждого уведомления в группу</a>.</p>
<h3 id="best-practices">Рекомендации по работе с группами уведомлений</h3>
<p>В этом разделе описываются рекомендации по использованию групп
уведомлений вместо уведомлений {@link android.app.Notification.InboxStyle InboxStyle},
которые были доступны в предыдущих версиях платформы
Android.</p>
<h3>Ситуации, в которых следует использовать группы уведомлений</h3>
<p>Вам следует использовать группы уведомлений, только если выполняются
все следующие условия.</p>
<ul>
<li>Дочерние уведомления являются полноценными уведомлениями, которые можно
показать отдельно без сводной информации о группе.</li>
<li>Отображение дочерних уведомлений по отдельности имеет смысл. Например:
</li>
<ul>
<li>в дочерних уведомлениях можно выполнять какие-либо соответствующие им действия;</li>
<li>дочернему уведомлению предшествует больше информации, чем требуется пользователю.</li>
</ul>
</ul>
<p>Примером использования групп уведомлений может служить приложение
для обмена сообщениями, которое показывает список входящих сообщений,
или почтовое приложение, отображающее список полученных писем.</p>
<p>
К примерам ситуаций, когда предпочтительнее использовать одно
уведомление, относятся отдельные сообщения от одного пользователя или
списочное представление однострочных текстовых элементов. Для них можно использовать
{@link android.app.Notification.InboxStyle InboxStyle} или
{@link android.app.Notification.BigTextStyle BigTextStyle}.
</p>
<h3 id ="post">Отображение группы уведомлений</h3>
<p>
Приложение всегда должно публиковать сводную информацию группы, даже если эта группа содержит
всего одно дочернее уведомление. В этом случае система не показывает сводную информацию, а
непосредственно отображает это уведомление. Это обеспечивает
единообразие интерфейса при
пролистывании дочернего элемента группы.
</p>
<p class="note">
<strong>Примечание.</strong> Эта версия Android N пока еще не
блокирует отображение сводной информации для групп уведомлений, содержащих только один дочерний элемент. Эта
возможность будет добавлена в следующих версиях Android N.
</p>
<h3>Всплывающие уведомления</h3>
<p>Хотя система обычно отображает дочерние уведомления в виде группы,
их можно временно показывать в виде
<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">всплывающих
уведомлений</a>. Эта возможность очень удобна, так как позволяет
быстро получить доступ к последнему дочернему уведомлению и связанным с ним действиям.
</p>
<h3>Обратная совместимость</h3>
<p>
И группы уведомлений, и удаленный ввод входили в состав API {@link
android.app.Notification} для поддержки устройств
Android Wear, начиная с Android 5.0 (уровень API 21). Если вы уже использовали эти API-интерфейсы для создания уведомлений,
вам нужно только убедиться, что поведение приложения соответствует
описанным выше рекомендациям, и рассмотреть возможность реализации {@code
setRemoteInputHistory()}.
</p>
<p>
Для поддержки обратной совместимости те же API-интерфейсы доступны в
классе {@link android.support.v4.app.NotificationCompat}
вспомогательной библиотеки, что позволяет реализовать уведомления, работающие в предыдущих версиях Android.
На смартфонах и планшетах пользователи видят только сводное уведомление,
поэтому в приложении все равно должно быть уведомление
в стиле Inbox или аналогичное уведомление, содержащее всю информацию о группе. Так как устройства Android
Wear позволяют пользователям видеть все дочерние уведомления даже
на более ранних уровнях платформы, эти уведомления следует создавать независимо от уровня API.
</p>
<h2 id="custom"> Собственные представления</h2>
<p>Начиная с Android N, вы можете настраивать представления уведомлений
и по-прежнему получать системные элементы, такие как заголовки уведомлений, действия и
расширяемые макеты.</p>
<p>Для этого в Android N добавлены следующие API-интерфейсы, позволяющие
настраивать собственные представления.</p>
<dl>
<dt>
{@code DecoratedCustomViewStyle()}</dt>
<dd> Определяет стиль для всех уведомлений, кроме
уведомлений мультимедиа.</dd>
<dt>
{@code DecoratedMediaCustomViewStyle()}</dt>
<dd> Определяет стиль для уведомлений мультимедиа.</dd>
</dl>
<p>Чтобы воспользоваться этим новым API-интерфейсом, вызовите метод {@code setStyle()}, передав в него
нужный стиль собственного представления.</p>
<p>В этом фрагменте показано, как создать собственный объект уведомления с помощью метода
{@code DecoratedCustomViewStyle()}.</p>
<pre>
Notification noti = new Notification.Builder()
.setSmallIcon(R.drawable.ic_stat_player)
.setLargeIcon(albumArtBitmap))
.setCustomContentView(contentView);
.setStyle(new Notification.DecoratedCustomViewStyle())
.build();
</pre>

View File

@@ -0,0 +1,186 @@
page.title=Режим "картинка в картинке"
page.keywords=preview,sdk,PIP,Picture-in-picture
page.tags=androidn
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа</h2>
<ol>
<li><a href="#declaring">Декларация поддержки операцией режима
"картинка в картинке"</a></li>
<li><a href="#pip_button">Переключение операции в режим "картинка в картинке"</a>
</li>
<li><a href="#handling_ui">Работа пользовательского интерфейса в режиме "картинка в картинке"</a>
</li>
<li><a href="#continuing_playback">Продолжение воспроизведения видео в режиме
"картинка в картинке"</a></li>
<li><a href="#best">Советы и рекомендации</a></li>
</ol>
<h2>См. также:</h2>
<ol>
<li><a href="{@docRoot}preview/features/multi-window.html">Поддержка
многооконного режима</a></li>
</ol>
</div>
</div>
<p>В Android N пользователи Android TV могут смотреть видео
в закрепленном окне в углу экрана во время работы в
приложениях. Режим "картинка в картинке" (PIP) позволяет приложениям отображать видео
в закрепленном окне одновременно с выполнением другой операции
фоновом режиме. Окно PIP обеспечивает возможность многозадачности внутри вашего приложения, что
повышает продуктивность работы пользователей.</p>
<p>Ваше приложение может определить момент активации режима PIP. Ниже приведено несколько примеров
моментов перехода в режим PIP:</p>
<ul>
<li>Ваше приложение может перевести видео в режим PIP, когда пользователь переходит
от видео к просмотру другого контента.</li>
<li>Ваше приложение может переключить видео в режим PIP, когда пользователь смотрит конец
эпизода контента. На основном экране отображается рекламная или сводная информация
о следующем эпизоде серии.</li>
<li>Ваше приложение может предоставить пользователям возможность добавлять в очередь дополнительный контент при
просмотре видео. В режиме PIP видео продолжает воспроизводиться, когда на основном
экране отображается операция выбора контента.</li>
</ul>
<p>Окно PIP имеет размеры 240x135 dp и отображается на самом верхнем слое в одном из
четырех углов экрана по выбору системы. Пользователь может вызвать
меню PIP, позволяющее переключать окно PIP в полноэкранный режим, или закрыть окно
PIP долгим нажатием кнопки <b>Home</b> на пульте дистанционного управления. Если на главном экране начнется воспроизведение другого
видео, окно PIP автоматически
закроется. Пользователи также могут закрыть окно PIP, используя экран последних задач.</p>
<img src="{@docRoot}preview/images/pip-active.png" />
<p class="img-caption"><strong>Рисунок 1.</strong> Видео в режиме "картинка в картинке"
отображается в углу экрана, пока пользователь просматривает
контент на главном экране.</p>
<p>Режим PIP использует многооконные API-интерфейсы в Android N для
отображения закрепленного окна с видео на верхнем слое. Чтобы добавить в приложение функцию PIP, вам нужно зарегистрировать
операции, поддерживающие PIP, добавить необходимые переключения операции в режим PIP,
а также обеспечить скрытие элементов пользовательского интерфейса и воспроизведение видео в то время, когда
операция находится в режиме PIP.</p>
<h2 id="declaring">Декларация поддержки операцией режима "картинка в картинке"</h2>
<p>По умолчанию в системе отсутствует автоматическая поддержка режима PIP для приложений.
Если вы хотите, чтобы ваше приложение поддерживало режим PIP, зарегистрируйте операцию
воспроизведения видео в манифесте приложения, установив для параметров
<code>android:supportsPictureInPicture</code> и
<code>android:resizeableActivity</code> значение <code>true</code>. Также укажите, что
ваша операция обрабатывает изменения конфигурации макета экрана, чтобы эта операция не
запускалась заново в случае изменения макета при переходах в режиме PIP.</p>
<pre>
&lt;activity android:name="VideoActivity"
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:configChanges=
"screenSize|smallestScreenSize|screenLayout|orientation"
...
</pre>
<p>При регистрации операции помните, что в режиме PIP она
отображается в небольшом наложенном окне на экране телевизора. Для пользователей наиболее удобны операции
воспроизведения видео с минимальным пользовательским интерфейсом. Операции
с небольшими элементами пользовательского интерфейса могут оказаться неудобными для пользователей
в режиме PIP, потому что в окне PIP пользователи
не видят деталей этих элементов.</p>
<h2 id="pip_button">Переключение операции в режим "картинка в картинке"</h2>
Если вам нужно переключить операцию в режим PIP, вызовите метод
<code>Activity.enterPictureInPicture()</code>. В следующем примере показано переключение
в режим PIP, когда пользователь нажимает кнопку PIP на панели
управления мультимедиа:</p>
<pre>
&#64;Override
public void onActionClicked(Action action) {
if (action.getId() == R.id.lb_control_picture_in_picture) {
getActivity().enterPictureInPicture();
return;
}
...
</pre>
<p>Добавление кнопки PIP на панель управления мультимедиа позволяет пользователям легко переключаться
в режим PIP с сохранением возможностей управления воспроизведением видео.</p>
<img src="{@docRoot}preview/images/pip-button.png" />
<p class="img-caption"><strong>Рисунок 1.</strong> Кнопка режима "картинка в картинке"
на панели управления мультимедиа.</p>
<p>В Android N входит новый класс
<code>PlaybackControlsRow.PictureInPictureAction</code>, который определяет действия PIP
на панели управления и использует значок PIP.</p>
<h2 id="handling_ui">Работа пользовательского интерфейса в режиме "картинка в картинке"</h2>
<p>Когда операция переходит в режим PIP, она должна отображать только воспроизведение
видео. Уберите элементы пользовательского интерфейса перед переходом операции в режим PIP
и восстановите их после возвращения операции в полноэкранный режим.
Переопределите <code>Activity.onPictureInPictureChanged()</code> или
<code>Fragment.onPictureInPictureChanged()</code> и включайте или
отключайте элементы пользовательского интерфейса по мере необходимости, например:</p>
<pre>
&#64;Override
public void onPictureInPictureChanged(boolean inPictureInPicture) {
if (inPictureInPicture) {
// Hide the controls in picture-in-picture mode.
...
} else {
// Restore the playback UI based on the playback status.
...
}
}
</pre>
<h2 id="continuing_playback">Продолжение воспроизведения видео в режиме
"картинка в картинке"</h2>
<p>Когда операция переключается в режим PIP, система видит ее в состоянии
паузы и вызывает метод <code>onPause()</code> этой операции. При этом воспроизведение видео
должно продолжаться без паузы, если операция
приостановлена в режиме PIP. Проверьте режим PIP в методе
<code>onPause()</code> своей операции и обеспечьте обработку воспроизведения соответствующим образом,
например:</p>
<pre>
&#64;Override
public void onPause() {
// If called due to PIP, do not pause playback
if (inPictureInPicture()) {
// Continue playback
...
}
// If paused but not in PIP, pause playback if necessary
...
}
</pre>
<p>Когда операция возвращается из режима PIP в полноэкранный режим, система
возобновляет выполнение операции и вызывает метод<code>onResume()</code> вашего приложения.</p>
<h2 id="best">Советы и рекомендации</h2>
<p>Режим PIP предназначается для операций, воспроизводящих видео в полноэкранном режиме. При переключении
операции в режим PIP следует избегать отображения любых элементов, кроме видео.
Отслеживайте моменты перехода операции в режим PIP и скрывайте элементы пользовательского интерфейса, как описано в
разделе <a href="#handling_ui">Работа пользовательского интерфейса в режиме "картинка в картинке"</a>.</p>
<p>Поскольку окно PIP отображается в виде плавающего окна в углу экрана,
следует избегать отображения критически важной информации на основном экране
в любой области, которая может быть закрыта окном PIP.</p>
<p>По умолчанию фокус ввода не переключается на операцию, которая находится в режиме PIP. Для
получения событий ввода в режиме PIP следует использовать
<code>MediaSession.setMediaButtonReceiver()</code>.</p>

Some files were not shown because too many files have changed in this diff Show More