domingo, 12 de agosto de 2012

Lean, principios aplicados a metodologías ágiles de desarrollo

¿Qué es Lean? 

Lean es el nombre de un método de producción y desarrollo creado y aplicado por Toyota. Los principios que subyacen a los métodos de Toyota son principios que funcionan en todas partes porque son universales y se basan verdades que no cambian con el tiempo o el espacio. Las prácticas, es decir, la manera de aplicar estos principios en una determinada situación pueden y deben variar con el tiempo y según la situación evoluciona.

Lean nos dice que hay que centrarse en mejorar el sistema que usamos para producir centrándose en la optimización de procesos. 

Un objetivo fundamental de Lean es crear un flujo rápido y flexible, es decir, es útil pensar en el proceso de desarrollo como un oleoducto y todo lo que ralentiza el flujo son residuos, deshechos. En desarrollo de software los residuos son los retrasos a los que estamos ya habituados, los errores que todos cometemos, los malentendidos, y las esperas y los retrasos por falta de recursos. Todo esto se traduce en el incremento del gasto pero al eliminar los obstáculos, estos residuos, mejoramos nuestro proceso.

El sistema en su conjunto es el origen de los errores. Lean nos dice que la mayoría de los errores son de naturaleza sistémica y por lo tanto el sistema debe ser mejorado. También nos dice que hay que respetar a los trabajadores con el fin de mejorar el sistema. y que hay que hacer las cosas justo en el momento que tengan que hacer, ni antes ni después. A esto se le llama llama comunmente "Just-In-Time" o "JIT" y Lean sugiere centrarse en reducir el tiempo de lanzamiento al mercado mediante la eliminación de las demoras en el proceso de desarrollo, utilizando métodos JIT.

Mejorar la comunicación es un objetivo fundamental de todas las metodologías ágiles, desafortunadamente las prácticas ágiles tienden a enfatizar la comunicación a nivel local, en el equipo, entre los equipos relacionados, y con el cliente. Agile ofrece pocas soluciones para mejorar la comunicación entre equipos no tan íntimamente relacionados y prácticamente ninguna para la comunicación de arriba a abajo o alto y ancho de toda la empresa.

Lean promueve la comunicación centrándose en la creación de valor de extremo a extremo, proporcionando un contexto común para todos los involucrados en el sistema de producción a lo alto y ancho de toda la organización. Esto obliga a los diferentes niveles de la organización a comunicarse con más frecuencia y con énfasis en la mejora continua de procesos, la optimización del conjunto y la entrega temprana y con frecuencia. El pensamiento Lean ayuda a eliminar los retrasos que causan los residuos.


Principios Lean

Los principios Lean se pueden aplicar en muchos ámbitos. Todos los componentes de una empresa involucrados en el flujo de producir o añadir valor al producto o servicio que se ha creado, mejorado o mantenido se pueden beneficiar de estos principios. En el ámbito del desarrollo de software, Lean se puede convertir en una guía para aquellos que quieren desarrollar un software más eficiente y de alta calidad

Lean proporciona una guía para los equipos de desarrollo ágiles. De hecho la metodología Scrum puede ser vista como una manifestación de los principios Lean. Entendimiento Lean puede ayudar en la implementación de Scrum pero también se puede aplicar en toda la empresa, ayudando así a aplicar Scrum en toda la empresa. 




1.- Respetar a las personas


En desarrollo de software, respetar a la gente incluye la noción de que el equipo que hace el trabajo es el responsable del proceso que sigue. El proceso se convierte así en la aplicación de sus ideas de cómo desarrollar buen software. Cuando hay cambios el proceso cambia. Por lo tanto, el proceso es la base por la que el equipo que construye software lo hace de la mejor manera que saben, dentro de las limitaciones que se dan. Respetar al equipo es respetar su proceso.


2.- Eliminar residuos

La eliminación de residuos, desperdicios, basura o en inglés "waste" es la pauta principal para el practicante de Lean. Residuos es código más complejo de lo que debería. Residuos se producen cuando se crean defectos. Residuos es esfuerzo necesario para crear un producto sin valor añadido. Donde quiera que haya residuos, el practicante de Lean analizará el sistema para ver cómo eliminarlos ya que es probable que un error en el sistema vuelva a repetirse tarde o temprano.

3.- Aplazar el compromiso

Aplazar el compromiso significa tomar decisiones en el momento adecuado, en el ultimo momento en que se pueda responder. No se deben tomar decisiones demasiado pronto, cuando no se tiene toda la información que necesita, ni demasiado tarde, cuando puede suponer un gasto extra. Aplazar el compromiso es una manera proactiva de planificar el proceso y así no trabajar en cierta funcionalidad hasta que no se necesite. Esto evita tener que tomar decisiones ahora que podrían cambiar más adelante cuando tengamos más información. Este principio se puede utilizar para guiar el proceso de toma de requisitos, el análisis y el diseño e implementación.

Al establecer los requisitos debemos preguntarnos dónde debo gastar nuestro tiempo. ¿Tengo que concretar todos los requisitos con el cliente? Es evidente que no. Algunos requisitos son más importantes que otros. Los requisitos más importantes para la empresa suelen ser los que representan mayor valor para el cliente. Es un error demasiado común. Las metodologías ágiles profundizan en los requisitos que los clientes consideran más importantes, esta es una de las justificaciones básicas para el desarrollo iterativo e incremental, pero sólo centrarse en las características importantes para el cliente no debería ser suficiente para decidir en qué trabajar en cada momento, Debemos prestar atención a los riesgos de la arquitectura y tener en cuenta qué requisitos pueden causar problemas si se ignoran. Éstos son los que deben ser desarrollados primero y no otros.

Durante las fases de diseño e implementación los desarrolladores tienden a tomar decisiones cuando tienen que resolver un problema pero les alta información o no lo tienen claro. Un enfoque suele ser hacerlo lo más sencillo posible, sin prever necesidades futuras. El otro enfoque es anticiparse a lo que pueda suceder. Ambos enfoques tienen diferentes retos, para el primero el resultado en el código es que es difícil de cambiar porque no ha tenido en cuenta la variabilidad del código mientras lo escribía.  Para el segundo el código es más complejo de lo necesario porque, como los desarrolladores tienen un tiempo difícil predecir, se anticipan a las creando clases, abstracciones o métodos que en realidad no son necesarios, pero que agregan complejidad.

Un enfoque alternativo a estos dos es el llamado "diseño emergente",  Diseño Emergente en desarrollo de software consiste en:

• Utilizar los bien conocidos patrones de diseño para crear arquitecturas de aplicación resistentes y flexibles.

• Limitar la aplicación de patrones de diseño a aquellas características que estén completamente definidas

• Escribir test de aceptación y tests unitarios antes de escribir el código, ambos mejoran el proceso y crean una malla de protección frente a previsibles cambios.

Utilizar patrones de diseño hace el código fácil de cambiar y nos limitamos a implementar sólo lo que realmente se necesita en cada momento además de hacer el código menos complejo. Las pruebas automatizadas mejoran el diseño y lo hacen seguro  frente a posibles cambios de requisitos. Estas características del diseño emergente permiten aplazar el compromiso de una implementación en particular hasta que se entienda lo que realmente se necesita hacer.

4.- Crear conocimiento


El software tiene un valor inherente escaso, su valor viene de que permite y optimiza la entrega de productos y servicios. Por lo tanto, es más útil pensar en el desarrollo de software como parte del proceso productivo, es decir, del conjunto de actividades encaminadas a crear productos que satisfagan las necesidades de los clientes mientras se avanza en los objetivos estratégicos de la empresa.

En las empresas de software, el software se desarrolla para ayudar en el trabajo y las necesidades de los clientes que lo utilizan. El software es un medio para un fin y el fin es satisfacer un cliente, ya sea directamente con un producto o indirectamente al ofrecerle un servicio a través o mediante nuestro software. Cuando se ve de esta manera, es claro que el papel del software en las organizaciones de TI es apoyar a productos y servicios de la empresa y debe considerarse como parte de desarrollo de productos.

El desarrollo de cualquier producto tiene tres pasos:

Descubrir lo que el cliente necesita
Encontrar la manera de fabricarlo
Fabricar

En desarrollo de software, parece pasamos más tiempo hablando del tercer paso, sin embargo, los dos primeros pasos en realidad nos llevan la mayor parte del tiempo. Muchos al leer esto pensarán que no es así y yo les preguntaría cuanto tiempo tardarían en desarrollar un pequeño programa en el que estaban, supuestamente, trabajando y del que, supuestamente, acaban de perder todo el código fuente.  La mayoría de los desarrolladores me dirían que gastarían entre un 20 y un 50 por ciento del tiempo que tardaron la primera vez porque en lo que verdaderamente gasta más tiempo un desarrollador es en  "descubrir lo que el cliente necesita " y, sobretodo, en "encontrar la manera fabricarlo".

Crear conocimiento significa comprender el proceso que se utiliza para desarrollar software para satisfacer cierta necesidad del cliente. Mediante la comprensión de sus métodos, puede mejorar más fácilmente. Crear conocimiento significa documentar mínimamente y compartir diseños puntuales y también diseños globales y arquitectura.

También se crea conocimiento con una buena batería de tests unitarios con una nomenclatura concreta ya que una funcionalidad, un requerimiento del cliente debería traducirse en n tests unitarios que cubran al máximo el código implementado, el nombre de esos n tests debería ser suficiente para que cualquier compañero entienda cómo y por qué funciona y existe ese código.


5.- Entregar rápido y con frecuencia


Otra razón para hacer el desarrollo iterativo es entregar al cliente de manera rápida y continuada permitiendo una pronta inmersión en el mercado, una mayor credibilidad, una fuerte lealtad, etcétera. Aunque esto además supone una mayor rapidez a la hora de conseguir ingresos también supone un gasto previsible por la necesidad calculada de futuros desarrollos en sucesivas iteraciones. 

Este principio, la  "entrega rápida", debe entenderse también como una eliminación de retrasos. Las demoras representan residuos, son gastos innecesarios y se busca eliminarlos entregando más rápido y con más frecuencia. Los beneficios de la entrega rápida son claros pero también es esencial hacerlo de una manera sostenible.


6.- Producir con calidad 

La calidad ha de estar estructurada, o lo que es lo mismo, el sistema debe basarse en la calidad a todos los nivelesA fin de mantener la velocidad de desarrollo los equipos deben desarrollar la calidad tanto en su proceso como en su código. La implantación de calidad en el proceso permite a un equipo mejorar mediante la eliminación de los residuos que él mismo crea. Una manera de conseguir calidad es definir, si es posible entre tester, desarrollador y cliente, pruebas de aceptación antes de escribir el código , esto implica una necesaria conversación en torno a los requisitos y ayuda a los desarrolladores a entender la funcionalidad que necesitan desarrollar.

También se puede conseguir calidad en el código mediante el uso de métodos descritos anteriormente para eliminar residuos. Muchos desarrolladores gastan gran parte de su tiempo investigando como resolver y resolviendo errores o bugs, sin pruebas automatizadas, los errores y los bugs son más frecuentes por culpa de un código de peor calidad además de que el código que es difícil de entender y eso contribuye a la pérdida de tiempo.

7.- Optimizar el conjunto

Hay que concentrarse en todo el proceso en su conjunto, desde el principio (concepto) hasta el final (consumo). Frecuentemente se busca, con toda lógica, optimizar cada paso, cada flujo de trabajo de cada departamento, el problema con la optimización de cada paso es que crea grandes "inventarios" entre los pasos y toda esa cantidad de información a menudo no es tarea fácil de digerir. 

En el mundo del software, estos "inventarios" los representan tareas parcialmente realizadas. Entender el flujo como una sola pieza, como un todo, es decir, centrado en la construcción de un elemento en su totalidad, es un proceso mucho más eficiente que aquel que se concentra en la construcción de cada una de sus partes con mayor rapidez pues los "inventarios" ocultan errores en el proceso, o en la consecución de cada una de las partes o en el ensamblado. Pueden ocultar malentendidos con el cliente, diseños ineficientes, bugs, errores de integración, etcétera. Cuanto mayor sea el inventario o más partes haya más probable es que haya errores no detectados. Residuos. Gastos.



¿Por qué no muchas "equipos ágiles"obtienen los resultados esperados?

¿Por su falta de experiencia?
¿Por falta de atención durante el aprendizaje?
¿Se olvida la gestión del cambio?
¿No están siguiendo el libro?
¿Es porque no han contratado a un tutor o un profesor con experiencia?
¿Tal vez se olvidaron de las buenas prácticas y los patrones de diseño?
¿Es porque no se ha dominado la complejidad o el pensamiento sistémico?
¿Será que no se centran en la mejora continua?

Es posible que se deba a uno o varios de estos motivos pero muchos casos que he visto están relacionados con el diseño de la organización, con burocracia interna y con falta de comunicación interdepartamental.

Los equipos ágiles se centran en la entrega de valor a intervalos regulares. Cada dos o tres semanas trabajan en una lista de oportunidades de negocio expresadas en las historias de usuario o tareas y juntos trabajan a toda velocidad para analizar, desarrollar, probar y liberar todo el conjunto. Su enfoque es fuerte y simple y sus resultados suelen ser bastante bueno sin embargo dependen de personas fuera del equipo. Los gerentes, administrativos, ingenieros de sistemas, comerciales, etcétera, todos ellos individuos que forman parte de diferentes departamentos o entidades organizativas que aún perteneciendo a la misma empresa tienen otro enfoque y otra visión. Algunos se centran en mantener los sistemas actuales, otros en la gestión contable, otros en la captación de clientes, otros en minimizar el cambio, etcétera.

Si bien la principal preocupación del equipo de desarrollo es la liberación de elementos de valor a intervalos regulares ésto es sólo una preocupación menor para los demás integrantes del resto de departamentos y, aunque ésto no es ninguna sorpresa para nadie en realidad, tiene un grave impacto en la tasa de éxito de entrega del equipo de desarrollo.

  • Las historias de usuario no se acaban dentro de la iteración, porque el product owner no ha tenido tiempo para validarlas.
  • La siguiente versión software no sobrevivirá mucho tiempo porque el servicio de soporte técnico no tuvo tiempo para formarse y está creciendo el descontento entre los usuarios.
  • Operaciones ha decidido aplazar la implantación de un nuevo desarrollo interno ya que se acaban de dar cuenta de que tenían un grave problema de almacenamiento.

¿Cómo podemos aprovechar los beneficios producidos por un cambio que abarca todo el proceso si el resto de la organización hace todo lo contrario? Las empresas deberían empezar a plantearse el coaching ágil a todos los niveles. Se ha visto que la formación en metodologías ágiles ha dado muy buenos resultados en equipos de desarrollo pero va siendo hora de ir formando en éste tipo de metodologías y formas de pensar  a todos los niveles de la empresa. 

Yo ya me considero evangelista de éstas metodologías, me encanta hablar de eficiencia y he conseguido que varias personas de distintos departamentos, amigos míos y trabajando en otras empresas, se quedaran encantados con éste enfoque organizativo. Si crees que sería interesante impartir un curso de formación enfocado a la eficiencia en tu empresa, no sólo en departamentos de desarrollo, tan sólo tienes que ponerte en contacto conmigo y lo adapto a tus necesidades.

Crear tu propio negocio

Quiero crear mi propio negocio.

Crear tu propio negocio es un deseo frustrado y un sueño para muchos de nosotros que aún somos, de alguna manera, esclavos al servicio de nuestras respectivas empresas. Pensar en no tener que responder ante nadie, sólo ante nosotros mismos, es realmente atractivo y más aún teniendo en cuenta que las ganancias reales de nuestro esfuerzo repercutirán en nosotros y no en el presidente de la empresa para la que trabajemos en ese momento y a quien ni siquiera conocemos.

Creo que plantearse crear tu propio negocio tiene que ver más con el afán de libertad e independencia que cada uno tenga y no con el afán de lucro y el máximo beneficio. Aprender y mejorar, crecer profesionalmente y aportar con ello a la comunidad en vez de explotar a otros para ganar dinero, ése debería ser el objetivo y es el mío hoy que me planteo crear mi propio negocio.

La mayoría de las personas crean su negocio porque son buenos en su campo y en algún momento de su carrera empiezan a pensar que su jefe o sus jefes no reconocen su aportación ni su esfuerzo. La idea de la independencia surge como un simple deseo y se descarta rápidamente en muchos casos por el riesgo y el esfuerzo que conllevaría llevarla a cabo pero queda ahí, en la superficie de nuestros pensamientos, siempre presente, y desde ese momento no hay vuelta atrás. 

Antes de iniciar tu propio negocio se debe tener en cuenta que hacer el trabajo técnico, el objeto o servicio de tu negocio, y el trabajo de gestión, la contabilidad y los papeleos, son dos cosas totalmente distintas y siendo muy bueno en tu campo y ofreciendo un producto o servicio de tremenda calidad no se consigue nada sin una buena gestión del negocio.

Además, hay ser consciente de que vas a ser tres personas en una: técnico, porque te encanta hacer lo que haces y estas orgulloso del fruto de tu esfuerzo; gerente, porque necesitarás previsión, estabilidad y orden y empresario, porque tendrás que nutrirte de nuevas ideas, estar atento y preparado para los cambios y vivirás siempre al borde de la esquizofrenia en el más total de los caos.

Tendré que dejar de lado el trabajo técnico a menudo para dedicarle tiempo a la gestión y tendré que dejar de lado la gestión para buscar nuevas oportunidades de negocio y, en definitiva, tendré que ir cambiando de rol según las necesidades de cada momento, desde el primer día.

Si no se cubre el rol de técnico no hay producto ni servicio que vender, si no hay un gerente no habrá una estructura y el negocio se convertirá en un caos y sin el rol de empresario el negocio no crecerá y básicamente estaré haciendo un trabajo con una sobrecarga extra que no tenían cuando aún estaban trabajando para otro.Creo que si no se es consciente de todo esto antes de crear un negocio tu negocio esta avocado al fracaso. 

domingo, 22 de julio de 2012

Samsung Galaxy S3: Memory problems


I'm not sure yet on what is the cause or what will be the solution but I came to a headeach on a problem I'm having with my Samsung Galaxy S 3. The problem is this one, although I have plenty of memory on the device I can not install more applications because it tells me that there is no storage space available.

I'll paste a few screenshots of both the computer and the device itself and I will make a public plea for help because I've been looking at forums, mainly in English, and have not found a possible solution. I think, is an assumption, that the problem is in how Ice Cream Sandwich handles device's internal memory. As you know, the SGS3 brings more than considerable internal memory, with 0.98 MB RAM and 11.2 GB of internal storage it should be more than enought and should have no problem unless the system bad manages memory itself. I think, I say, I BELIEVE, that Android ICS is screwing and is the  ultimately responsible for the mismanagement and let me explain why with a few screenshots:


This first screenshot is Airdroid interface (recommended program to manage your phone from your PC and move images, videos, and contacts in both directions. I have marked in red something that shocks me, it has detected as internal memory and a as SD card the same amount of data. See? so, Link2SD has the same wrong detection:



Link2SD did not detect the second storage card (just format it, just has not caught by this because the system if the catches). In Settings / Storage see this:

It's where I wanted to go, the system recognices the SD card but for whatever reason the other applications use or recognize the internal memory as external storage and do not recognize the real external storage. I would say, without the possibility or the time required to debug the system, that something is going wrong in the management of external storage and communication between the system and applications .

What do I do now? Do I have to uninstall some application before installing other applications? Any recommendations? I deleted caches, I deleted the folder Android/data, I have stopped applications and services and I still get the message that there is not enough storage space every time I try to install a new app.

I will continue looking for answers and solutions and when found I will update this post.

Thank you.

SGS3: problemas de memoria

No se todavía cuál es la causa ni cuál va a ser la solución pero me trae de cabeza un problema que estoy teniendo con mi Samsung Galaxy S 3. El problema es el siguiente, aunque tengo memoria de sobra en el dispositivo no soy capaz de instalar más aplicaciones porque me dice que no queda espacio de almacenamiento disponible.

Voy a pegar unas cuantas capturas de pantalla, tanto del ordenador como del propio dispositivo y voy a hacer una petición pública de ayuda porque he estado mirando foros, principalmente en inglés, y no he encontrado una posible solución. Creo, es una suposición, que el problema está en cómo gestiona Android Ice Cream Sandwich la memoria interna del dispositivo. Como sabéis, el SGS3 trae una memoria interna más que considerable, con una RAM de 0.98 MB y 11,2 GB de almacenamiento interno no debería tener nadie ningún problema a no ser que el propio sistema gestione mal la memoria. Creo, digo, CREO, que Android ICS la está cagando y es el responsable último de esa mala gestión y os voy a explicar por qué con unas cuantas capturas de pantalla:


Esta primera captura de pantalla es de la interfaz de Airdroid (programa recomendado para gestionar el teléfono desde tu pc y mover, imágenes videos, contractos y demás en ambas direcciones. He marcado en rojo algo que choca y es que detecta como memoria interna y como tarjeta SD la misma cantidad de datos. ¿Lo ves? Sucede lo mismo con Link2SD:


A Link2SD le sucede lo mismo y no ha detectado la segunda tarjeta de almacenamiento (acabo de formatearla, igual no la ha cogido por eso porque el sistema si que la pilla). En Ajustes/Almacenamiento vemos ésto:


Es a donde yo quería ir, el sistema si que está cogiendo la tarjeta SD pero por el motivo que sea el resto de aplicaciones utilizan o reconocen a la memoria interna como almacenamiento externo y no reconocen el verdadero almacenamiento externo. Diría, sin tener la posibilidad ni el tiempo necesario para depurar el sistema, que algo está fallando en la comunicación entre el sistema y las aplicaciones en cuanto a la gestión de almacenamiento externo. 

¿Qué hago ahora? ¿Tengo que desinstalar aplicaciones para poder instalar otras? ¿Alguna recomendación? He borrado cachés, he borrado la carpeta Android/data, he parado servicios y aplicaciones y aún así recibo el mensaje de que no hay suficiente espacio de almacenamiento cada vez que intento instalar una nueva app.

Espero respuestas pero evidentemente seguiré buscando una solución y cuando la encuentre actualizaré esta entrada. 

Gracias.

miércoles, 18 de julio de 2012

Samsung Galaxy S3 - Actualizar Firmware

Guía simple para actualizar el firmware de tu SGS3 mediante Kyes.

BACKUP DEL SGS3

Para hacerlo descarga Samsung Kies desde aquí:
http://www.samsung.com/es/support/usefulsoftware/KIES/JSP

Una vez instalado y ejecutado conecta tu SGS3...


 Desbloquea el móvil:


Te avisa de que hay una actualización del firmware, de momento "Cancelar" porque primero vamos a hacer un backup por si acaso (mas vale un porsiaca que cien penseques):


Pincha en la pestaña de  "Copia de seguridad / Recuperar" y selecciona todo. Pulsa en "Copia de seguridad" :


Comienza el proceso de copia de seguridad:


Proceso completado:


ACTUALIZACIÓN DEL FIRMWARE

Para actualizar el firmware, pulsa en "Actualizar":


Lee, acepto, yo continuo sin guardar (teléfono y datos, información para Samsung). Pulsa en "Iniciar actualización":


Comienza un proceso lento, primero Kyes prepara el móvil:


Y después empieza a descargar la actualización, éste es el proceso más lento de todos:


Y por fin, después de media hora se reinica el móvil (dos veces) y en el Kyes vemos ésta ventana:


Ya está, ya tenemos el firmware actualizado.

lunes, 9 de julio de 2012

Aprovechando el código fuente de Android


La documentación de Android a veces se queda corta pero podemos utilizar el códgo fuente de Android y de todos sus proyectos para rellenar esos agujeros en la documentación oficial.

El código fuente de Android y todos sus proyectos son administrados por el sistema de control de código fuente de Git. Git (http://git-scm.com/) es un sistema de control de código fuente Open Source diseñado para manejar proyectos grandes y pequeños, con rapidez y comodidad.

El código fuente de Android se publica en http://source.android.com. El código se hizo abrió al público en octubre de 2008 con el objetivo de hacer una plataforma móvil totalmente personalizable. Ver filosofía y objetivos (en inglés).

Buscando las fuentes de Android en Internet podemos encontrarlas en:

http://android.git.kernel.org
http://source.android.com/source/index.html

Había más sitios donde encontrar código fuente online pero han sido cerrados para dar mas impulso al uso de Git.

Usar Git para descargar Fuentes Android es bien fácil, independientemente de la plataforma que utilices (Linux, Mac, Windows...) primero tienes que instalar Git y luego descargar el código que busques, no voy a entrar en detalles porque ya hay cientos de tutoriales pero si que voy a poner aquí algún video y algún enlace interesante.


Resumen de Paquetes Java en Android

Android contiene más de 50 paquetes y más de 1000 clases, y sigue creciendo con cada nueva versión. Una forma de obtener una visión general de la plataforma Android es ver la estructura de los paquetes de Java. Como Android se desvía de la distribución estándar de Java es importante saber lo que es compatible y lo que no. He aquí una breve descripción de los paquetes más importantes que se incluyen en el SDK de Android:

android.app: implementa el modelo de aplicaciones Android. Las clases principales son Application, Activity, Fragment, pero también encontrarás aquí los controles, cuadros de diálogo, alertas y notificaciones.

android.app.admin: ofrece la posibilidad de controlar el dispositivo remotamente por, por ejemplo, administradores de la red de una empresa.

android.accounts: proporciona clases para gestionar las cuentas del usuario (Google, Facebook, WhatsApp, etc. ). Las clases principales son Accountmanager y Account.

android.animation: Contiene todas las nuevas clases de animación por propiedades.

android.app.backup: proporciona los hooks para las aplicaciones de copia de seguridad y restaurción de cuando ante un cambio de dispositivo.

android.appwidget: proporciona la funcionalidad para los widgets de la pantalla principal.

android.bluetooth: proporciona una serie de clases para trabajar con la funcionalidad Bluetooth.

android.content: implementa los conceptos de los proveedores de contenido, que abstraen el acceso a datos de su almacenamiento. También incluye los Intents y los Android Uniform Resource Identifiers (URIs).

android.content.pm: implementa la gestión de paquetes. Un gestor de paquetes sabe acerca de los permisos, los paquetes, servicios, proveedores de contenido componentes y aplicaciones instaladas.

android.content.res: proporciona acceso a los recursos, tanto estructurados como no estructurados. Las clases principales son AssetManager (para los recursos no estructurados) y Resources.

android.database: permite implementar una base de datos. La interfaz principal es Cursor.

android.database.sqlite: implementa las interfaces del paquete anterior con SQLite como base de datos física. Las clases de primaria son SQLiteCursor, SQLiteDatabase, SQLiteQuery, SQLiteQueryBuilder y SQLiteStatement.

android.drm: enfocado a la gestión de derechos digitales.

android.gesture: clases e interfaces necesarias para trabajar con gestos definidos por el usuario. Las clases principales son Gesture, GestureLibrary, GestureOverlayView, GestureStore, GestureStroke y GesturePoint.

android.graphics: gestión de gráficos, contiene las clases Bitmap, Canvas, Camera, Color, Matrix, Movie, Paint, Path, Rasterizer, Shader, SweepGradient, y TypeFace entre otras.

android.graphics.drawable: implementa los protocolos de pintado, da soporte a las imágenes de fondo, y permite la animación de los objetos que se pueden dibujar.

android.graphics.drawable.shapes: implementa formas, incluyendo ArcShape, OvalShape, RectShape PathShape, y RoundRectShape.

android.hardware: implementa las parte "física" relacionada con la cámara y otros dispositivos y sensores.

android.hardware.usb: permite comunicación con los dispositivos conectados por USB.

android.location: permite la gestión de direcciones y localizaciones.

android.media: contiene las clase MediaPlayer para reproducir audio y vídeo, MediaRecorder para grabar audio y vídeo, Tone para reproducir fragmentos cortos de sonido, AudioManager responsable de los controles de volumen  y FaceDetector  para detectar las caras de la gente en un mapa de bits .

android.media.audiofx: proporciona efectos de audio.

android.media.effect: proporciona efectos de vídeo.

android.mtp: posibilita la interacción entre las cámaras y los dispositivos de audio.

android.net: implementa sockets a nivel de red. Las clases principales incluyen Uri, ConnectivityManager, LocalSocket y LocalServerSocket. Android soporta HTTPS a nivel del navegador y también a nivel de red, el navegador también es compatible con JavaScript.

android.net.rtp: protocolos de streaming.

android.net.sip: soporte para VOIP.

android.net.wifi: conectividad Wi-Fi. Las clases principales incluyen WifiManager, que es el responsable de gestionar la lista de las redes configuradas y de la red Wi-Fi activa y WifiConfiguration.

android.nfc: para interactuar con dispositivos cercanos y para permitir el "comercio sin contacto".

android.opengl: contiene utilidades para OpenGL ES 1.0 y 2.0.

android.os: representa los servicios del sistema operativo accesibles a través de Java. Algunas clases importantes son BatteryManager, Binder, FileObserver, Handler, Looper y PowerManager. Binder es una clase que permite la comunicación entre procesos. FileObserver vigila cambios en archivos.

android.preference: permite mantener una configuración de preferencias en las aplicaciones. Las clases principales son PreferenceActivity, PreferenceScreen,  CheckBoxPreference y SharedPreferences.

android.provider: conjunto de proveedores de contenido predefinidos (contactos, media stored, explorador y configuración).

android.sax: Simple API para XML (SAX).

android.speech: soporte para la conversión de texto a voz. La clase principal es TextToSpeech.

android.telephony: permite multiples operaciones relacionadas con la telefonía propiamente hablando. 

android.telephony.gsm: permite obtener la ubicación del teléfono y el envío de SMS entre otras cosas.

android.telephony.cdma: soporte para la telefonía CDMA.

android.test, android.test.mock, android.test.suitebuilder: para apoyar a escribir las pruebas unitarias durante el desarrollo de aplicaciones Android.

android.text: clases de procesamiento de texto.

android.utils: librería de utilidades

android.view: clases enfocadas a la interfaz de usuario.

android.webkit: contiene las clases que representan el navegador web.

android.widget: controles de la interfaz de usuario para widgets

com.google.android.maps: necesario para trabajar con Google Maps.

Esta es una pequeña muestra pero puedes ver todos los paquetes con detalle en el listado oficial de paquetes.