Android.mk例子
说明下每一句的作用
LOCAL_PATH := $(call my-dir) //指定路径当前文件夹
include $(CLEAR_VARS) //清除原本设定的变量,就是LOCAL_XXX, 除了LOCAL_PATH
LOCAL_SRC_FILES:= \ //指定要编译的source文件
jni/XXXUtils.cpp \
jni/XXXService.cpp \
LOCAL_SHARED_LIBRARIES := \ //指定需要连接的动态库,即.so文件
libutils \
libbinder \
libandroid_runtime \
libcutils \
libmedia \
libmediaplayerservice \
LOCAL_C_INCLUDES := \ //头文件目录,这里指的是JNI的头文件和源码framework下指定的include目录
$(JNI_H_INCLUDE) \
$(TOP)\frameworks\av\include \
LOCAL_MODULE_TAGS := optional //指明该模块在所有的版本都编译(user版本,eng版本,test版本)
LOCAL_PROGUARD_ENABLED := disabled //这是代码混淆标识,disable就是不需要混淆
LOCAL_PRELINK_MODULE := false //这个是动态库需要预先加载与否的标识,系统默认是需要的
LOCAL_MODULE:= libXXXUtils //编译的库的名字
ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE) //就是说把这个模块打包到系统镜像中
include $(BUILD_SHARED_LIBRARY) //模块编译为动态库,即libXXXUtils.so
include $(CLEAR_VARS) //上面已经说了作用,看到这个标识,就知道到此结束一个模块,开始新的一个模块了
LOCAL_STATIC_JAVA_LIBRARIES := fluent-hc-4.3.3 httpmime-4.3.3 //使用到的java静态库,就是jar包
LOCAL_JAVA_LIBRARIES := XXX //也是说要用到这个jar
LOCAL_SRC_FILES := \ //已经说了,然后这里使用(call all-subdir-java-files)获取所有子文件夹下的java文件
$(call all-subdir-java-files) \
src/com/XXX/aidl/ICallBack.aidl \
src/com/XXX/aidl/XXX.aidl \
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_SRC_FILES += $(call all-java-files-under, src-pay)
LOCAL_SRC_FILES += src/com/XXX/IControl.aidl \
LOCAL_PACKAGE_NAME := XXX //生成的package的名字,也就是APK名字
#LOCAL_CERTIFICATE := shared //使用的签名,这里是share
LOCAL_CERTIFICATE := platform //使用系统的签名
LOCAL_OVERRIDES_PACKAGES := Home //改标志是说Home.apk不变编译到系统中
LOCAL_PROGUARD_ENABLED := obfuscation //使混淆
LOCAL_PROGUARD_FLAG_FILES := proguard.cfg //指定混淆的机制文件
include $(BUILD_PACKAGE) //模块编译为XXX.apk
include $(CLEAR_VARS) //上面已经说了
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \ //指定上面使用的第三方的jar包的路径
fluent-hc-4.3.3:libs/fluent-hc-4.3.3.jar \
httpmime-4.3.3:libs/httpmime-4.3.3.jar
include $(BUILD_MULTI_PREBUILT) //引入第三方so和jar需要用此编译
相关扩展:
宏:像my-dir这种被称为宏,下面是一些宏,必须通过使用'$(call )'来求值,他们返回文本化的信息。
1、my-dir
返回当前Android.mk所在的目录路径,在Android.mk文件的开头一般如此定义: LOCAL_PATH := $(call my-dir)
2、all-subdir-makefiles
返回一个位于当前'my-dir'路径的子目录列表。例如,看下面的目录层次: sources/foo/Android.mk
sources/foo/lib1/Android.mk
sources/foo/lib2/Android.mk
如果sources/foo/Android.mk包含一行: include $(call all-subdir-makefiles) 那么它就会自动包含sources/foo/lib1/Android.mk 和sources/foo/lib2/Android.mk ;
这项功能用于向编译系统提供深层次嵌套的代码目录层次。在默认情况下,只搜索在sources/*/Android.mk。