您的位置:首页 > 移动开发 > Android开发

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

2015-10-20 12:08 706 查看
开始接触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 

[plain] view
plaincopyprint?

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 

[plain] view
plaincopyprint?

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 

[cpp] view
plaincopyprint?

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 

[cpp] view
plaincopyprint?

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

 

[cpp] view
plaincopyprint?

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的示例如下:

[cpp] view
plaincopyprint?

LOCAL_PATH := $(my-dir)  

include $(CLEAR_VARS)  

   

LOCAL_MODULE := baiduinput_android_v1.1_1000e  

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk  

   

LOCAL_MODULE_CLASS := APPS  

LOCAL_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库 

  

[cpp] view
plaincopyprint?

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)  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: