fWX228941 / project

all by myself
1 stars 0 forks source link

Android.mk #31

Open fWX228941 opened 5 years ago

fWX228941 commented 5 years ago

Android.mk 1.概览 用于向构建系统描述源文件和共享库。 它实际上是构建系统解析一次或多次的微小 GNU makefile 片段。 Android.mk 文件用于定义 Application.mk、构建系统和环境变量所未定义的项目范围设置。它还可替换特定模块的项目范围设置。 Android.mk 的语法用于将源文件分组为模块。 模块是静态库、共享库或独立可执行文件。 可在每个 Android.mk 文件中定义一个或多个模块,也可在多个模块中使用同一个源文件。 构建系统只会将共享库放入应用软件包。 此外,静态库可生成共享库。 除了封装库之外,构建系统还可为您处理各种其他详细信息。例如,您无需在 Android.mk 文件中列出标头文件或生成的文件之间的显式依赖关系。 make file 文件其设计决定旨在使应用开发者更容易重复使用外部库的源代码。

2.语法 2.1.Android.mk 文件必须首先定义 LOCAL_PATH 变量: LOCAL_PATH := $(call my-dir) 此变量表示源文件在开发树中的位置。在这里,构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径。

2.2.include $(CLEAR_VARS) CLEAR_VARS 变量指向特殊 GNU Makefile,可为您清除许多 LOCAL_XXX 变量,例如 LOCAL_MODULE、LOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES。 请注意,它不会清除 LOCAL_PATH。此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中所有变量都是全局的)中解析所有构建控制文件。 在描述每个模块之前,必须声明(重新声明)此变量。

2.3.LOCAL_MODULE 变量将存储您要构建的模块的名称。请在应用中每个模块使用一个此变量 LOCAL_MODULE := hello-jni 每个模块名称必须唯一,且不含任何空格。构建系统在生成最终共享库文件时,会将正确的前缀和后缀自动添加到您分配给 LOCAL_MODULE 的名称。 例如,上述示例会导致生成一个名为 libhello-jni.so 的库。

2.4.LOCAL_SRC_FILES := hello-jni.c LOCAL_SRC_FILES 变量必须包含要构建到模块中的 C 和/或 C++ 源文件列表。

2.5.include $(BUILD_SHARED_LIBRARY) BUILD_SHARED_LIBRARY 变量指向 GNU Makefile 脚本,用于收集您自最近 include 后在 LOCAL_XXX 变量中定义的所有信息。 此脚本确定要构建的内容及其操作方法。以及确定如何从列出的源文件构建目标共享库。 请注意,使用此脚本要求您至少已为 LOCAL_MODULE 和 LOCAL_SRC_FILES 赋值。共享库变量导致构建系统生成具有 .so 扩展名的库文件。

2.6.include $(BUILD_STATIC_LIBRARY) 用于构建静态库的 BUILD_SHARED_LIBRARY 的变体。构建系统不会将静态库复制到您的项目/软件包,但可能使用它们构建共享库(请参阅下面的 LOCAL_STATIC_LIBRARIES 和 LOCAL_WHOLE_STATIC_LIBRARIES) 静态库变量导致构建系统生成扩展名为 .a 的库。

2.7.include $(PREBUILT_SHARED_LIBRARY) 指向用于指定预建共享库的构建脚本。与 BUILD_SHARED_LIBRARY 和 BUILD_STATIC_LIBRARY 的情况不同,这里的 LOCAL_SRC_FILES 值不能是源文件, 而必须是指向预建共享库的单一路径,例如 foo/libfoo.so。 也可使用 LOCAL_PREBUILTS 变量引用另一个模块中的预建库

2.8.TARGET_ARCH Android 开放源代码项目所指定的目标 CPU 架构的名称。对于与 ARM 兼容的任何构建,请使用独立于 CPU 架构修订版或 ABI 的 arm(请参阅下面的 TARGET_ARCH_ABI)。 此变量的值取自您在 Android.mk 文件中定义的 APP_ABI 变量,系统将在解析 Android.mk 文件前读取其值。

2.9.TARGET_PLATFORM := android-22 作为构建系统目标的 Android API 级别号。例如,Android 5.1 系统映像对应于 Android API 级别 22:android-22。如需平台名称及相应 Android 系统映像的完整列表,

3.1. TARGET_ARCH_ABI := arm64-v8a 当构建系统解析此 Android.mk 文件时,此变量将 CPU 和架构的名称存储到目标。 您可以指定以下一个或多个值,使用空格作为多个目标之间的分隔符。

3.深入 3.1.自定义变量向构造系统描述你的项目模块。流程:

使用 CLEAR_VARS 变量初始化或取消定义与模块相关的变量。 为用于描述模块的变量赋值。 使用 BUILD_XXX 变量设置 NDK 构建系统,以便为模块使用适当的构建脚本。

3.2.LOCAL_MODULE_FILENAME := libnewfoo 此可选变量可让您覆盖构建系统默认用于其生成的文件的名称。 例如,如果 LOCAL_MODULE 的名称为 foo,您可以强制系统将它生成的文件命名为 libnewfoo。 图片1 图片2 图片3 图片4 图片5 图片6 图片7

fWX228941 commented 5 years ago
fWX228941 commented 5 years ago

指定apk存放的目录

fWX228941 commented 5 years ago

配置签名

fWX228941 commented 5 years ago

引用 so jar aar 文件 其中aar有版本坑,需要特别注意

fWX228941 commented 5 years ago

Android编译系统 1.MakeFile 1.1.MakeFile 提供了一种机制,可以让使用者有效地组织工作,包括架构编译系统,生成文档,打印日志。 1.2.MakeFile 是一种脚本(shell/python)由make程序来解析(GNU make / nmake) 1.3.采用唯一的MakeFile 来组织所有文件的自动化编译 1.4.单独编译,如果只修改了test.so文件,那么就应该能做到只以这个so库为中心来展开编译工作,而不需要整项目全编。

图片8

1.5.Android.mk 意义在于操作系统的动态扩展性,比如厂商需要将自研的APK集成进android系统中,或者把某个解析库编译进系统版本中。

2.Android.mk语法 2.1. clear_vars : 编译模块的开始标志 2.2. local_src_files : 定义了本模块编译所涉及到的所有源文件 2.3. local_static_libraries : 编译过程中要用到的库 2.4. local_module : 所要生成的模块名称 2.5. build_host_executable : 希望生成一个host可执行程序 2.6. 准备食材+烹饪菜肴 : 清单文件可同时烹饪多道菜肴,开始和结束标志分别是 Include $(clear_vars) — include $(build_XXX) 2.7. local_path : 确定源码所在的目录 全局 2.8. local_module_path : 模块的输出路径

fWX228941 commented 5 years ago

SO文件 so(shared object,共享库)是机器可以直接运行的二进制代码,是Android上的动态链接库,类似于Windows上的dll。每一个Android应用所支持的ABI是由其APK提供的.so文件决定的,这些so文件被打包在apk文件的lib/目录下