Android学习之旅

Android编译

2017-10-16  本文已影响0人  JJwhite

        刚刚大学毕业,正式开始了自己的第一份工作------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 :清楚上一次编译产生的文件,避免对下一次编译造成影响

上一篇下一篇

猜你喜欢

热点阅读