Application.mk

En este documento, se explica el archivo de compilación Application.mk que utiliza ndk-build.

Te recomendamos leer las páginas Conceptos y Android.mk antes que esta. Eso te ayudará a maximizar la comprensión del material que se presenta en esta página.

Descripción general

El archivo Application.mk es en realidad un fragmento muy pequeño de un archivo GNU Make que define diversas variables para la compilación. En general, se encuentra en $PROJECT/jni/, donde $PROJECT apunta al directorio de proyectos de la aplicación. Otra alternativa es colocarlo en un subdirectorio del directorio $NDK/apps/ de nivel superior. Por ejemplo:

$NDK/apps/<myapp>/Application.mk

Aquí, <myapp> es un nombre corto empleado para describir tu aplicación al sistema de compilación del NDK. Generalmente, no ingresa en las bibliotecas compartidas ni en los paquetes finales que has generado.

Variables

APP_PROJECT_PATH

Esta variable almacena la ruta de acceso absoluta en el directorio project-root de tu aplicación. El sistema de compilación usa esta información para disponer versiones reducidas de las bibliotecas compartidas JNI generadas en una ubicación específica conocida por las herramientas de generación del APK.

Si dispones tu archivo Application.mk en $NDK/apps/<myapp>/, debes definir esta variable. Si lo dispones en $PROJECT/jni/, es opcional.

APP_MODULES

Si se define esta variable, le indica a ndk-build que se compilen únicamente los módulos correspondientes y aquellos de los que se depende. Debe ser una lista de nombres de módulos separados por comas, como aparecen en la definición de LOCAL_MODULE de los archivos Android.mk.

Si la variable no se define, ndk-build busca la lista de módulos de nivel superior instalables, como aquellos que figuran en el archivo Android.mk y cualquier archivo que incluya directamente. Los módulos importados no corresponden al nivel superior.

Un módulo instalable es una biblioteca compartida o ejecutable, que genera un archivo en libs/$ABI/.

Si la variable no está definida, y en el proyecto no hay módulos de nivel superior instalables, ndk-build compila, en cambio, todas las bibliotecas estáticas de nivel superior y sus dependencias. Estas bibliotecas se colocan en la ubicación habitual, en obj/ o obj-debug/.

APP_OPTIM

Define esta variable opcional como release o debug. Puedes usarla para modificar el nivel de optimización al compilar los módulos de tu aplicación.

Release es el modo predeterminado, y genera ejecutables altamente optimizados. El modo Debug genera ejecutables sin optimizar que son mucho más fáciles de depurar.

Ten en cuenta que puedes depurar ejecutables de depuración o de lanzamiento. No obstante, los ejecutables de lanzamiento proporcionan menos información durante la depuración. Por ejemplo, el sistema de compilación optimiza algunas variables, lo cual evita que puedas inspeccionarlas. Asimismo, el reordenamiento de código puede dificultar aún más el recorrido del código; es posible que el seguimiento de pila no sea confiable.

Al declarar android:debuggable en la etiqueta <application> del archivo de manifiesto de la aplicación, ocurre que esta variable se establece de manera predeterminada en debug en lugar de release. Anula este valor predeterminado configurando APP_OPTIM en release.

APP_CFLAGS

Esta variable almacena un conjunto de indicadores del compilador C que el sistema de compilación pasa al compilador durante la compilación de código fuente C o C++ para cualquiera de los módulos. Puedes usar esta variable para cambiar la compilación de un módulo determinado según la aplicación que lo necesite, en lugar de modificar el archivo Android.mk. Usa APP_CPPFLAGS a fin de especificar indicadores solo para C++.

Todas las rutas de acceso de estos indicadores deben estar relacionadas con el directorio del NDK de nivel superior. Por ejemplo, si tienes la siguiente configuración:

sources/foo/Android.mk
sources/bar/Android.mk

Para especificar en foo/Android.mk que deseas agregar la ruta de acceso a los códigos bar durante la compilación, debes usar lo siguiente:

APP_CFLAGS += -Isources/bar

O bien:

APP_CFLAGS += -I$(LOCAL_PATH)/../bar

-I../bar no funcionará ya que es equivalente a -I$NDK_ROOT/../bar.

APP_CPPFLAGS

Esta variable contiene un conjunto de indicadores del compilador C++ que el sistema de compilación pasa al compilador únicamente durante la compilación de orígenes C++. Usa APP_CFLAGS a fin de especificar indicadores para C y C++.

APP_LDFLAGS

Conjunto de indicadores del vinculador que el sistema de compilación pasa durante la vinculación de la aplicación. Esta variable solo es relevante cuando el sistema de compilación compila bibliotecas compartidas y ejecutables. Cuando este compila bibliotecas estáticas, ignora estos indicadores.

APP_BUILD_SCRIPT

De forma predeterminada, el sistema de compilación del NDK busca en jni/ un archivo llamado Android.mk.

Si deseas anular este comportamiento, puedes definir APP_BUILD_SCRIPT para apuntar a una secuencia de comandos de compilación alternativa. El sistema de compilación siempre interpreta una ruta de acceso no absoluta como si estuviera relacionada con el directorio de nivel superior del NDK.

APP_ABI

De forma predeterminada, el sistema de compilación del NDK genera código máquina para todas las ABI que no están obsoletas. Puedes usar la configuración de APP_ABI a fin de generar código máquina para ABI específicas. En la tabla 1, se muestra la configuración APP_ABI para diferentes conjuntos de instrucciones.

Tabla 1: Configuración de APP_ABI para diferentes conjuntos de instrucciones.

Conjunto de instrucciones Valor
Instrucciones para unidades de punto flotante asistidas por hardware en dispositivos basados en ARMv7 APP_ABI := armeabi-v7a
ARMv8 AArch64 APP_ABI := arm64-v8a
IA-32 APP_ABI := x86
Intel64 APP_ABI := x86_64
Todos los conjuntos de instrucciones admitidos APP_ABI := all

Nota: all solo está disponible a partir de NDKr7.

También puedes especificar varios valores disponiéndolos en la misma línea y delimitándolos con espacios. Por ejemplo:

APP_ABI := armeabi-v7a arm64-v8a x86

Nota: Si usas la directiva externalNativeBuild de Gradle para integrar un proyecto de ndk-build en un proyecto de Gradle, la configuración de APP_ABI en el archivo Application.mk se omite. Puedes configurar las ABI para que se compilen en la secuencia de comandos de Gradle mediante un bloque de abiFilters o (si usas "múltiples APK") un bloque de abi dentro de un bloque de splits.

Para obtener la lista de todas las ABI admitidas y los detalles sobre su uso y sus limitaciones, consulta Administración de ABI.

APP_PLATFORM

Esta variable contiene la versión mínima de plataforma Android que quieres admitir. Por ejemplo, un valor android-15 especifica que la biblioteca utiliza API que no están disponibles en versiones inferiores a Android 4.0.3 (nivel de API 15) y no se puede usar en dispositivos que ejecutan una versión de plataforma más baja. Para obtener una lista completa de los nombres de las plataformas y las imágenes del sistema Android correspondientes, consulta Android NDK Native API.

En lugar de cambiar este indicador directamente, debes establecer la propiedad minSdkVersion en los bloques defaultConfig o productFlavors del archivo build.gradle del nivel del módulo. De este modo, garantizas que la biblioteca solo sea utilizada por las aplicaciones instaladas en los dispositivos que ejecutan una versión adecuada de Android. El conjunto de herramientas ndk-build utiliza la siguiente lógica para elegir la versión mínima de plataforma correspondiente para la biblioteca en función de la ABI que compilas y la minSdkVersion que especificas:

  1. Si existe una versión de plataforma para la ABI que es igual a minSdkVersion, ndk-build usa esta versión.
  2. De lo contrario, si existen versiones de plataforma inferiores a minSdkVersion para la ABI, ndk-build utiliza la más alta de dichas versiones. Esta elección es lógica, ya que si falta una versión de plataforma, en general es porque no se hicieron cambios en las API de plataforma nativa desde la versión anterior disponible.
  3. De lo contrario, ndk-build utiliza la siguiente versión de plataforma disponible más alta que minSdkVersion.

APP_STL

El sistema de compilación del NDK se establece en STL `system` de forma predeterminada. Otras opciones son `c++_shared`, `c++_static` y `none`. Consulta Tiempos de ejecución y funciones del NDK.

APP_SHORT_COMMANDS

El equivalente de LOCAL_SHORT_COMMANDS en Application.mk para el proyecto completo. Para obtener más información, consulta la documentación relacionada con esta variable en Android.mk.

APP_THIN_ARCHIVE

Establece el valor predeterminado de LOCAL_THIN_ARCHIVE en el archivo Android.mk para todos los módulos de bibliotecas estáticas de este proyecto. Para obtener más información, consulta la documentación de LOCAL_THIN_ARCHIVE en Android.mk.