¿Pueden las bibliotecas compartir memoria como en Linux?

¿Es posible que las bibliotecas compartan memoria como la memoria compartida en Linux? (La función de memoria compartida adoptada en System V y luego adoptada en Linux)

Por ejemplo: cuando dos aplicaciones funcionan simultáneamente y ambas usan la biblioteca OkHttp, ¿la biblioteca se carga en la memoria dos veces?

Respuestas (1)

La misma función de memoria compartida todavía está presente en Android y funciona en bibliotecas compartidas integradas como OpenGL ES, pero no se usa para bibliotecas de terceros como las que está preguntando. Cada aplicación que usa una biblioteca de terceros debe incluir la biblioteca en su archivo APK. Estas no son bibliotecas compartidas (en el .sosentido): son solo archivos duplicados que pueden contener el mismo código. (Por lo general, no contendrán el mismo código porque se habrán creado diferentes aplicaciones para diferentes versiones de la biblioteca).

Así se evitan posibles incompatibilidades o problemas de seguridad por actualizar bibliotecas desde distintas apps. Las incompatibilidades de bibliotecas compartidas son un gran problema en los sistemas GNU/Linux. Las distribuciones se esfuerzan mucho en prevenirlos al probar diferentes combinaciones de aplicaciones y bibliotecas, pero a veces todavía fallan. En Android, donde nadie es responsable de asegurarse de que las diferentes aplicaciones funcionen juntas, ese tipo de sistema de biblioteca compartida daría lugar a que las aplicaciones se rompan a menudo cuando se actualiza una biblioteca compartida. Los problemas de seguridad pueden surgir en un sistema que usa bibliotecas compartidas de esta manera, porque una aplicación puede actualizar una biblioteca compartida a una "versión más nueva" que en realidad está pirateada para filtrar información o controlar la aplicación. Las bibliotecas tendrían que ser tratadas como paquetes separados, firmados por el autor,

Supongo que las "bibliotecas principales" preinstaladas son la excepción.
No creo que las bibliotecas principales tengan una excepción en este caso.
Esto es incorrecto. Al igual que Linux, Android crea un mmap de copia en escritura de las bibliotecas, el kernel compartirá automáticamente la memoria para mmap cuando sea posible. Todas las bibliotecas del sistema central también son cargadas por zygote y compartidas cuando se bifurca un nuevo proceso. referencia _
@LieRyan La página a la que te refieres solo habla de las bibliotecas integradas del "marco de Android", no de las bibliotecas de terceros como las que pregunta el OP. Es incluso mejor que simplemente compartir los binarios: el proceso COW se aplica a todo el montón antes de la bifurcación del cigoto. La misma técnica podría usarse para bibliotecas de terceros, pero en la práctica no funciona bien en Android porque las bibliotecas (de terceros) en realidad no están construidas como bibliotecas compartidas, son copias distintas, vinculadas estáticamente. Tendría que leer todo el binario para saber si la biblioteca se puede compartir o no.
Java realmente no tiene bibliotecas vinculadas estáticamente, todas las clases están vinculadas dinámicamente. En cualquier caso, la razón por la que las bibliotecas incluidas en una aplicación en realidad no comparten memoria no es porque estén vinculadas estáticamente, sino porque las aplicaciones envían su propia copia de las bibliotecas que luego existen como archivos diferentes en el sistema de archivos. Las bibliotecas compartidas deben cargarse desde el mismo archivo si desean compartir la memoria. El compilador AOT también puede realizar llamadas de biblioteca en línea, pero ese es un problema aparte.
@LieRyan Sí, ese era mi punto original. Si puede pensar en una mejor manera de describir esto que los usuarios finales entiendan, estaré encantado de aceptar una edición.
@DanHulme, ha resaltado un error de seguridad en la respuesta, pero la memoria compartida está presente en Linux sin tales errores. Cualquier aclaración sería genial.