Download android
Document related concepts
no text concepts found
Transcript
Desarrollo de Sistemas Embebidos en Android Mobile Linux ANDROID Ezequiel Aceto Senior Mobile Application Developer Temas • Introducción a Android • ADB • Drivers desde Java • Drivers desde el Kernel ANDROID ANDROID • Sistema Operativo multi-usuario basado en Linux • Desarrollado por Android Inc. y adquirido por Google en 2005 • Dispositivos móviles • Aplicaciones nativas en Java (Dalvik VM) • Aplicaciones viven en un “Sandbox” • Android 1.5 (Cupcake) ANDROID Versiones • Cupcake (1.5) [Abril 2009] • Donut (1.6) [Septiembre 2009] • Eclair (2.0) [Octubre 2009] • Eclair (2.1) • Froyo (2.2) [Mayo 2010] • Gingerbread (2.3) [Diciembre 2010] • Honeycomb (3.0) [Febrero 2011] Ice Cream Sandwich (4.0) [Octubre 2011] • ANDROID Versiones • Astro (Android OS 1.0) [Sept 2008] • Bender (Android OS 1.1) [Feb 2009] • Jelly Bean (Android OS 4.1) [Jun 2012] • Jelly Bean (Android OS 4.2) [Nov 2013] • Jelly Bean (Android OS 4.3) [Jul 2013] ANDROID Versiones • Location API (API Level 1+) • Bluetooth API (API Level 5+) • USB Device (API Level 12+) • USB Host (API Level 12+ / HW Ready) ANDROID Android • No es solo un OS. Android es un gran framework para desarrollo de aplicaciones. • Sistema Operativo • Emuladores • Herramientas de Desarrollo • Amplio conjunto de APIs • Creciente comunidad de desarrolladores • Muchos usuarios “evangelizados” ANDROID Linux Kernel • Kernel 2.6 (pre OS 4.0) - Kernel 3.0 (OS 4.0) • binder: Comunicación entre procesos (IPC) • ashmem: Android Shared Memory (Virtual) • pmem: Memoria de Procesos (Fisica) • Permite alocar grandes cantidades de ashmem: Una nueva implementación de un allocator de memoria compartida, similar a POSIX pero con un comportamiento diferente y sobre todo con una API mucho más simple, basada en archivos memoria de forma continua • logger (logcat) ANDROID pmem: driver para alocar grandes cantidades de memoria FISICA continuas (de 1 a 16MB) Linux Kernel • Power Management • Wakelocks • Alarmas programadas • Low Memory Handler • Paranoid Network • Sockets IPv4/IPv6/Bluetooth, RFCOMM,... • Aprox. 200 parches respecto al Kernel 2.6.38 ANDROID Dalvik VM Java VM Java Bytecode ANDROID Dalvik VM Dalvik Bytecode Dalvik VM • Diseñada para funcionar con menos de 100MB de RAM • Procesadores lentos (500Mhz y FSB 100MHz) • Espacio para aplicaciones entre 16MB y 48MB (depende de la plataforma) • Cada aplicación inicia su propia instancia de Dalvik VM ANDROID NDK • Conjunto de herramientas para incorporar código nativo (C & C++) • Soporte para Arquitecturas • MIPS • x86 • ARM (v7A & v5TE) ANDROID MIPS & x86 -> OS 2.3 ARM -> OS 1.5 NDK libs libc libm libz openGL JNI v7a Thumb2 Hardware FPU NEON instructions Componentes Principales • Activity • Service • Broadcast Receiver • Content Provider ANDROID Activity • Representa una pantalla (Vista) desde la cual el usuario interactua con la aplicación • Al menos una actividad es considerada “principal” • No hay un único punto de ingreso (“main”) ANDROID ANDROID Service • Componente que se ejecuta en background • No bloquea la UI • Se utiliza para procesos que consumen mucho tiempo y/o no requieren interfaz de usuario ANDROID Broadcast Receiver • Componente que responde a mensajes del sistema • Iniciados por el OS o por aplicaciones • No tienen una UI asociada, pero pueden crear notificaciones ANDROID Content Provider • Encapsula contenidos (datos) y provee mecanismos para poder acceder a ellos. • Es el mecanismo por defecto para el intercambio de de datos entre aplicaciones • Por ejemplo: La libreta de contactos ANDROID ADB ANDROID ADB Android Debug Bridge client ANDROID server daemon ADB • Instalar aplicaciones • Ver el log del sistema operativo (logcat) • Copiar archivos desde y hacia el dispositivo • Ejecutar test de stress (Monkey) $ adb usb $ adb tcp 6543 $ adb logcat ANDROID ADB Conexión remota $ adb devices List of devices attached 0A3BF9160300600B device $ adb usb $ adb tcpip 5555 $ adb connect 192.168.1.102:5555 ANDROID ADB en BeagleBoard xM ethernet usb client ANDROID server daemon USB Debugging • Por default esta deshabilitado en el todas las distribuciones de Android • Junto con “Origenes Desconocidos” son las dos opciones del OS que permiten instalar apps por fuera del Google Play ANDROID USB Debugging • Menú de Apps -> Settings -> Developer Options -> USB Debugging ANDROID En el Host • Permitir que el servicio UDEV reconozca al dispositivo $ vim /etc/udev/rules.d/51android.rules SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666" SUBSYSTEM=="usb", SYSFS{idVendor}=="0451", MODE="0666" ANDROID En el Host • Cambiar permisos al archivo 51android.rules $ chmod a+r /etc/udev/ rules.d/51-android.rules • Finalizamos las sesiónes de ADB $ sudo killall adb ANDROID En el Host • Reiniciamos UDEV $ sudo service udev restart ANDROID En el Host • Reiniciamos ADB y buscamos dispositivos $ cd ~/adt-bundle-linuxx86_64/sdk/platform-tools $ sudo ./adb/ start-server $ sudo ./adb/ devices ANDROID En el Host • Resultado de listar dispositivos $ ./adb devices List of devices attached 20100720 device ANDROID Drivers desde Java ANDROID USB Host • API Level 12 + HW Ready • HID y MS por defecto • Otros dispositivos requieren driver propio ANDROID USB desde Java FTDI FT232RL RS232 ANDROID USB Application FT232Driver RS232Conf VCPDriver AsyncRX Android Application Framework USBManager ANDROID public FT232Driver(UsbManager usbManager, UsbDevice device) { super(usbManager,device); UsbInterface mUsbIntf = device.getInterface(0); super.setUsbInterface(mUsbIntf); for (int i = 0; i < mUsbIntf.getEndpointCount(); i++) { if (mUsbIntf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN) { super.setUsbVCPRXendpoint(mUsbIntf.getEndpoint(i)); } else if (mUsbIntf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_OUT) { super.setUsbVCPTXendpoint(mUsbIntf.getEndpoint(i)); } } } ANDROID Log.i(LOG_TAG,"Enviar comando - Purgar TX"); byte[] buffer = new byte[]{}; int transferred = getConnection().controlTransfer(0x40, 0, 0x01, 0, buffer, buffer.length,0); Log.i(LOG_TAG,"Bytes enviados: " + transferred); byte[] bb = new byte[512]; int count = getConnection().bulkTransfer(usbVCPRXendpoint(), bb, bb.length, 0); Log.i(LOG_TAG,"Bytes recibidos: " + count); for (int i = 0; i < count; i ++) { Log.i(LOG_TAG,"Byte "+ i + ": " + bb[i]); } ANDROID /*********************** PUBLIC API ***********************/ public abstract boolean connect(RS232Configuration configuration, AsyncReceiver asyncReceiver) throws VCPDriverException; public abstract boolean disconnect(); public abstract byte[] transfer(byte[] data, int dataLength, int timeout) throws VCPDriverException, VCPTransferException; public abstract void send(byte[] data, int dataLength, int timeout) throws VCPDriverException, VCPTransferException; ANDROID Drivers desde el Kernel ANDROID Drivers desde el Kernel $ cd ~/rowboat-android/kernel make ARCH=arm CROSS_COMPILE=arm-eabidistclean make ARCH=arm CROSS_COMPILE=arm-eabiomap3_beagle_android_defconfig make ARCH=arm CROSS_COMPILE=arm-eabimenuconfig ANDROID Drivers desde el Kernel ANDROID Drivers desde el Kernel ANDROID Drivers desde el Kernel ANDROID Drivers desde el Kernel ANDROID Drivers desde el Kernel make ARCH=arm CROSS_COMPILE=arm-eabi- -j4 ANDROID Drivers desde el Kernel ANDROID Drivers desde el Kernel ANDROID Drivers desde el Kernel 1. Conectamos el RX del FTDI con el TX 2. Nos conectamos a la placa por ADB ./adb shell 3. Configuramos ttyUSB0 usando ‘stty’ /data/busybox/busybox stty -F /dev/ttyUSB0 115200 4. Ejecutamos microcom y probamos el adaptador /data/busybox/busybox microcom -s 115200 /dev/ttyUSB0 ANDROID Drivers desde el Kernel FILE* usbdev = fopen(“/dev/ttyUSB0”,“rw+”); fwrite(...,sizeof(...),usbdev); fread(...,sizeof(...),usbdev); fclose(usbdev); ANDROID Drivers desde el Kernel /*********************** PUBLIC API ***********************/ private native boolean connect(String device); private native boolean disconnect(); private native int send(byte[] data, int dataLength); private native int hasData(); private native byte[] receive(byte[] data); ANDROID Drivers desde el Kernel /************************* C Lib *************************/ JNIEXPORT jboolean Java_ar_uba_fi_android_usb_connect( JEnv* env, jobject thiz, jstring device) { ... } ANDROID GRACIAS! http://goo.gl/f78aeI ANDROID