5. ‹#›
Distintas arquitecturas de Android apps
Apps nativas
Se programa en Java.
Se invoca directamente las
librerías y componentes del
SDK de Android.
Apps HTML5 híbridas
Usa tecnologías web
(HTML5, CSS, Javascript).
No se programa directo al
SDK de Android sino hacia
un framework intermedio
(ej. Cordova).
6. ‹#›
¿Cuándo elegir cada una?
Nativo
Mejor desempeño y experiencia de usuario.
Híbrido
Mayor portabilidad.
9. ‹#›
Native Development Kit (NDK)
Conjunto de herramientas y build scripts que permiten
incorporar código nativo (C/C++) en aplicaciones Android.
Con NDK generas librerías binarias para cada arquitectura
de procesador.
Las librerías binarias se pueden invocar desde Java por
medio de JNI (Java Native Interface).
10. ‹#›
¿Arquitectura de procesador?
Android es soportado en una gran variedad de dispositivos
con distintos tipos de arquitectura de procesador (ARM,
ARM v7, x86, x86_64, MIPS).
Los binarios compilados para una arquitectura de
procesador no funcionan para otra arquitectura.
Es necesario compilar binarios para cada arquitectura
que desees soportar.
13. Código C/C++ Makefile ndk-build Mezclar con Java GDB debug
Java Framework
SDK APIs
JNI
Librerías nativas
Aplicación Android*
NDK APIs
Librería Bionic C
Usando JNI
Flujo de Desarrollo con NDK
14. Aplicación Android* NDK
Aplicación Dalvik*
Archivos
.class
Fuente Java
Compilar con
Javac
Librería nativa
Java .class
Librería nativa
Java*
Compilar con
Javac
Crear header C con
javah -jni
Archivo
Header
Código fuente C/
C++
Compilar y linkear
Código C
Librería
dinámica
Archivos de la
aplicación
Makefile
Opcional gracias a
JNI_Onload
Arquitectura de aplicación NDK
15. ‹#›
Compatibilidad con C/C++ Standard
Librería Bionic C:
Más liviana que que la librería GNU C standard
Soporte limitado de pthread.
Acceso a las propiedades del sistema Android
Bionic no es compatible a nivel binario con C standard
Por ello hay que (re)compilar usando NDK.
16. ‹#›
Instalación de Android NDK
Descargar desde
https://developer.android.com/ndk/downloads
Instalación incluye:
Herramientas y scripts para
compilar.
Headers y librerías.
Documentación y ejemplos
de código
17. Agregar manualmente código nativo
a proyecto existente
Estructura típica de
proyecto
Carpeta JNI
1. Crear carpeta JNI para
fuentes de código nativo.
2. Crear Makefile Android.mk
3. Construir librerías nativas usando el
script NDK-BUILD
NDK-BUILD creará
automáticamente las carpetas de
librerías ABI.
19. Consulta los ejemplos incluidos
App de muestra Tipo
hello-jni Llama a una función nativa escrita en C desde Java*.
bitmap-plasma Accede a un objeto Android* Bitmap desde C.
san-angeles Código EGL y OpenGL* ES en C.
hello-gl2 Setup EGL en Java y código OpenGL ES en C.
native-activity
Muestra OpenGL solo en C
(sin Java, usa la clase NativeActivity).
native-plasma
Muestra OpenGL solo en C
(también usa la clase NativeActivity).
…
21. ‹#›
Integración de código nativo con Java
En tu código Java, declara métodos nativos usando la palabra
clave “nativa”:
public native String stringFromJNI();
Proporciona la librería nativa compartida que contiene los
métodos usados por tu aplicación y que construiste con NDK
(ndk-build).
libMyLib.so
• Antes de usar la librería, debemos cargarla usando
System.loadLibrary
22. La función C que será mapeada:
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
...
{
...
tv.setText( stringFromJNI() );
...
}
public native String stringFromJNI();
static {
System.loadLibrary("hello-jni");
}
Integración de código nativo con Java
24. Makefiles
Android.mk
module settings and declarations
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
Predefined macro can be:
BUILD_SHARED_LIBRARY,
BUILD_STATIC_LIBRARY,
PREBUILT_SHARED_LIBRARY, PREBUILT_STATIC_LIBRARY
Other useful variables:
LOCAL_C_INCLUDES := ./headers/
LOCAL_EXPORT_C_INCLUDES := ./headers/
LOCAL_SHARED_LIBRARIES := module_shared
LOCAL_STATIC_LIBRARIES := module_static
Application.mk
Application-wide settings
APP_PLATFORM := android-15 #~=minSDKVersion
APP_CFLAGS := -O3
APP_STL := gnustl_shared #or other STL if
you need extended C++ support
APP_ABI := all #or all32, all64…
APP_OPTIM := release #default
NDK_TOOCLHAIN_VERSION := 4.8 #4.6 is default,
4.8 brings perfs, 4.9 also but less stable
25. Arquitecturas deseadas (ABI)
Incluye todos los ABIs indicando APP_ABI = all en jni/Application.mk:
APP_ABI=all
El NDK generará código optimizado para todos los ABIs objetivo
También puedes pasar la variable APP_ABI a ndk-build, y especificar cada ABI:
ndk-build APP_ABI=x86
librería para ARM v7a
librería para ARM v5
librería para x86
librería para mips
27. ‹#›
Intel INDE
(Integrated Native Developer Experience)
Ambiente de desarrollo optimizado para construir
aplicaciones nativas.
Se integra con IDEs populares (Android Studio,
Visual Studio).
Incluye librerías nativas para alto desempeño
(procesamiento de gráficas, primitivas de cómputo
paralelo).
Facilita la creación y depuración de apps NDK.
https://software.intel.com/es-es/intel-inde
28. ‹#›
Soporte para NDK en Android Studio
Android Studio (1.3) RC incluye el preview de soporte de C/C+
+ para construir apps con NDK.
Intel INDE aprovechará esta capacidad para brindar una
experiencia todavía mejor para construir apps NDK.
29. ‹#›
Zona de Desarrolladores Intel en
Español
Visita http://software.intel.com/es-es/android para obtener:
Herramientas gratuitas
Artículos y guías
Foros de discusión
31. ‹#›
Diversidad en Android
Plataforma
Distintas versiones de Android OS.
Android OS personalizado por distintos fabricantes.
Form Factors
Smartphones, tablets, wearables.
TV, automóviles y más.
Disponibilidad de Hardware
Distinto hardware en distintas regiones.
34. ‹#›
Estrategias para probar
Emulador
Opciones
Android SDK.
Intel HAXM.
Genymotion.
Ventajas
Sencillo (desde tu IDE) y gratis*.
Desventajas
Lento.
No es suficiente para probar todas las
capacidades.
Dispositivo real
Ventajas
Mejor desempeño.
Permite probar usabilidad y UX.
Desventajas
Caro.
Dificultad para conseguir
variedad de hardware.
Probar en variedad de HW
agrega complejidad y tiempo.
35. ‹#›
Testing basado en la nube
Dispositivos reales en un laboratorio en la nube.
Variedad de dispositivos disponible.
Seleccionas los dispositivos en los que quieres hacer tus
pruebas.
Opciones de proveedores
Xamarin Test Cloud - http://xamarin.com/test-cloud
TestDroid - http://testdroid.com
Google Cloud Test Lab* - https://developers.google.com/
cloud-test-lab/
36. ‹#›
Testdroid
Gratis para dispositivos Intel (x86).
Puedes utilizar:
App Crawler para pruebas automáticas (recorrer pantallas, dar click en
botones, probar usuarios y passwords, etc).
Proveer archivo con test cases en JUnit para pruebas específicas.
Puedes ver pantallas de tu app en distintos dispositivos, bitácoras
de ejecución (logs), excepciones, profiling de CPU y memoria.
Ofrece un API para que puedas integrar en tu proceso de build y
automatizar la ejecución de las pruebas.
http://testdroid.com