Können Bibliotheken Speicher wie in Linux gemeinsam nutzen?

Ist es Bibliotheken möglich, Speicher wie den Shared Memory in Linux zu teilen? (Die Shared-Memory-Funktion, die in System V und später in Linux übernommen wurde)

Beispiel: Wenn zwei Apps gleichzeitig arbeiten und beide die OkHttp-Bibliothek verwenden, wird die Bibliothek zweimal in den Speicher geladen?

Antworten (1)

Die gleiche Shared-Memory-Funktion ist immer noch in Android vorhanden und funktioniert mit integrierten Shared-Libraries wie OpenGL ES, wird jedoch nicht für Bibliotheken von Drittanbietern verwendet, wie Sie fragen. Jede App, die eine Bibliothek eines Drittanbieters verwendet, muss die Bibliothek in ihre APK-Datei aufnehmen. Dies sind dann keine gemeinsam genutzten Bibliotheken (in dem .soSinne): Sie sind nur doppelte Dateien, die möglicherweise denselben Code enthalten. (Normalerweise enthalten sie nicht denselben Code, da verschiedene Apps für verschiedene Versionen der Bibliothek erstellt wurden.)

Dies vermeidet mögliche Inkompatibilitäten oder Sicherheitsprobleme, die durch das Aktualisieren von Bibliotheken aus verschiedenen Apps verursacht werden. Inkompatibilitäten von gemeinsam genutzten Bibliotheken sind ein großes Problem in GNU/Linux-Systemen. Distributionen bemühen sich sehr, sie zu verhindern, indem sie verschiedene Kombinationen von Anwendungen und Bibliotheken testen, aber manchmal gehen sie trotzdem schief. Bei Android, wo niemand dafür verantwortlich ist, dass verschiedene Apps zusammenarbeiten, würde diese Art von Shared-Library-System dazu führen, dass Apps oft kaputt gehen, wenn eine Shared-Library aktualisiert wird. In einem System, das gemeinsam genutzte Bibliotheken auf diese Weise verwendet, können Sicherheitsprobleme auftreten, da eine App eine gemeinsam genutzte Bibliothek auf eine „neuere Version“ aktualisieren kann, die tatsächlich gehackt wurde, um Informationen preiszugeben oder die App zu steuern. Die Bibliotheken müssten als separate Pakete behandelt werden, die vom Autor signiert sind,

Da vorinstallierte "Kernbibliotheken" die Ausnahme sind, nehme ich an?
Ich glaube nicht, dass Kernbibliotheken in diesem Fall eine Ausnahme haben.
Das ist falsch. Genau wie Linux erstellt Android eine Copy-on-Write-mmap der Bibliotheken, der Kernel teilt den Speicher automatisch für mmap, wenn dies möglich ist. Alle Kernsystembibliotheken werden auch von Zygote geladen und gemeinsam genutzt, wenn ein neuer Prozess gegabelt wird. Referenz .
@LieRyan Die Seite, auf die Sie sich beziehen, spricht nur über die integrierten "Android Framework" -Bibliotheken, nicht über Bibliotheken von Drittanbietern, wie das OP fragt. Es ist sogar noch besser, als nur die Binärdateien zu teilen: Der COW-Prozess gilt für den gesamten Heap vor der Zygote-Verzweigung. Die gleiche Technik könnte für Bibliotheken von Drittanbietern verwendet werden, funktioniert aber in der Praxis auf Android nicht gut, da die Bibliotheken (von Drittanbietern) nicht wirklich als gemeinsam genutzte Bibliotheken erstellt werden – sie sind unterschiedliche Kopien, die statisch verknüpft sind. Es müsste die gesamte Binärdatei lesen, um zu wissen, ob die Bibliothek geteilt werden kann oder nicht.
Java hat nicht wirklich statisch gelinkte Bibliotheken, alle Klassen sind dynamisch gelinkt. In jedem Fall liegt der Grund dafür, dass Bibliotheken, die in einer Anwendung enthalten sind, den Speicher nicht gemeinsam nutzen, nicht darin, dass sie statisch verknüpft sind, sondern darin, dass Anwendungen ihre eigene Kopie der Bibliotheken ausliefern, die dann als verschiedene Dateien im Dateisystem vorhanden sind. Gemeinsam genutzte Bibliotheken müssen aus derselben Datei geladen werden, wenn sie Speicher gemeinsam nutzen möchten. Der AOT-Compiler kann auch Bibliotheksaufrufe einbetten, aber das ist ein separates Problem.
@LieRyan Ja, das war mein ursprünglicher Punkt. Wenn Ihnen eine bessere Beschreibung einfällt, die die Endbenutzer verstehen, nehme ich gerne eine Bearbeitung an.
@DanHulme Sie haben in der Antwort einen Sicherheitsfehler hervorgehoben, aber der gemeinsam genutzte Speicher ist in Linux ohne solche Fehler vorhanden. Jede Aufklärung wäre genial.