【Android源码 栏目提醒】:网学会员Android源码 为您提供Android编译系统(一)Android mk的学习 - 技术总结参考,解决您在Android编译系统(一)Android mk的学习 - 技术总结学习中工作中的难题,参考学习。
有关Android.mk的详细讨论请参考
Android源码树中以下两篇文章以下文章只是一个入门介绍ndk/docs/OVERVIEW.htmlndk/docs/ANDROID-MK.html如下文件主要摘自http://www.cnblogs.com/lilactutu/archive/2010/12/06/1897696.html一、概述一个Android.mk 文件用来向编译系统描述你的源代码。
具体来说该文件是GNU Makefile的一小部分会被编译系统解析一次或多次。
你可以在每一个Android.mk file中定义一个或多个模块你也可以在几个模块中使用同一个源代码文件。
编译系统为你处理许多细节问题。
例如你不需要在你的Android.mk中 列出头文件和依赖文件。
NDK编译系统将会为你自动处理这些
问题。
这也意味着在升级NDK后你应该得到新的toolchain/platform支持而且不需要改变你的Android.mk文件。
先看一个简单的例子一个简单的hello world比如下面的文件sources/helloworld/helloworld.csources/helloworld/Android.mk相应的Android.mk文件会象下面这样----------cut here ------------------LOCAL_PATH : call my-dirinclude CLEAR_VARSLOCAL_MODULE: helloworldLOCAL_SRC_FILES : helloworld.cinclude BUILD_SHARED_LIBRARY----------cut here ------------------我们来解释一下这几行代码LOCAL_PATH : call my-dir一个Android.mk file首先必须定义好LOCAL_PATH变量。
它用于在开发树中查找源文件。
在这个例子中宏函数’my-dir’ 由编译系统提供用于返回当前路径即包含Android.mk file文件的目录。
include CLEAR_VARSCLEAR_VARS 由编译系统提供指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量例如 LOCAL_MODULE LOCAL_SRC_FILES LOCAL_STATIC_LIBRARIES 等等...除LOCAL_PATH 。
这是必要的因为所有的编译控制文件都在同一个GNU MAKE执行环境中所有的变量都是全局的。
LOCAL_MODULE : helloworldLOCAL_MODULE变量必须定义以标识你在Android.mk文件中描述的每个模块。
名称必须是唯一的而且不包 含任何空格。
注意编译
系统会自动产生合适的前缀和后缀换句话说一个被命名为foo的共享库模块将会生成libfoo.so文件。
LOCAL_SRC_FILES : helloworld.cLOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C
源代码文件。
注意你不用在这 里列出头文件和包含文件因为编译系统将会自动为你找出依赖型的文件仅仅列出直接传递给编译器的源代码文件就好。
二、几种模板在Android中增加本地程序或者库这些程序和库与其所在路径没有任何关系只和它们的Android.mk文件有关系。
Android.mk和普通 的Makefile有所不同它具有统一的写法主要包含一些系统公共的宏。
在一个Android.mk中可以生成多个可执行程序、动态库和静态库。
1编译应用
程序的模板Test ExeLOCAL_PATH : call my-dirinclude CLEAR_VARSLOCAL_SRC_FILES: main.cLOCAL_MODULE: test_exeLOCAL_C_INCLUDES :LOCAL_STATIC_LIBRARIES :LOCAL_SHARED_LIBRARIES :include BUILD_EXECUTABLE菜 鸟级别解 释:是赋值的意思是引用某变量的值LOCAL_SRC_FILES中加入源文件路径LOCAL_C_INCLUDES 中加入所需要包含的头文件路径LOCAL_STATIC_LIBRARIES加入所需要链接的静态库.a的名 称LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库.so的名称LOCAL_MODULE表示模块最终的名 称BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。
2编译静态库的模板Test Static LibLOCAL_PATH : call my-dirinclude CLEAR_VARSLOCAL_SRC_FILES:helloworld.cLOCAL_MODULE: libtest_staticLOCAL_C_INCLUDES :LOCAL_STATIC_LIBRARIES :LOCAL_SHARED_LIBRARIES :include BUILD_STATIC_LIBRARY一般的和上面相似BUILD_STATIC_LIBRARY表示编译一个静态库。
3编译动态库的模板Test Shared LibLOCAL_PATH : call my-dirinclude CLEAR_VARSLOCAL_SRC_FILES:helloworld.cLOCAL_MODULE: libtest_sharedTARGET_PRELINK_MODULES : falseLOCAL_C_INCLUDES :LOCAL_STATIC_LIBRARIES :LOCAL_SHARED_LIBRARIES :include BUILD_SHARED_LIBRARY一般的和上面相似BUILD_SHARED_LIBRARY表示编译一个静态库。
三、目标文件生成路径以上三者的生成结果分别在如下generic依具体target会变out/target/product/generic/obj/EXECUTABLEout/target/product/generic/obj/STATIC_LIBRARYout/target/product/generic/obj/SHARED_LIBRARY每个模块的目标文件夹分别为可执行程序XXX_intermediates静态库 XXX_static_intermediates动态库 XXX_shared_intermediates另外在Android.mk文件中还可以指定最后的目标安装路径用LOCAL_MODULE_PATH和 LOCAL_UNSTRIPPED_PATH来指定。
不同的文件系统路径用以下的宏进行选择TARGET_ROOT_OUT表示根文件系统。
TARGET_OUT 表示system文件系统。
TARGET_OUT_DATA表示data文件系统。
TARGET_OUT_ETC表示system文件系统下的etc目录即systemetc用法如LOCAL_MODULE_PATH:TARGET_ROOT_OUT