Android: javac vs Dalvik
Rozumiem, że Google nie lubił zasad licencjonowania Oracle dotyczących używania środowiska JRE w Java ME, więc po prostu przepisał je, używając własnej specyfikacji JVM, któranaśladuje JRE, ale zachowuje się trochę inaczej, zwłaszcza jeśli chodzi o zwiększenie wydajności i bezpieczeństwa.
Jeśli więc moje zrozumienie jest poprawne, oznacza to, że kiedyjavac
jest uruchamiany na jakimś kodzie źródłowym Java i wkompilowany w kod binarny byet, zgodny JVM interpretuje ten kod bajtowy inaczej niż Dalvik (w niektórych przypadkach). Jest to wrodzona różnica między Dalvik a innymi (zgodnymi) maszynami JVM.
Jeśli coś, co powiedziałem do tej pory, jest nieprawidłowe, zacznij od poprawienia mnie!
Teraz, jeśli Android przyszedł z własnym kompilatorem (który mógłby), i skompilowanym źródłem Java w inny (zgodny z Dalvik) sposób niżjavac
, wtedy mogłem zrozumieć, jak jakiś kod (nieskompilowany z Android SDK) nie uruchomiłby się na urządzeniu z Androidem:
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> android-compiler --> MySource.class (Dalvik-compliant) --> Dalvik JVM --> running Android app
Wygląda jednak na to, że używaszjavac
skompilować aplikacje na Androida!?!? Wygląda na to, że mamy to:
MySource.java --> javac --> MySource.class (JRE-compliant) --> JVM --> running Java app
MySource.java --> javac --> MySource.class (JRE-compliant) --> Dalvik JVM --> running Android app (???)
Jeślijavac
jest używany do kompilacji wszystkich źródeł w kod bajtowy, dlaczego więc Dalvik nie może uruchomić niektórych typów kodu Java?
Wczoraj zadałem bardzo podobne pytanie i chociaż zostało to technicznie udzielone (po ponownym przeczytaniu mojego pytania widzę, że po prostu nie byłem wystarczająco szczegółowy), nikt nie był w stanie wyjaśnić, co jest charakterystyczne dla Dalvik, co uniemożliwia uruchomienie kodu Java z projektów takich jak Google Guice lub Apache Camel. Powiedziano mi, że aby zmusić Camela do uruchomienia w Dalvik, musiałbym zdobyć źródło Camela, a potem musiałby zostać „zbudowany z Android SDK”, ale nie mogłem zrozumieć, co to znaczy lub sugeruje .
Na przykład w Camel masz to (uproszczone):
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 !!! (???)
Oczywiście, coś dzieje się w JVM Dalvik, co uniemożliwia mu uruchamianie pewnych typów kodu Java.Staram się zrozumieć, jakie typy kodu Java nie będą uruchamiane po „zasileniu” w maszynę JVM Dalvik.
Edytować: Wcześniej ”ale Camel 3.0 będzie działał na Androidzie!„Wiem - nie moje pytanie!