Vinculación Estática de Android vs Vinculación Dinámica con glibc

He compilado varias herramientas de Linux (y algunas de mi propio código C) a Android y uno de los desafíos que enfrento es que la libc de Android tiene algunos componentes perdidos / eliminados y acabo remendando mi código para que funcione con Libc de Android (por ejemplo, un problema como este http://credentiality2.blogspot.com/2010/08/compile-ncurses-for-android.html )

P1: ¿Cómo hago para enlazar estáticamente con glibc (y otras dependencias) mientras compile con la cadena de herramientas de brazo (o ndk-build)?

P2: ¿Es una buena idea vincular estáticamente a glibc para binarios para Android? ¿Debo esperar que algo se rompa si empiezo estáticamente enlazando? ¿Hay problemas de rendimiento / memoria?

Entiendo la mayoría de los pros y contras de la vinculación estática vs dinámica de aquí – C + + aplicación – ¿Debo utilizar vinculación estática o dinámica para las bibliotecas? Y vinculación estática vs vinculación dinámica

Por lo tanto, deseo saber si debo enlazar estáticamente a glibc para Android cuando compilaciones cruzadas.

Primero una pequeña nota en la libc. La libc de Android es la biblioteca biónica ( https://github.com/android/platform_bionic/ ) en lugar de la libc de GNU (glibc). Por lo tanto, la libc contenida en el NDK es Biónica, al igual que la libc disponible en dispositivos Android.

En lo que respecta a glibc, es posible construirlo con el NDK. Sin embargo, su nombre entrará en conflicto con el sistema libc cuando esté instalado en dispositivos android. Tenga en cuenta que esto es sólo si usted va para la construcción de una biblioteca dinámica. Si crea la biblioteca GNU libc como una biblioteca estática, entonces todo el problema anterior se eludirá, ya que nunca necesita instalar una biblioteca estática.

Ahora para responder a sus preguntas:

  1. Q1: Si está construyendo la glibc usando el NDK, entonces Android.mk utiliza la variable BUILD_STATIC_LIBRARY para crear bibliotecas estáticas. Sin embargo, si usted no utiliza el NDK, entonces usted probablemente tendrá que entrar en un montón de dolor de cabeza (no sé cuánto). No puedo decirle más sobre esto, ya que no he probado una compilación de glibc, ya sea estática o dinámica. Además, parece que la vinculación estática con glibc es muy desalentada, al menos para las plataformas no móviles.

  2. Desde un punto de vista de rotura, no hay diferencia entre enlazamiento estático y dinámico. Desde un punto de vista de arranque, un ejecutable estático se inicia más rápido que el paso de carga de bibliotecas dinámicas no es necesario. No hay pena de memoria ni de velocidad de ejecución en los ejecutables estáticos o vinculados dinámicos. El requisito de almacenamiento en disco es mayor para ejecutables estáticos.

En cuanto a los problemas con la funcionalidad biónica de libc que faltan, puede utilizar el método utilizado por la mayoría de los programas GNU, que es, proporcionar su propia implementación de una función en caso de que falte en las bibliotecas del sistema. He compilado el archivo 5.11, GNU make 3.82, diffutils-2.8 para Android pasando el NDK toolchains / includes / libs a autotools (./configure …). Parece que estos programas contienen implementaciones de la mayor parte de la función de biblioteca no básica, en caso de que las bibliotecas estándar no las proporcionen (en este caso Bionic).

Nota: Voy a tratar de construir una glibc estática y actualizar la respuesta como y cuando tengo éxito / no.

Si va a usar glibc en lugar de biónico, puede valer la pena explorar el uso de la cadena de herramientas de una distribución de brazo-linux (generación de kernel compatible) en lugar de la ndk. Esto sería especialmente cierto si generaba un ejecutable de línea de comandos. (Las personas han empujado experimentalmente los ambientes debian de chroot en dispositivos android todo el camino de regreso al G1)

Para un jni sub (que sigue siendo el único vehículo aprobado oficialmente para el código de aplicación nativo) podría obtener un poco "interesante" con cualquiera de las herramientas, ya que se ejecutará en un proceso que ya ha asignado y está haciendo un uso continuo de la biónica libc Para apoyar la VM de Dalvik. Presumiblemente, si vinculas estáticamente las dependencias propias de la biblioteca, no tendrás conflictos de nombres, pero espero que cualquier ruta que elijas sea una experiencia de aprendizaje sobre el funcionamiento interno. No es que eso sea necesariamente una mala cosa.

¿Tienes que tener ncurses? Con éxito construí maldiciones para android con el ndk una vez. También considere si el programa está aprovechando seriamente eso (es decir, ¿está haciendo realmente el formato de texto sustancial?), O simplemente usarlo para algo pequeño porque se supone que está disponible en los sistemas de destino?

  • ¿Cómo puedo poner datos estáticos en una base de datos SQLite en Android?
  • Método recursivo funciona en java con consola, pero no con android
  • Eliminación de datos estáticos onDestroy ()
  • Error de generación al usar clase interna estática
  • ¿Es segura una clase "Globals" que sostiene variables estáticas en Android?
  • Inicialización estática en OpenCV Android
  • Android - Ethernet - Programáticamente
  • Métodos estáticos o singleton, ¿cuál elegir?
  • Android: guarda referencias a ApplicationContext
  • ¿Cómo estática clase interna con una WeakReference a la clase externa puede evitar fugas de memoria de Android? Necesito un ejemplo
  • Uso de finales estáticas en la actividad de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.