makefile小结

用下面的makefile文件作为例子

 

#若芯片平台基线是6757就执行。

ifeq ($(strip $(GN_CHIPSET_PLATFORM_BASELINE)),6757)

#必须在开始的时候就要定义这个变量,这个mk文件所在目录。
LOCAL_PATH:= $(call my-dir)
#CLEAR_VARS 由编译系统提供(可以在 android 安装目录下的/build/core/config.mk 文件看到其定义,为 CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk),指定让GNU MAKEFILE该脚本为你清除许多 LOCAL_XXX 变量 ( 例如

#LOCAL_MODULE , LOCAL_SRC_FILES ,LOCAL_STATIC_LIBRARIES,等等…),除 LOCAL_PATH。这是必要的,因为所有的编译文件都在同一个 GNU MAKE 执行环境中,所有的变量都是全局的。所以我们需要先清空这些变量

#(LOCAL_PATH除外)。又因为LOCAL_PATH总是要求在每个模块中都要进行设置,所以并需要清空它。 另外注意,该语句的意思就是把CLEAR_VARS变量所指向的脚本文件包含进来。Android.mk中可以定义多个编译模块,每个编译模块都是以

#include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束
include $(CLEAR_VARS)

 #LOCAL_MODULE_TAGS :=

#user eng tests optional

#user: 指该模块只在user版本下才编译

#eng: 指该模块只在eng版本下才编译

#tests: 指该模块只在tests版本下才编译

#optional:指该模块在所有版本下都编译

LOCAL_MODULE_TAGS := optional

#LOCAL_CERTIFICATE := media
#用于指定签名时使用的KEY,如果不指定,默认使用testkey,LOCAL_CERTIFICATE可设置的值如下:

#  LOCAL_CERTIFICATE := platform
#   LOCAL_CERTIFICATE := shared
#   LOCAL_CERTIFICATE := media

#  而在Android.mk中的这些配置,需要在APK源码的AndroidManifest.xml文件中的manifest节点添加如下内容:

#   android:sharedUserId="android.uid.system"
#   android:sharedUserId="android.uid.shared"
#   android:sharedUserId="android.media"
# 这些刚好与上面的mk文件里的配置对应上。

LOCAL_CERTIFICATE := platform

#指定java动态库的别名(java动态库和静态库的拓展名都是.jar)
LOCAL_JAVA_LIBRARIES += findbug_annotations
#指定java静态库的别名
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v13
LOCAL_STATIC_JAVA_LIBRARIES += com.android.gallery3d.common2
LOCAL_STATIC_JAVA_LIBRARIES += mp4parser
LOCAL_STATIC_JAVA_LIBRARIES += stereo_common
LOCAL_STATIC_JAVA_LIBRARIES += amigo_lib



# glide gif decoder @{
LOCAL_STATIC_JAVA_LIBRARIES += glide
# @}

LOCAL_JAVA_LIBRARIES += mediatek-framework
LOCAL_JAVA_LIBRARIES += telephony-common
#指定源文件,可批量指定,也可指定单个文件
LOCAL_SRC_FILES := \
    $(call all-java-files-under, src) \
    $(call all-renderscript-files-under, src)
LOCAL_SRC_FILES += $(call all-java-files-under, src_pd)

# make plugin @{
LOCAL_SRC_FILES += $(call all-java-files-under, ext/src)
# @}

ifeq ($(strip $(MTK_CAM_IMAGE_REFOCUS_SUPPORT)),yes)
    LOCAL_ASSET_DIR += $(LOCAL_PATH)/assets
endif
#指定资源文件目录
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res

#指定打包资源文件

#因为Android的工具aapt在生成apk文件时默认地会编译并压缩res/下的文件,而一些系统文件则不需要被压缩(否则在读取该文件时需要解压缩),在Android.mk文件需要指定以下选项告诉aapt工具不压缩所有.dat文件:

#LOCAL_AAPT_FLAGS := -0 .dat

LOCAL_AAPT_FLAGS := --auto-add-overlay
#package的名字,这个名字在脚本中将标识这个app或package,看下面一句LOCAL_OVERRIDES_PACKAGES
LOCAL_PACKAGE_NAME := Gallery2
#这个主要是用在make整个系统的时候,不会把LOCAL_PACKAGE_NAME为Gallery Gallery3D GalleryNew3D的应用编到system/app(放置系统应用的目录)中
LOCAL_OVERRIDES_PACKAGES := Gallery Gallery3D GalleryNew3D

#LOCAL_SDK_VERSION := current

# If this is an unbundled build (to install seprately) then include
# the libraries in the APK, otherwise just put them in /system/lib and
# leave them out of the APK
ifneq (,$(TARGET_BUILD_APPS))

#声明用到的jni共享库(.so库)。如果是在本项目下有jni源码,在make时会编译对应的jni时,编译时会产生对应的.so库,就不用在指定.so库的路径(相对路径)。如果是

#没有jni源码的,就要拷贝一份.so库到项目下,而且路径需要注意很多问题。
  LOCAL_JNI_SHARED_LIBRARIES := libjni_eglfence libjni_filtershow_filters libjni_jpegstream
else

#这就是上面说到的本项目下有jni源码,编译项目时会编译zhexiejni模块时,就直接指定这字段就可以了。
  LOCAL_REQUIRED_MODULES := libjni_eglfence libjni_filtershow_filters libjni_jpegstream
endif

#REOFUCIMAGE @{
LOCAL_STATIC_JAVA_LIBRARIES += com.mediatek.ngin3d-static
ifneq ($(strip $(MTK_PLATFORM)),)
LOCAL_JNI_SHARED_LIBRARIES += libja3m
endif
# @}

#这跟混淆器有关,proguard.flags是当前目录下的一个文件,供混淆使用。需要注意的地方看这里呀呀呀呀
LOCAL_PROGUARD_FLAG_FILES := proguard.flags

# mtkgallery @{
LOCAL_SRC_FILES += $(call all-java-files-under, mtkgallery/src)
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/mtkgallery/res
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/mtkgallery/res_stereo
# @}

LOCAL_JAVA_LIBRARIES += org.apache.http.legacy

LOCAL_STATIC_JAVA_LIBRARIES += com.mediatek.omadrm.common
#编译apk
include $(BUILD_PACKAGE)

#清除上个模块定义的LOCAL变量
include $(CLEAR_VARS)

#集成jar包,包括java静态库Java动态库

#LOCAL_STATIC_JAVA_LIBRARIES取jar库的别名,可以任意取值;

#别名一定要与LOCAL_STATIC_JAVA_LIBRARIES和LOCAL_JAVA_LIBRARIES里所取的别名一致,且不含.jar;jar文件路径一定要是真实的存放第三方jar包的路径。

#编译用BUILD_MULTI_PREBUILT。

#若是集成.so动态库

#LOCAL_PREBUILT_LIBS指定prebuilt so的规则,格式:别名:so文件路径。注意:别名一般不可改变,特别是第三方jar包使用.so库的情况,且不含.so;so文件路径一定要是真实的存放第三方so文件的路径。


LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := amigo_lib:libs/AmigoLib.jar \
                                        findbug_annotations:libs/annotations.jar

#集成.so动态库在加入  LOCAL_PREBUILT_LIBS := 别名:so文件路径
include $(BUILD_MULTI_PREBUILT)
#让编译器去调用当前目录下jni下的所有.mk文件,以编译jni下的.so模块
include $(call all-makefiles-under, jni)

ifeq ($(strip $(LOCAL_PACKAGE_OVERRIDES)),)

# Use the following include to make gallery test apk

#让编译器去调用当前目录下的所有.mk文件以编译其他需要依赖的模块
include $(call all-makefiles-under, $(LOCAL_PATH))

endif
endif

 

小语法

+=  表示原来有的话不覆盖。

:=  表示原来有的话覆盖掉

 

最后附上几条关于makefile的文章的链接

http://www.2cto.com/kf/201310/253386.html

posted on 2017-05-10 11:38  淡淡的宁静  阅读(340)  评论(0编辑  收藏  举报

导航