这篇Blog主要记录向系统源码添加模块时使用的Makefile,和NDK编程使用的makefile有一些差异。
Android的mk文件是有很强的套路的,下面我在我的<android源码路径>/packsges/app/
文件夹下建立一个名字叫做MakefileDemo
的工程,里面的目录结构如图所示:![Alt text](./2017-01-11 14:34:49的屏幕截图.png)
libs存放了我使用的jar包这里目前只有一个dom4j-1.6.1.jar
,src是存放源代码的目录,res是资源目录。
现在我们要编译这个apk(假设我们已经编译过一次系统源码)最主要的是Android,mk这个文件,这个文件告诉mmm(也可以是make,m,mm)命令如何去编译这个APK,下面就来一步一步写一下这个mk文件。
第一步
加入这段代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PATH := $(call my-dir)
,这句代码LOCAL_PATH
是变量名,$(call my-dir)
的意思是调用my-dir
这个函数,这个函数的返回值是Android.mk
这个文件所在的位置,对我这个项目来说该函数的返回值就是<android源码路径>/packsges/app/MakefileDemo/
。LOCAL_PATH
这个变量是一定要定义的,它告诉编译系统当前模块的位置。
include $(CLEAR_VARS)
这句代码的作用是清楚除了LOCAL_PATH
变量之外的LOCAL_XXX
变量,为什么要清楚这些变量呢?因为在编译MakefileDemo
模块之前可能编译过别的模块,例如之前编译=过Launcher3
这个模块人后这个模块升值了一个LOCAL_MODULE
紧接着编译我们的MakefileDemo
模块但是我们模块的mk文件不需要LOCAL_MODULE
并且没有include $(CLEAR_VARS)
清楚上个模块设置的变量,那么这个时候Launcher3
的LOCAL_MODULE
变量就会被Build系统误认为是我们的MakefileDemo
的,这样就会产生不可预知的错误。
两句代码是mk
文件的标配,基本上所有的mk文件都需要这两句代码。
注:LOCAL_PATH := (callmy−dir)这句代码必须放在include (CLEAR_VARS)这句代码前面,否则call my-dir不能返回正确的结果,具体原因请参照这篇博客
第二步
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES :=$(call all-