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)?
- calling finish () de la actividad
- Call finish () del método estático
- Android Weak Referencia de la clase interna
- Rotar ImageView en Android <Nivel de API 11
- Android infla la vista utilizando un objeto de vista existente
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.
- Clase estática en Java (Android) - uso o no uso
- ¿Cómo pasar el contexto de MenuItem onOptionsItemSelected a ASyncTask?
- Acerca de pérdidas de memoria y métodos genéricos
- ¿Creación de AlertDialog con métodos estáticos?
- Cuándo elegir variables para declarar como estática final
- Dagger 2 Inyecciones estáticas
- ¿Cómo pasar datos entre actividades usando variables estáticas en una clase pública?
- ¿Puedo obtener cierta eficiencia al declarar a los miembros apropiados "estáticos" en la actividad de Android?
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:
-
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.
-
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?
- Creación de un rectángulo dibujable en xml con un gradiente en la mitad superior y otro en la mitad inferior
- Android WebView no respeta el porcentaje de escala