刚刚大学毕业,正式开始了自己的第一份工作------Android开发工程师,也是一段新的学习之旅的开始,真心觉得有必要记录一下自己的所学。工作伊始,第一项任务就是Android系统的编译,(理科生,文学功底有限,尽量说明白^_^)。
一、Android编译系统
Android编译系统是Android源码的一部分,用于编译Android系统、SDK以及相关Android文档,包括Make文件、shell以及Python脚本组成,其中Make文件起主要作用
1.Make文件:
系统核心的Make文件:定义了Build系统的框架,文件全部位于路径/build/core,其他Make文件都是基于该框架编写的;
针对产品的Make文件:定义了具体某个型号手机的Make文件,文件路径位于/device,该目录下往往又以公司名和产品名划分两个子级目录,比如/device/qcom/msm8916;
针对模块的Make文件:整个系统分为各个独立的模块,每个模块都一个专门的Make文件,名称统一为”Android.mk”,该文件定义了当前模块的编译方式。Build系统会扫描整个源码树中名为”Android.mk”的问题,并执行相应模块的编译工作。
2.编译结果:
Android编译完成后,所有生成的文件都被放置在/out/目录下,一般包括host文件夹与target文件夹,具体内容自行参看。
3.Android.mk文件解析
Android源码将每个模块以单独文件夹的方式组织,在对应的模块文件夹下都包含一个Android.mk文件,那么Android.mk文件到底是什么呢?
一般mk文件中都包含以下两行:
LOCAL_PATH := $(call my-dir)//设置当编译路径为当前文件夹所在路径
include $(CLEAR_VARS)//清空编译环境的变量(由其他模块设置过的变量)
同时,在mk文件中还设置了一系列的编译时使用的环境变量:
LOCAL_SRC_FILES:当前模块包含的所有源码文件;
LOCAL_MODULE:当前模块的名称(具有唯一性);
LOCAL_PACKAGE_NAME:当前APK应用的名称(具有唯一性);
LOCAL_C_INCLUDES:C/C++所需的头文件路径;
LOCAL_STATIC_LIBRARIES:当前模块在静态链接时需要的库名;
LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库名;
LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库;
LOCAL_JAVA_LIBRARIES:当前模块依赖的Java共享库;
LOCAL_CERTIFICATE:签署当前应用的证书名称,比如platform。
LOCAL_MODULE_TAGS:当前模块所包含的标签,可以包含多标签,可能值为debgu,eng,user,development 或 optional(默认值)
4.编译步骤
1.执行source /build/envsetup.sh脚本,进行编译环境的预先设置(执行该文件后,一些build命令才可以使用)。
2.常用命令:
make:用于完整的Android源码的编译
m:用于从Android的根目录开始编译
mm:用于当前路径下所有模块的编译
mmm:用于Android单独一个模块的编译,常跟-B参数进行强制编译
make clean :清楚上一次编译产生的文件,避免对下一次编译造成影响