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