¿Cuánto tiempo lleva pasar de ingeniero de JAVA a ingeniero de Android? ¿Cuánta tecnología?
¿Android es equivalente a Java? Tenga en cuenta que no dije igualdad, dije equivalencia, como en P = NP.
Formatos de clases/códigos de bytes equivalentes Android y Java son claramente equivalentes en muchos niveles. Las aplicaciones de Android están escritas en lenguaje Java y compiladas utilizando javac del JDK (o herramientas similares como ECJ). Este proceso genera un código de bytes Java estándar (archivos .class). Estos archivos luego se convierten a . El archivo dex de Android, que es un archivo de clase Java, tiene diferentes formatos desde la perspectiva del uso. Sí, es un formato mejor; el diseño de Sun ha mejorado mucho desde 1994. Pero al igual que puedes convertir una imagen en formato GIF a un formato PNG más avanzado, más perfecto y completamente equivalente, aunque sus flujos de bytes son completamente diferentes.
Los formatos de archivos equivalentes difieren mucho en detalles, principalmente con fines de optimización. Por ejemplo, si simplemente estamos satisfechos con flujos de datos de vídeo de baja eficiencia y no utilizamos tecnología de compresión de alta gama en diferentes fotogramas, entonces podemos evitar el problema de las patentes de decodificación de vídeo MPEGLA.
Existen varias motivaciones para el diseño de archivos de clases específicos de Android; obviamente, evitar conflictos con las protecciones de propiedad intelectual de Sun es un factor importante. En cualquier caso, Google no está lo suficientemente lejos de Java. Estos dos formatos de archivo son muy similares. Se diferencian en las estructuras de datos subyacentes específicas, pero las estructuras son sintácticamente consistentes y almacenan exactamente la misma información. Creo que en JavaSE o JavaME VM es fácil agregar un analizador .dex al cargador de clases de su sistema para cargar "clases de Android".
El SDK de Android depende. Java->. clase->hecho. La conversión dex es trivial, no hay pérdida. El hecho de "no perderse" es muy importante: cuando GIF = PNG, no es lo mismo que un archivo JPG dañado: no puede decodificar exactamente la misma información. Si JVM y Dalvik fueran independientes, sería difícil escribir una herramienta relativamente simple para convertir código compilado de uno a otro: no se pierde nada: no se pierde información, no se utiliza redundancia para compensar una característica en una VM es de primera clase en una VM pero no en otra, y no se requiere ninguna capa de tiempo de ejecución adicional para implementar la API principal de otra VM en una VM.
Sé lo complejos que son los convertidores dx. He visto su código fuente. Ese convertidor de código de bytes es un descompilador/recompilador enorme y con todas las funciones creado a través de SSA. Pero este convertidor sigue siendo conceptualmente irrelevante; el mapeo del código de bytes de Java al código de bytes de Dalvik es sencillo por diseño. La pila está optimizada en relación con las partes más finas de la arquitectura de registro; las cosas importantes, como el sistema de tipos de la capa VM, son completamente consistentes. )
Es fácil ver que VM es equivalente a Dalvik y JVM. No se trata solo del código fuente o los formatos de código de bytes: también sus versiones de tiempo de ejecución. Una vez que se carga una "clase de Android" en la máquina virtual Dalvik, se ejecuta y funciona como una clase de Java. Si conoce la programación Java (hasta los detalles de alto y bajo nivel), también conoce la programación de Android. Solo necesita aprender algunos conceptos nuevos de API y marco. Son sistemas peer-to-peer.
Aún recuerdas a Microsoft. ¿neto? cuando. NET, el campo de Java rápidamente respondió a las acusaciones. Red de plagio de Java. Yo soy uno de ellos, pero hoy veo el problema con más claridad. Sí, alguna vez fue producto de un plagio grave; C# 1.0 fue un... La forma más fácil de distinguir un idioma de otro es observar sus estilos idiomáticos, por ejemplo, ToString() y toString(). Pero en la especificación de VM más importante, Microsoft ha hecho muchos deberes. Su CLR, CLI y su marco central son muy diferentes de Java, por lo que no se puede decir la ecuación JVM = CLR. No puede utilizar herramientas simples de conversión de formatos de archivos para convertir sus clases Java compiladas en archivos que puedan usarse en formato . NET en tiempo de ejecución.
¿Quieres pruebas? Sólo tienes que mirar IKVM para descubrirlo. Este es un proyecto muy interesante que trae Java y . NET, por lo que su código Java puede ejecutarse sin modificaciones en CLR (o tiempo de ejecución .NET equivalente como Mono)... pero IKVM no es un simple conversor de formato de archivo tipo dx. La conversión de clases Java y la adaptación de las API principales de Java son muy complejas, incluso para un programa HelloWorld simple. Los mecanismos internos de cada plataforma, como reflexión, seguridad, paralelismo, manejo de excepciones, verificación de código de bytes, E/S y otras API principales, son básicamente los mismos en términos de características, pero completamente diferentes en detalles.
Algunas situaciones sin salida obligan a IKVM a pasar por aros de fuego para mantener el código Java en ejecución. NET máquina virtual. Se basa en una enorme capa de tiempo de ejecución adicional para acomodar la API JavaSE completa desde el código fuente OpenJDK. He estado siguiendo de cerca el desarrollo de IKVM durante algunos años (leí este excelente blog de IKVM), por lo que soy plenamente consciente de sus esfuerzos para adaptar programas Java y aplicaciones JavaSE. neto. El trabajo todavía no está hecho; y mucho de él se hace a expensas de alguna actuación. )
(El antiguo Visual J++ Visual J# no es un simple conversor de Java a red. No quiero decirlo, pero podemos decir que la compatibilidad de Visual J# con Java no es mucho mejor que el primer IKVM)
Introduje P = NP en la discusión; alguien introdujo la teoría de equivalencia de Turing, diciendo que cualquier plataforma/lenguaje/VM completo de Turing es equivalente entre sí. Cierto, pero irrelevante para esta pregunta. El modelo de Turing es demasiado general; considerarlo en términos tan superficiales socavará más sistemas de patentes de software (¡aunque esto no es malo!). Necesitamos trazar una línea sobre el terreno para la equivalencia de JVM, una línea más cercana a las necesidades prácticas y más alejada de la equivalencia de Turing. Esta trivial conversión de formato binario, el agotamiento del código fuente de alto nivel y la compatibilidad en tiempo de ejecución colocan a Android claramente dentro de la línea de equivalencia de Java, en mi opinión.
API y tiempo de ejecución son equivalentes. Android utiliza un subconjunto bastante grande de API de JavaSE. Estas API (del Proyecto Harmony) son todas implementaciones nuevas, pero están modeladas en JavaSE. Si no fuera por los problemas de licencia de TCK, Harmony podría haber obtenido la certificación JavaSE. Pero eso no cambia el hecho de que las API de Harmony y JavaSE son completamente equivalentes; esto es intencional, no accidental. Como escribió recientemente Charles Nutter, personalidad de JRuby:
Android admite un subconjunto incompleto (pero considerable) de las bibliotecas de clases Java 1.5. Este subconjunto es tan grande que un proyecto complejo de JRuby puede ejecutarse en Android sin modificaciones y con pocas restricciones.
Parece que Dalvik está muy cerca de JVM y debe ser totalmente compatible con la mayoría de las especificaciones de JVM, incluido el JMM completamente detallado (al igual que Android admite subprocesos y concurrencia de estilo Java, y ha profundizado en paquete concurrente java.util avanzado). Pero, ¿por qué hay tantas afirmaciones de que Dalvik es una nueva máquina virtual o que Dalvik no puede ejecutar clases de Java (el 90% de los foros y blogs que discuten esta demanda sostienen esta opinión)?
Finalmente, este blog no trata sobre la base legal de la demanda de Oracle y Google. Ignoraré (borraré) esos comentarios fuera de tema (si no están relacionados con Android = Java). Simplemente odio la tontería de que "Android no tiene nada que ver con Java" y los defensores de Android tienen que encontrar un argumento que tenga más sentido;
Usaré toda mi previsión para esperar y ver el progreso de esta demanda hasta que salgan todos los detalles y resultados finales. No seas ingenuo a menos que tengas información privilegiada (yo no la tengo). mantenga la calma. No conocemos todos los verdaderos motivos y planes de Oracle o Google. No conocemos la historia detrás de esta pantalla. Desde que Google anunció por primera vez el nacimiento de Android en 2007 (lo que provocó el colapso del entorno ecológico JavaME), Sun lo ha odiado, pero al final tuvo que actuar con el rabo entre las piernas. No creo que ningún holding de accionistas de más de 654,38 mil millones de dólares sea altruista: ni Google, ni Oracle, ni siquiera mi Lao Sun favorito. Esperemos y veremos. )
No creo que Google no pueda crear una plataforma estilo Java (como lo hace .NET) sin alejarse demasiado de Java. Dalvik y el marco de Android pueden ser el resultado final de sopesar el deseo de ser altamente compatible con una gran cantidad de programas Java, bibliotecas de clases, genios de Java y cadenas de herramientas de Java existentes. Microsoft renunció a los beneficios de portar Java disponible en el mercado y creó uno completamente nuevo. neto. Google no hizo esto.
Esta ecuación Android = Java obviamente no incluye todo (no es una correspondencia uno a uno). Cada plataforma tiene su propia API única. Por supuesto, Android es un sistema operativo completo, que incluye un kernel basado en Linux, un sistema de gráficos, una pila de telecomunicaciones, etc. Obviamente, solo estoy hablando de las partes más utilizadas: un marco de aplicación/espacio de usuario centrado en Java que se basa en el código fuente de Java, clases de Java (independientemente del formato), API de Java (incluidos miles de SEAAPI de Java de uso común) y Excelente máquina virtual tipo Java. En cuanto a la relación entre Android y otras plataformas Java, una afirmación precisa es el concepto de uso de versiones. Una vez recuerdo un blog que decía "Android no tiene 'J'". Bueno, no es demasiado tarde para decirlo ahora: sugiero que se cambie el nombre de Android a Java GE (Java Google Edition). De esta manera, nunca más se generará confusión.
¡Espero adoptar!