【Makefile】如何写Android.mk(整理)

来源:互联网 发布:沈天津seo诊断 编辑:程序博客网 时间:2024/06/06 05:07


开始接触android编译,不可避免的就是遇到一个个目录下的android.mk文件。mk文件就就是uinx/linux下的makefile文件。前一阵子再看陈皓老师的《跟我一起学makefie》,看的不深入,自己实践得少。


先回顾一下make的工作方式(参考 陈皓的  跟我一起写makefile)

GNU的make工作时的执行步骤入下:(想来其它的make也是类似)

    1、读入所有的Makefile。
    2、读入被include的其它Makefile。
    3、初始化文件中的变量。
    4、推导隐晦规则,并分析所有规则。
    5、为所有的目标文件创建依赖关系链。
    6、根据依赖关系,决定哪些目标要重新生成。
    7、执行生成命令。

1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。




一、全局看android下的mk   (参考:  android.mk脚本结构)






一个Android.mk

下面简单解释一下这三步:

1、清除旧变量,是因为Android.mk中所有的变量都是全局的,编译函数在编译时会调用这些变量。为了防止编译函数使用了编译其它模块时设置的变量,每次开始编译一个新的模块时清除所有的变量是个好习惯。

2、设置新变量就是把本次编译时用到的源码地址,包名等设置好。

3、调用编译函数其实就是include一个固定的mk文件,这个mk文件会根据设置的变量提取出编译模块需要的target,Command等信息并执行固定的编译命令。



编译一个简单的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)

 

编译一个依赖静态.jar文件的APK 

LOCAL_PATH := $(call my-dir)  include $(CLEAR_VARS)     # List of static libraries to include in the package  LOCAL_STATIC_JAVA_LIBRARIES := static-library     # 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)

 

编译一个需要platform key签名的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     LOCAL_CERTIFICATE := platform     # Tell it to build an APK  include $(BUILD_PACKAGE)

 

编译一个需要特殊vendor key签名的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     LOCAL_CERTIFICATE := vendor/example/certs/app     # Tell it to build an APK  include $(BUILD_PACKAGE) 

添加一个第三方APK

 

 LOCAL_PATH := $(call my-dir)  include $(CLEAR_VARS)     # Module name should match apk name to be installed.  LOCAL_MODULE := LocalModuleName  LOCAL_SRC_FILES := $(LOCAL_MODULE).apk  LOCAL_MODULE_CLASS := APPS  LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)   LOCAL_CERTIFICATE := platform   include $(BUILD_PREBUILT)  

第三方APK针对需要.so的apk的示例如下:

LOCAL_PATH := $(my-dir)include $(CLEAR_VARS) LOCAL_MODULE := baiduinput_android_v1.1_1000eLOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := platform  include $(BUILD_PREBUILT) ######################################################################## copy the library to /system/lib ##########################################################################################include $(CLEAR_VARS) LOCAL_MODULE := libinputcore.so LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)LOCAL_SRC_FILES := lib/$(LOCAL_MODULE)OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)  include $(BUILD_PREBUILT)  


添加静态java库 

  

LOCAL_PATH := $(call my-dir)  include $(CLEAR_VARS)     # Build all java files in the java subdirectory  LOCAL_SRC_FILES := $(call all-subdir-java-files)     # Any libraries that this library depends on  LOCAL_JAVA_LIBRARIES := android.test.runner     # The name of the jar file to create  LOCAL_MODULE := sample     # Build a static jar file.  include $(BUILD_STATIC_JAVA_LIBRARY)