一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。每个模块属下列类型之一:
1)APK程序,一般的Android程序,编译打包生成apk文件
2)JAVA库,java类库,编译打包生成jar文件
3) C/C++应用程序,可执行的C/C++应用程序
4)C/C++静态库,编译生成C/C++静态库,并打包成.a文件
5)C/C++共享库, 编译生成共享库(动态链接库),并打包成.so, 有且只有共享库才能被安装/复制到您的应用软件(APK)包中。
以下是Android.mk(packages/apps/Camera2/Android.mk)的文本:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_STATIC_JAVA_LIBRARIES := android-support-v13LOCAL_STATIC_JAVA_LIBRARIES += xmp_toolkitLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_SRC_FILES += $(call all-java-files-under, src_pd)LOCAL_SRC_FILES += $(call all-java-files-under, src_pd_gcam)LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/resinclude $(LOCAL_PATH)/version.mkLOCAL_AAPT_FLAGS := / --auto-add-overlay / --version-name "$(version_name_package)" / --version-code $(version_code_package) /LOCAL_PACKAGE_NAME := Camera2LOCAL_SDK_VERSION := currentLOCAL_PROGUARD_FLAG_FILES := proguard.flags# 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 APKifneq (,$(TARGET_BUILD_APPS)) LOCAL_JNI_SHARED_LIBRARIES := libjni_mosaic libjni_tinyplanetelse LOCAL_REQUIRED_MODULES := libjni_mosaic libjni_tinyplanetendifinclude $(BUILD_PACKAGE)include $(call all-makefiles-under, $(LOCAL_PATH))
5,LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
6,LOCAL_RESOURCE_DIR。默认product package和device package相应的res路径和$(LOCAL_PATH)/res.
include $(LOCAL_PATH)/version.mk。加入第三方库文件。
7,LOCAL_AAPT_FLAGS
AAPT(Android Asset Packaging Tool) 在SDK的tools/目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具, 但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序.
8, LOCAL_PACKAGE_NAME 表示了这个包的名字
9,Java的字节码一般是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。proguard在Android中的几种使用方法:
(1).指定不需要混淆的native方法与变量的proguard.flags文件
如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
(2). 制定编译的工程,不要使用代码混淆的工具进行代码混淆
如:LOCAL_PROGUARD_ENABLED := disabled
10, LOCAL_JNI_SHARED_LIBRARIES:
LOCAL_JNI_SHARED_LIBRARIES变量主要是用在JNI的编译中,如果你要在你的Java代码中引用JNI中的共享库*.so,此变量就是共享库的名字。
那么你要注意的一点是:在你的Project根目录下的Android.mk中要定义此变量用来引用你要使用的JNI中的共享库*.so。
定义了要包含的so库文件的名字,如果程序没有采用jni,不需要
LOCAL_JNI_SHARED_LIBRARIES := libxxx 这样在编译的时候,NDK自动会把这个libxxx打包进apk; 放在youapk/lib/目录下
LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)
11, include $(BUILD_PACKAGE)则是编译出一个apk,include $(BUILD_STATIC_JAVA_LIBRARY)则是编译出jar包。
# Use the following include to make our test apk.
include $(call all-makefiles-under, $(LOCAL_PATH))