常用Androd.mk文件语句解释-整理

==========
LOCAL_DEX_PREOPT := false  直接打包生成.apk 不会附带生成.odex文件了 
======================
LOCAL_PATH:= $(call my-dir)  
用于确定源码所在的目录,最好把它放在CLEAR_VARS变量引用的前面,因为它不会被清除,每个Android.mk只需要定义
一次即可,表示LOCAL_PATH的值为当前路径的值,用于返回当前路径
include $(CLEAR_VARS)   
它清空了很多以LOCAL_开头的变量(LOCAL_PATH除外)。由于所有的MakeFile都是在一个编译环境下执行的,因此
变量的定义理论上是全局的,在每个模块编译开始前进行清理工作是必要的。表示清空所有LOCAL_xxx的变量,不影响后面这些变量的使用
LOCAL_MODULE_TAGS := optional  表示该模块在所有版本下都编译
LOCAL_SRC_FILES := $(call all-subdir-java-files)   表示编译的源代码文件列表,添加所有的java 源文件
LOCAL_PACKAGE_NAME := jnisample   表示生成的apk的名称,即此例为jnisample.apk
LOCAL_JNI_SHARED_LIBRARIES := libtest   表示生成的so文件的名称,此例即为libtest.so
LOCAL_CERTIFICATE := platform 表示使应用获得系统权限,即可以在源码环境下编译类似于sharedUserId="android.uid.system"
include $(BUILD_PACKAGE)    每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束
include $(LOCAL_PATH)/jni/Android.mk   表示编译工程文件下面的jni/Android.mk文件
include $(call all-makefiles-under,$(LOCAL_PATH))   表示编译工程内的所有mk文件
======================================
LOCAL_MODULE 模块名,需保证在整个编译系统中是唯一存在的,而且中间不可以有空格。指定 拷贝后的apk的名字(全名),这个变量里可以有路径,但路径也会被拷贝,创建,如果 是在编译整个Android的源码,这个apk必须已经添加到了PRODUCT_PACKAGES 变量里,否则 不会拷贝到,相应的位置,
LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。
===========================
LOCAL_MODULE_PATH 指定拷贝的路径,如果路径不存在自己创建,模块的输出路径
LOCAL_MODULE_PATH := $(TARGET_PREINSTALL_APPS)  一般用于预置类中使用
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)
===========================
LOCAL_SRC_FILES 
模块编译过程中涉及到的源文件。如果是JAVA程序,可以考虑调用all-subdir-java-files来一次性添加目录(包括子目录)下所有的java文件
因为有LOCAL_PATH,这里只需要给出文件名(相对路径)即可;而且编译系统有比较强的推导功能,可以自动计算依赖关系。指定 源apk
===========================
LOCAL_MODULE_CLASS 指定文件类型,apk文件用APPS, 并且 会检查 是否是apk文件,动态库so文件用SHARED_LIBRARIES ,bin文件用EXECUTABLES,其他文件 用ETC
标识所编译模块最后放置的位置。ETC表示放置在/system/etc.目录下,APPS表示放置在/system/app目录下,SHARED_LIBRARIES表示放置在/system/lib目录下。如果具体指定,则编译的模块不会放到编译系统中,最后会在out对应product的obj目录下的对应目录中。
注意:若是被预置的apk里有so库,需要将从Test.apk的 so库拷贝到 out/target/product/xxx/system/lib/目录下,若无 so 库,则去掉此步;
方法一 只能针对 一个文件,方法二 可以 针对多个文件,但 只能 把 文件 拷贝到 system/lib/ 下,
Android提供了Prebuilt编译方法,两个文件prebuilt.mk和multi_prebuilt.mk,对应的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。
prebuilt.mk就是prebuilt的具体实现,它是针对独立一个文件的操作,multi_prebuilt.mk 可以针对多个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理。
===========================
LOCAL_PACKAGE_NAME := PartnerLayout  
 没有加LOCAL_PRIVILEGED_MODULE := true 就是默认在system/app里面
LOCAL_PRIVILEGED_MODULE := true 模块装入system/priv-app
===========================
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) 预置APK使得用户可以卸载,恢复出厂设置时不能恢复。指定拷贝的路径,如果路径不存在自己创建
===========================
LOCAL_CERTIFICATE := PRESIGNED 表示 这个apk已经签过名了,系统不需要再次 签名;
LOCAL_CERTIFICATE := platform
就代表使用platform来签名,这样的话这个apk就拥有了和system相同的签名,因为系统级别的签名也是使用的platform来签名,此时使用android:sharedUserId="android.uid.system"才有用!
===========================
LOCAL_MODULE_TAGS :=user eng tests optional
当前模块所包含的标签,一个模块可以包含多个标签。标签的值可能是eng、user、debug、development、optional。其中,optional是默认标签。
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
===========================
LOCAL_REQUIRED_MODULES := SoundRecorder  
//表示该模块需要SoundRecorder模块,在系统编译的时候就会将SoundRecorder放入到system.img中,如果单独编译mm的话就不会关心SoundRecorder
===========================
LOCAL_PROGUARD_FLAG_FILES := proguard.flags 和 proguard.flags文件 简单点说,proguard是用来做Java代码混淆的一个工具。比如,我们在 Android 的项目中使用了JNI,当使用了proguard后,会发现native方法有很多变量找不到,仔细分析后你会发现,原因是被progurad优化掉了。所以,我们建议在JNI应用中应该慎用progurad。
针对Android 选择user版本进行编译的时候,会出现proguard错误,我们需要知道的事情
1.proguard是做什么的,他的作用是将Java代码进行混淆的工具
2.因为proguard是混淆工具,所以android的mk文件也对其支持为两种方式:
  1.指定不需要混淆的native方法与变量的proguard.flags文件如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
2.制定编译的工程,不要使用代码混淆的工具进行代码混淆如:LOCAL_PROGUARD_ENABLED := disabled
  3.不设置,默认使用LOCAL_PROGUARD_ENABLED := full.即将该工程代码全部混淆
===========================
include $(call all-makefiles-under,$(LOCAL_PATH))
 如果当前目录下有文件需要编译,而且在当前目录下还有子目录,子目录中也有文件需要编译,那么当前目录下的Android.mk除了要包含编译当前目录下文件的语句,同样也要包含告诉编译器在编译完当前目录下的文件后,继续向子目录深入的语句。
=========
LOCAL_MODULE_STEM
表示编译链接后的目标文件的文件名,不带后缀
=========
LOCAL_JAVA_LIBRARIES 是添加的动态库,
LOCAL_STATIC_JAVA_LIBRARIES是添加的静态库(编译会以拷贝的方式加到需要他的应用中)
=======
LOCAL_OVERRIDES_PACKAGES需要说明一下,此变量可以使其他的模块不加入编译
如: 源码中DeskClock的android.mk有
LOCAL_OVERRIDES_PACKAGES := AlarmClock
使 AlarmClock不会加入到编译系统中,不会生成 AlarmClock.apk。
=========
my-dir:返回当前路径
all-java-files-under:获得指定目录及子目录一所有java文件
all-subdir-c-files:获得当前目录下及子目录下所有c文件
$(call all-Iaidl-files-under, <src>) 获取指定目录下的所有AIDL文件
$(call all-makefiles-under, <folder>) 获取指定目录下的所有Make文件
$(call intermediates-dir-for, <class>, <app_name>, <host or target>, <common?>) 获取Build输入的目标文件夹路径
===========
include $(BUILD_PACKAGE) 编译apk
---
include $(BUILD_PREBUILT) 预置apk
---
include $(BUILD_STATIC_JAVA_LIBRARY) 添加静态java库
---
include $(BUILD_EXECUTABLE)  
include $(call all-makefiles-under,$(LOCAL_PATH)) 编译生成可执行文件
---
include $(BUILD_SHARED_LIBRARY) 编译生成动态库
===========
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) 无源码只有apk 的客制化预置情况下用的 大概意思可能是就是Android的apk吧
LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
============
ifeq ($(TARGET_BUILD_VARIANT),user)
WITH_DEXPREOPT := true
DONT_DEXPREOPT_PREBUILTS := true
endif
这两个组合使用,可以使那些 prebuild的app不会被提前优化(pre-optimized),即就是那些在Android.mk中包含intclude $(BUILD_PREBUILT)的app都不会被提前优化
预编译的包是指那些在模块编译文件中指定为:include $(BUILD_PREBUILT) 的APK和JAR包等,这在升级包中占了一大部门; 
DONT_DEXPREOPT_PREBUILTS 变量就可以配置这部门代码是否进行预编译优化;
================
有源码的预置和没源码的预置,设置的内容不同


LOCAL_PACKAGE_NAME :=UserManual 有源码 放在packages/app下面编译时需要加,直译(创建APK的名称)
表示package的名字,这个名字在脚本中将标识这个app或package
======
LOCAL_DEX_PREOPT apk的odex优化开关,默认是false
======
LOCAL_CC 用于指定C编译器
LOCAL_CXX 用于指定C++编译器
LOCAL_CPP_EXTENSION 用于指定特殊的C++文件后缀名
LOCAL_CFLAGS C语言编译时的额外选项
LOCAL_CXXFLAGS C++语言编译时的额外选项
LOCAL_C_INCLUDE 编译C和C++程序所需要的额外头文件
LOCAL_STATIC_LIBRARIES 编译所需的静态库列表
LOCAL_SHARED_LIBRARIES 编译时所需要的动态库列表
LOCAL_JAVA_LIBRARIES 编译时所需要的JAVA类库
LOCAL_LDLIBS 编译时所需要的链接选项
======
BUILD_HOST_STATIC_LIBRARY
BUILD_HOST_SHARED_LIBRARY
BUILD_STATIC_LIBRARY
BUILD_RAW_STATIC-LIBRARY
BUILD_SHARED_LIBRARY
BUILD_EXECUTABLE
BUILD_RAW_EXECUTABLE
BUILD_HOST_EXECUTABLE
BUILD_PACKAGE
BUILD_HOST_PREBUILT
BUILD_PREBUILT
BUILD_MULTI_PREBUILT
BUILD_JAVA_LIBRARY
BUILD_STATIC_JAVA_LIBRARY
BUILD_HOST_JAVA_LIBRARY
BUILD_DROIDDOC
BUILD_COPY_HEADERS
BUILD_KEY_CHAR_MAP 各种形式的编译模板,如静态、动态库文件,可执行文件,文档等

猜你喜欢

转载自blog.csdn.net/u010672559/article/details/79960740
今日推荐