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