Android NDK y optimizacion para x86

Preview:

DESCRIPTION

Presentación sobre optimización de Android NDK para x86 impartida en MobileCampMx por Pedro Galvan

Citation preview

Android NDK y optimización

para x86

Pedro Galván - @pedrogk

Mobilecamp MX, agosto 2014

#IntelAndroid #MobileCampMx

http://slideshare.net/RevistaSG

Aclaraciones

• Sobre mí.

• Sobre enfoque de la plática.

• Sobre Intel.

#IntelAndroid 2

Repaso

#IntelAndroid 3

Reality check: Android funciona sobre

distintas arquitecturas de procesador

• ARM (armeabi, armeabi-v7a)

– Qualcomm, Apple, Nvidia

• x86

– Intel

• MIPS

#IntelAndroid 4

Android software stack

Crédito: https://thenewcircle.com/s/post/1044/remixing_android

#IntelAndroid 5

Estrategias para crear Android apps

• Clásica

• Astuta

• Merol

#IntelAndroid 6

Clásica

Java, Android application framework

#IntelAndroid 7

Frameworks cross-platform

jQuery Mobile, PhoneGap (Cordova), Titanium, Xamarin, Sencha, Kendo, RubyMotion (v3), etc.

#IntelAndroid 8

NDK (Native Development Kit)

Programar librerías (en C/C++) que compilas para el tipo específico de procesador.

#IntelAndroid 9

NDK

#IntelAndroid 10

¿Natividad?

#IntelAndroid 11

¿Qué es una app NDK?

• Una aplicación que utiliza librerías nativas.

• Las librerías son archivos .so que típicamente

están en libs/CPU_ABI/

• Las librerías son generadas a partir de código

fuente, o por motores (ej. juegos).

• No existen aplicaciones 100% nativas. Solo

algunas partes de la app se implementan

como librerías nativas.

#IntelAndroid 12

¿Para qué NDK?

• Programar componentes intensivos en

procesamiento (multimedia, algoritmos

complejos, juegos).

• Acceso directo a hardware e instrucciones

específicas del procesador (ej. NEON, SSE3).

• Reutilizar código legado.

#IntelAndroid 13

NDK: Panorama del proceso

Crédito: Sebastian Mauer

#IntelAndroid 14

Compatibilidad con C/C++ estándar

• Bionic C no soporta todo lo que glibc

– Soporte limitado para pthreads

– No hay manejo de excepciones de C++

– No es POSIX compliant

#IntelAndroid 15

NDK: Compilar para varias plataformas

• Descargar Android NDK

• Compilar con ndk-build

• Utilizar opción APP_ABI para indicar

arquitectura deseada.

$ndk-build APP_ABI=armeabi-v7a

• Otros valores para APP_ABI: x86, mips, all

• También lo puedes definir en

jni/Application.mk

#IntelAndroid 16

NDK: Inconvenientes

• Mayor complejidad.

• Dificultad para depurar.

• Las mejoras de desempeño no son

garantizadas (hay overhead).

#IntelAndroid 17

Android en X86

(#IntelAndroid)

#IntelAndroid 18

Situación actual

Intel todavía tiene poco market share pero se está preparando para cambiar esto (2015).

#IntelAndroid 19

Binarios de ARM en x86

• La mayoría de las apps NDK están compiladas

para arquitectura ARM.

• Los dispositivos Intel pueden ejecutar estas

apps por medio de traducción en tiempo real,

pero afecta desempeño.

#IntelAndroid 20

“Traducir en tiempo real

tiene su chiste.”

Estrategias: Dalvik apps

a) Dejar igual

– Funcionará sin problemas porque no tiene

binarios específicos al procesador.

b) Considerar implementar partes en NDK

– Elegir partes que se puedan beneficiar más de

implementación a bajo nivel (ej: procesamiento

avanzado de gráficos).

#IntelAndroid 21

Estrategias: NDK apps

• Acceso a código fuente

– Recompilar con APP_API=x86

– Si hay instrucciones específicas a ARM, generar

versión de código para x86.

• Sin acceso a código

– Migrar (reimplementar o cambiar de motor)

– Dejar así (no recomendado por bajo desempeño)

#IntelAndroid 22

Estrategias: Motores y frameworks

• Amigables con x86

– Appcelerator, Cordova, Adobe AIR, libgdx,

Cocos2d, Unreal 3D, Project Anarchy.

• No amigables (hasta ahora)

– Unity, Corona

#IntelAndroid 23

Optimización al compilar

1. Ajustar niveles (flags) de compilación(ej. LOCAL_CFLAGS += -O1)

– O0: default,reduce tiempo de compilación

– O1: reduce tamaño de código

– O2: más lento en compilar pero mejor desempeño

– O3: como O2 pero con más opciones

• Utilizar compiladores específicos

– Intel C++ compiler for Android (mejora ~30%)

#IntelAndroid 24

Herramientas de Intel

#IntelAndroid 25

Zona de desarrolladores Intel

https://software.intel.com/es-es/android

#IntelAndroid 26

Hardware Accelerated Execution Manager (HAXM)

Aceleración por GPU para el emulador. Requieres instalar una imagen de x86 en Android SDK y habilitar VT en

tu BIOS

#IntelAndroid 27

Appthwack: Testing en la nube

http://appthwack.com

#IntelAndroid 28

Intel Graphics Performance Analyzer

• Análisis de desempeño en tiempo real

• Métricas de CPU, GPU, memoria, energía, etc.

• Componentes para juegos: frame analyzer &

debugger (OpenGL).

#IntelAndroid 29

Intel Native Development Experience

(INDE)

• Suite para desarrollo nativo (NDK) multi-

plataforma (ARM y x86).

• Fácil acceso a herramientas para desarrollo de

aplicaciones NDK.

#IntelAndroid 30

Intel XDK

• HTML5 app development

• Soporta APIs de Apache Cordova

• Crosswalk web runtime

– Aplicaciones híbridas con alto desempeño

• Testing & Debugging

• http://xdk-software.intel.com

#IntelAndroid 31

¡RIFA!

#IntelAndroid 32

Gana una Asus MemoPad 7

http://sg.com.mx/rifaintelandroid

#IntelAndroid 33

Más info

• http://giraintelandroid.com

– DF, Gdl, Mty y Bogotá

• http://sg.com.mx/buzz/tutorial-como-

ejecutar-codigo-c-android-el-ndk

• https://software.intel.com/en-

us/articles/optimizaci-n-de-aplicaciones-

android-para-arquitectura-x86

#IntelAndroid 34