第六章 android.mk语法

更新时间:2023-06-01 10:22:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Android系统移植第四章 android.mk语法

第1页

一、android.mk的基本语法 二、简单实例介绍 三、系统软件执行步骤

第2页

一、android.mk语法 android.mk是android的工程的管理文件,起作用基本等同于linux 中的MakeFile。在语法上,android.mk和普通的MakeFile略有不同, 主要是android.mk包含一些android编译系统的公共宏。 可以参考build/core/config.mk 各个选项的默认值在build/core/base_rules.mk Android.mk文件处理从根目录开始找到的第一个android.mk文件, 如果需要递归需要在当前目录中做如下处理 Include $(call all-makefile-under,$(LOCAL_PATH)) 增加以上内容后,如果当前子目录中还有android.mk,也会对其作 出处理。 Android.mk中可以生成多个目标:可执行程序、动态库、静态库、 或者android的应用程序包。

第3页

一、android.mk语法 编译可执行程序 LOCAL_PATH:=$(my-dir) //获取当前目录 #Test Exe Include $(CLEAR_VARS) //清除许多LOCAL_XXX变量 LOCAL_MODULE_TAGS :=eng //编译的版本 LOCAL_SRC_FILES:= \ //源文件 main.c LOCAL_MODULE=test_exe //生成可执行程序 LOCAL_C_INCLUDES := //包含的头文件 LOCAL_STATIC_LIBARIES:= //需要的静态库 LOCAL_SHARED_LIBARIES:=libc //需要的动态库 Include $(BUILD_EXECUTABLE) //编译后生成文件路径

第4页

android.mk语法说明 LOCAL_PATH - 编译时的目录 $(call 目录,目录….) 目录引入操作符: 如该目录下有个文件夹名称 src, 则可以这样写 $(call src),那么就会得到 src 目录的完整路径 宏函数’my-dir’, 由编译系统提供,用于返回当前路径 include $(CLEAR_VARS) -清除之前的一些系统变量 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk 在 build/core/config.mk 定义 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk 通过include 包含自定义的.mk文件(即是自定义编译规则)或是引用系统其 他的.mk文件(系统定义的编译规则)。 LOCAL_SRC_FILES - 编译的源文件 可以是.c, .cpp, .java, .S(汇编文件)或是.aidl等格式, 不同的文件用空格 隔开。如果编译目录子目录,采用相对路径,如子目录/文件名。 也可以通过$(call 目录),指明编译某目录下所有.c/.cpp/.java/.S/ .aidl文 件. 追加文件 LOCAL_SRC_FILES += 文件

第5页

android.mk语法说明 LOCAL_C_INCLUDES - 需要包含的头文件目录 可以是系统定义路径,也可以是相对路径. 如该编译目录下有个 include目录,写法是include/*.h 宏CLEAR_VARS 由编译系统提供,指定让GNU MAKEFILE为你清除许 多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等...),除 LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。 eng: 工程机,user:

最终用户机 tests:测试机 optional:指该模块在所有版本 下都编译 LOCAL_SRC_FILES - 编译的源文件,可以是.c, .cpp, .java, .S(汇编文件) 或是.aidl等格式, 不同的文件用空格隔开 Include $(BUILD_EXECUTABLE): out/target/product/<TARGET_PRODUCT>/obj/EXECUTABLES/<LOCAL_ MODULE>

第6页

android.mk语法说明 编译静态库的模板: #Test Static Lib LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= / helloworld.c LOCAL_MODULE:= libtest_static #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_STATIC_LIBRARY) 一般的和上面相似,BUILD_STATIC_LIBRARY表示编译一个静态库。 编译生成的是以“lib<module_name>.so”的文件,这个就是共享库了,这是系统会自 动加上“头”和“尾”。 libtest_static.a Include $(BUILD_EXECUTABLE): out/target/product/<TARGET_PRODUCT>/obj/STATIC_LIBRARY/<LOCAL_MODUL E>第7页

android.mk语法说明 编译动态库的模板: #Test Shared Lib LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= / helloworld.c LOCAL_MODULE:= libtest_shared TARGET_PRELINK_MODULES := false #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_SHARED_LIBRARY) LOCAL_PRELINK_MODULE := false Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可 以加快起动速度,还可以减少部分内存开销。 out/target/product/<TARGET_PRODUCT>/obj/SHARED_LIBRARY/<LOCAL_ MODULE>第8页

android.mk语法说明 编译一个简单的APK LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage # Tell it to build an APK include $(BUILD_PACKAGE) BUILD_PACKAGE表示编译一个apk程序,而call all-subdir-java-files表示自动 查找当前目录下的所有java文件进行编译。 在源码中编译和SDK环境下编译有所不同,涉及的目录主要有两个。 Out/target/common/obj/apps—通用java字节码目录 out/target/product/<TARGET_PRODUCT>/apps---android应用包目录

第9页

android.mk语法说明 在这两个目录中都有一个名为LOCAL_PACKAGE_NAME_intermediates/的独立目录。每个目录下有三个apk文件,名称为 LOCAL_PACKAGE_NAME.apk.unsigned:第一步生成没有签名的apk包 LOCAL_PACKAGE_NAME.apk.unaligned:第二步生成没有签名的apk包 LOCAL_PACKAGE_NAME.apk.:第三步生成最终的apk包

第 10 页

Android系统开发 在android

第 11 页

Android系统开发 在android

第 12 页

Android系统开发 在android

第 13 页

Android系统开发 在android

第 14 页

Android系统开

可执行程序:XXX_intermediates 静态库: XXX_static_intermediates 动态库: XXX_shared_intermediates

第 15 页

第 16 页

本文来源:https://www.bwwdw.com/article/odc1.html

Top