Introducción a Android.mk

Función 1.Android.mk

Android.mk es un archivo de gestión de proyectos de Android. Su función es equivalente al Makefile en el entorno Linux. Compila el código fuente que escribes en un archivo de biblioteca o en un archivo ejecutable. Un android.mk puede contener varios módulos, es decir, puede compilar varios módulos, un archivo de biblioteca o un archivo ejecutable.

2. Un caso simple de Android.mk

Código fuente abierto de Android: /system/libvintf/Android.mk


 LOCAL_PATH := $(call my-dir)         #源文件在开发树中的位置

 include $(CLEAR_VARS)                #清除LOCAL_PATH变量之外的LOCAL_XXX变量
 LOCAL_MODULE := libvintf_recovery    #生成的模块名称
 LOCAL_SRC_FILES := VintfObjectRecovery.cpp   #需要编译进这个模块的源文件
 LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/vintf   #头文件
 LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include  #头文件以及头文件中所用到的头文件
 LOCAL_CFLAGS := -Wall -Werror        #编译源文件时要传递的编译器标志
 LOCAL_STATIC_LIBRARIES := \          #编译这个模块所依赖到的静态库
     libbase \
     libvintf \
     libhidl-gen-utils \
     libfs_mgr

 LOCAL_EXPORT_STATIC_LIBRARY_HEADERS := libhidl-gen-utils

 include $(BUILD_STATIC_LIBRARY)      #把这个模块编译成静态库

 $(call dist-for-goals,dist_files,$(HOST_OUT_EXECUTABLES)/checkvintf)

A través de este caso simple, creo que tiene una comprensión preliminar de cómo escribir un Android.mk desde cero

3. Gramática común

gramática explicar
llamar Llame a una función de macro proporcionada por el sistema, la anterior es my-dir
ps valor
:= asignación
ifeq si es igual
ifneq si no es igual

4. Nombres de variables de uso común

4.1 Definir la posición actual del módulo

LOCAL_PATH := $(call my-dir)

Cada archivo Android.mk debe comenzar definiendo LOCAL_PATH . Se utiliza para encontrar archivos fuente en el árbol de desarrollo. La función de macro my-dir proporcionada por el sistema devuelve la ruta del directorio que contiene Android.mk. CLEAR_VARS no lo borrará, y el método de escritura también es muy fijo, a saber: LOCAL_PATH := $(call my-dir) .

LOCAL_PATH es una variable que indica la ubicación del módulo actual, my-dir es una función macro proporcionada por el sistema, que devuelve la ruta del archivo actual, $(call my-dir) significa llamar a esta función.

4.2 Borrar variables LOCAL_XXX

include $(CLEAR_VARS)

El sistema proporciona la variable CLEAR_VARS
y apunta a un Makefile GNU específico, que es responsable de limpiar muchos LOCAL_xxx, por ejemplo: LOCAL_MODULE , LOCAL_SRC_FILES , LOCAL_STATIC_LIBRARIES , etc. Pero no limpie LOCAL_PATH . Esta acción de limpieza es necesaria porque todos los archivos de control de compilación son analizados y ejecutados por el mismo GNU Make, y sus variables son globales. Por lo tanto, después de la limpieza, se puede evitar la influencia mutua.

4.3 Archivos fuente que necesitan participar en la compilación

LOCAL_SRC_FILES := VintfObjectRecovery.cpp

La variable LOCAL_SRC_FILES representa los archivos que deben compilarse

También hay otras formas de escribir:

LOCAL_SRC_FILES := $(call all-subdir-java-files)

La función all-subdir-java-files devuelve todos los archivos java en el subdirectorio LOCAL_PATH .

Pero tenga cuidado, agregue la siguiente declaración al final del archivo para indicar el directorio LOCAL_PATH .

include $ (call all-makefiles-under,$(LOCAL_PATH))

O agregue LOCAL_PATH a cada ruta de archivo :

LOCAL_SRC_FILES := $(LOCAL_PATH)/VintfObjectRecovery.cpp

4.3.1 Varios métodos comúnmente utilizados para obtener archivos fuente:

LOCAL_SRC_FILES := $(call all-java-files-under, src)

Obtenga todos los archivos Java en el directorio especificado.

LOCAL_SRC_FILES := $(call all-c-files-under, src) 

Obtenga todos los archivos de lenguaje C en el directorio especificado.

LOCAL_SRC_FILES := $(call all-Iaidl-files-under, src) 

Obtenga todos los archivos AIDL en el directorio especificado.

LOCAL_SRC_FILES := $(call all-makefiles-under, folder)

Obtenga todos los archivos Make en el directorio especificado.

4.4 Definir el nombre del módulo generado por compilación

LOCAL_MODULE := libvintf_recovery

La variable LOCAL_MODULE debe ser definida y única. Como identificador de módulo, el sistema de compilación generará automáticamente un prefijo y un sufijo adecuados.

4.5 Etiquetas compiladas

LOCAL_MODULE_TAGS := optional

Los más utilizados son: debug , eng , user , development u opcional (predeterminado).

4.6 Propiedades de la firma

Los más utilizados son:
plataforma : el APK completa algunas funciones básicas del sistema. Probado para el acceso a las carpetas presentes en el sistema.
shared : el APK necesita compartir datos con el proceso de inicio/contactos.
medios : el APK es parte del sistema de medios/descargas.

LOCAL_CERTIFICATE := platform

4.7 Biblioteca jar estática de referencia

LOCAL_STATIC_JAVA_LIBRARIES := jar1 jar2

jar1 y jar2 son los alias del paquete Java de terceros, que deben definirse, consulte a continuación.
LOCAL_JAVA_LIBRARIES se usa para hacer referencia a archivos jar dinámicos.

4.8 En qué se compila

4.8.1 Compilar en apk

include $(BUILD_PACKAGE)

4.8.2 Compilar en una biblioteca estática

include $(BUILD_STATIC_LIBRARY)

4.8.3 Compilar en una biblioteca dinámica

include $(BUILD_SHARED_LIBRARY)

4.8.4 Compilar en un programa ejecutable

include $(BUILD_EXECUTABLE)

4.8.5 Compilar en la biblioteca estática de Java

include $(BUILD_STATIC_JAVA_LIBRARY)

4.9 Bibliotecas que necesitan ser precompiladas

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jar1:path1 \
										jar2:path2

jar1, jar2 definen los alias de la biblioteca estática, ruta1, ruta2 es la ruta de la biblioteca estática, preste atención para escribir hasta el sufijo .jar.

4.10 Copiar a compilación local

include $(BUILD_MULTI_PREBUILT) 

Copie la biblioteca definida por precompilación a local para la compilación.

4.11 Especificar el directorio de compilación

LOCAL_MODULE_PATH := $(TARGET_OUT)/

$(TARGET_OUT) significa /sistema

$(TARGET_OUT_DATA_APPS) representa el directorio de datos/aplicaciones

4.12 Compilar bajo qué versión

LOCAL_MODULE_TAGS

usuario : significa que el módulo solo se compila bajo la versión de usuario
eng : significa que el módulo solo se compila bajo la versión eng
tests : significa que el módulo solo se compila bajo la versión de pruebas
opcional : significa que el módulo se compila bajo todas las versiones

4.13 ¿Cuántos bits están integrados en

LOCAL_MULTILIB

ambos : construye tanto 32 bits como 64 bits
32 : construye solo 32 bits.
64 : construye solo 64 bits.

4.14 Ejecución de archivos de configuración preinstalados

include $(BUILD_PREBUILT)

La ejecución del archivo de configuración preinstalado es copiar la biblioteca dinámica al directorio especificado, use esta etiqueta;

Por ejemplo el siguiente código:

#是将libtsldc.so 预装到(其实就是拷贝到$(TARGET_OUT_VENDOR)/lib下面)
include $(CLEAR_VARS)
LOCAL_SRC_FILES     := TS_LDC/C626/tsldc/lib/libtsldc.so
LOCAL_MULTILIB      := 32
LOCAL_MODULE        := libtsldc
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_TAGS   := optional
LOCAL_MODULE_CLASS  := SHARED_LIBRARIES
LOCAL_MODULE_PATH   := $(TARGET_OUT_VENDOR)/lib
include $(BUILD_PREBUILT)

4.15 Archivos de encabezado

LOCAL_INC_FILES

El ejemplo de agregar el archivo de encabezado .h escrito por usted mismo es el siguiente;LOCAL_INC_FILES := person.h

LOCAL_C_INCLUDES

Especifica la ruta de búsqueda de archivos de encabezado.LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/vintf

4.16 Indicadores del compilador

LOCAL_CFLAGS

Esta variable opcional establece los indicadores del compilador para que pase el sistema de compilación al compilar archivos fuente C y C++. Esta característica puede ser útil para especificar definiciones de macro adicionales u opciones de compilación

LOCAL_CPPFLAGS

Solo se pasa un conjunto opcional de indicadores del compilador cuando se compilan archivos fuente de C++. Aparecerán después de LOCAL_CFLAGS en la línea de comandos del compilador.

4.17 Lista de banderas de enlazador adicionales requeridas para la compilación

LOCAL_LDLIBS

Lista de banderas de enlazador adicionales requeridas para la compilación. Le permite pasar el nombre de una biblioteca de sistema específica usando el prefijo -l.

Ejemplo:LOCAL_LDLIBS += -llog -ldl -lz

5.0 Agradecimientos

Este artículo hace referencia a los siguientes dos blogs:

Análisis de Android.mk y uso
de la gramática y la introducción de variables de Android.mk

Supongo que te gusta

Origin blog.csdn.net/qq_45458713/article/details/129092447
Recomendado
Clasificación