Android: javac vs Dalvik

Meu entendimento é que o Google não gostou da política de licenciamento da Oracle para usar o JRE no Java ME, então ele apenas o reescreveu usando sua própria especificação de JVM queimita o JRE, mas se comporta de maneira um pouco diferente, especialmente quando se trata de tornar as coisas mais eficientes e mais seguras.

Então, se meu entendimento está correto, isso significa que quandojavac é executado em algum código-fonte Java e compilado em byetcode "binário", uma JVM compatível interpretará esse bytecode diferente do que o Dalvik (em alguns casos). Esta é a diferença inerente entre o Dalvik e outras JVMs (compatíveis).

Se alguma coisa que eu disse até agora estiver incorreta, por favor comece corrigindo-me!

Agora, se o Android veio com seu próprio compilador (o que ele poderia), e compilou o código-fonte Java de uma maneira diferente (compatível com Dalvik) do quejavac, então eu poderia entender como alguns códigos (não compilados com o Android SDK) não seriam executados em um dispositivo Android:

MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> android-compiler --> MySource.class (Dalvik-compliant) --> Dalvik JVM --> running Android app

No entanto, parece que você usajavac para compilar aplicativos Android!? Então parece que temos isso:

MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> javac --> MySource.class (JRE-compliant) --> Dalvik JVM --> running Android app (???)

E sejavac é usado para compilar todas as fontes em bytecode, então por que Dalvik não pode executar alguns tipos de código Java?

Eu fiz uma pergunta muito semelhante ontem e embora fosse tecnicamente respondida (depois de reler minha pergunta eu vejo que simplesmente não era específica o suficiente) ninguém foi capaz de explicar o que é inerente à Dalvik que torna impossível executar código Java de projetos como o Google Guice ou o Apache Camel. Disseram-me que para conseguir que o Camel corresse na Dalvik, eu teria que pegar a fonte do Camel e então teria que ser "construído com o Android SDK", mas não consegui entender o que isso significava ou implicava .

Com o Camel, por exemplo, você tem isso (simplificado):

RouteBuilder.java --> javac --> RouteBuilder.class --> jartool --> camel-context-2.9.jar --> JVM --> running Camel ESB
RouteBuilder.java --> javac --> RouteBuilder.class --> jartool --> camel-context-2.9.jar --> Dalvik JVM --> doesn't work !!! (???)

Claramente, algo está acontecendo dentro da JVM Dalvik que a impede de executar certos tipos de código Java.Estou tentando entender quais tipos de código Java não serão executados quando "alimentados" na JVM do Dalvik.

Editar: Antes "mas Camel 3.0 será executado no Android!"Eu sei - não é a minha pergunta!

questionAnswers(3)

yourAnswerToTheQuestion