Ich versuche zu verstehen, wie Android intern funktioniert. Vor ART wurde Dalvik verwendet, um Java-Code auszuführen. Ich denke, es hat einen Dalkiv-Prozess im 'Linux'-Kernel erstellt, der einfach eine VM war, die den Dex-Bytecode ausführte.
Für ART wird der Dex-Bytecode in Anweisungen in der Architektur des Prozessors kompiliert (passiert während des Installationsprozesses). Dieser kompilierte Dex-Bytecode wird in einer ELF-Binärdatei gespeichert. Es ist also etwas, das der 'Linux'-Kernel verstehen kann.
Angenommen, ich wollte diese ELF-Binärdatei unter Linux ausführen. Abgesehen von ashmem
und binder
Kernel-Modulen, was würde ich noch brauchen? Welche Bibliotheken benötigt diese ELF-Binärdatei? Wird diese ELF-Binärdatei einfach als Linux-Prozess gestartet?
Ich habe versucht, den Quellcode von anbox.io zu lesen, aber ich konnte nicht verstehen, wie er eine ELF-Binärdatei von einer APK gestartet hat. Vielleicht verstehe ich den Quellcode von anbox.io besser, wenn ich verstehe, was zum Ausführen erforderlich ist.
Ich habe auch https://android.googlesource.com/platform/art/+/refs/heads/master/runtime/ gefunden , aber ich weiß nicht, wo ich anfangen soll. Was ist /runtime? Ist es ein Programm, eine Bibliothek? Ist Android Runtime etwas, das mit der aus Dex-Bytecode generierten ELF-Binärdatei verknüpft ist?
Was wird benötigt, um aus Android-APKs kompilierte ELF-Binärdateien auszuführen?
Eine einfache Hello World-App , die nichts anderes tut, als Hello World! (keine Animationen, keine Sounds, keine Menüs), läuft auf einem Android 9-Gerät:
30+
explizit Dateien, anonyme Inodes und UNIX-Sockets.500+
speicherabgebildete Dateien von /data
, /system
, /vendor
und frei /dev
.system_server
), um etwas auf dem Bildschirm anzuzeigen. Möglicherweise gibt es noch mehr IPCs (Binder oder andere).system_server
denen die App-Klassen in Bezug auf die Aktivitätserstellung und -berechtigungen verwaltet werden.zygote
einen Prozess, der ausgeführt wird, um VMs für system_server
und die App selbst zu forken.Daher müssen alle diese Anforderungen erfüllt sein, um die ELF-Binärdatei (gemeinsames Objekt: /data/app/com.ravipatel.helloworld.test-*/oat/arm64/base.odex
) auszuführen, die von APK kompiliert wurde.
Zum Vergleich: Ein mit GCJ kompiliertes Hello-World-Java-Programm verknüpft dynamisch mit weniger als 5 Bibliotheken. Während ein ähnliches C-Programm (statisch gelinkt) außer der erforderlichen Architektur keine Laufzeitabhängigkeiten hat.
Ich denke, es hat einen Dalkiv-Prozess im 'Linux'-Kernel erstellt, der einfach eine VM war, die den
dex
Bytecode ausführte.
Nein. Dalvik war keine Kernel-basierte virtuelle Maschine ( KVM ; falls Sie das meinen). Sowohl Dalvik als auch ART sind Prozess-VMs , die im Userspace ausgeführt werden.
Für ART wird der Dex-Bytecode in Anweisungen in der Architektur des Prozessors kompiliert (passiert während des Installationsprozesses).
Es ist profilgeführt, passiert selten während des Installationsprozesses.
Was ist
/runtime
? Ist es ein Programm, eine Bibliothek?
Runtime ist eine Umgebung, in der Programme ausgeführt werden, die in einer bestimmten Sprache geschrieben sind. ART ist eine Laufzeitumgebung für Java. Es besteht hauptsächlich aus nativen ausführbaren Binärdateien / gemeinsam genutzten Bibliotheken (einschließlich VM / Interpreter / JIT-Compiler und OAT-Compiler) und standardmäßigen Java-Klassenbibliotheken (meistens in Form von Dateien .jar
), die in /system
.
Ein weiteres bekanntes Beispiel ist Java Runtime Environment ( JRE ) von Oracle/Sun, das hauptsächlich auf PCs zu finden ist.
Ist Android Runtime etwas, das mit der aus
dex
Bytecode generierten ELF-Binärdatei verknüpft ist?
Richtig.
Wird diese ELF-Binärdatei einfach als Linux-Prozess gestartet?
Nein. Die aus einer Datei in APK kompilierte ELF-Binärdatei .dex
ist keine ausführbare Datei, sondern ein gemeinsames Objekt. Daher muss es zusammen mit anderen Abhängigkeiten von einem anderen Prozess, nämlich ART (VM), in den Speicher geladen werden.
Angenommen, ich wollte diese ELF-Binärdatei unter Linux ausführen. Abgesehen von
ashmem
undbinder
Kernel-Modulen, was würde ich noch brauchen? Welche Bibliotheken benötigt diese ELF-Binärdatei?
Zunächst einmal können Sie die ELF-Binärdatei nicht auf einem Nicht-Android-Linux-System ausführen, da die Binärdatei keine statisch verknüpfte ausführbare Datei ist. Aber selbst wenn dies der Fall ist, gibt es noch größere Einschränkungen, insbesondere die Hardware-Abstraktion von Android. binders
und ashmem
sind IPC-Mechanismen. Sie machen nur Sinn, wenn die Prozesse, mit denen die App kommunizieren möchte, auch existieren, was nicht der Fall ist. Mit Linux-basierten Java-SDKs ist dies relativ einfach zu erreichen.
VERWANDT:
Morrison Chang
Robert