1. 概述

Android 编译系统是Android源码的一部分,在学习Android编译系统之前,可以参照使用AndroidStudio查看并调试Android源码 来搞定源码和编译环境

Android Build 系统用来编译 Android 系统,Android SDK 以及相关文档。该系统主要由 Make 文件,BP文件,Shell 脚本以及 Python 脚本组成,其中最主要的是 Make 文件和BP文件。

Build 系统中最主要的处理逻辑都在 Make 文件中,而其他的脚本文件只是起到一些辅助作用

整个 Build 系统中的 Make 文件可以分为三类:

  • 第一类是 Build 系统核心文件
    此类文件定义了整个 Build 系统的框架,而其他所有 Make 文件都是在这个框架的基础上编写出来的。Build 系统核心文件全部位于 aosp/build/core

  • 第二类是针对某个产品(一个产品可能是某个型号的手机或者平板电脑)的 Make 文件
    这些文件通常位于 device 目录下,该目录下又以公司名以及产品名分为两级目录,对于一个产品的定义通常需要一组文件,这些文件共同构成了对于这个产品的定义。

    如图device下的AAA代表公司名称,F16代表产品编号

  • 第三类是针对某个模块的 Make 文件。
    整个系统中,包含了大量的模块,每个模块都有一个专门的 Make 文件,这类文件的名称统一为“Android.mk”,该文件中定义了如何编译当前模块。Build 系统会在整个源码树中扫描名称为“Android.mk”的文件并根据其中的内容执行模块的编译。

2. 编译 Android 系统

关于源码的下载,编译和调试,可以查看:使用AndroidStudio查看并调试Android源码

核心的编译命令只有以下3句:

source build/envsetup.sh lunch XXXmake -j8

source build/envsetup.sh

命令 source build/envsetup.sh引入了 build/envsetup.sh脚本。该脚本的作用是初始化编译环境,并引入一些辅助的 Shell 函数,这其中就包括第二步使用 lunch 函数。
当我们执行过 source build/envsetup.sh 后可以使用 hmm命令来查看常用的一些命令的含义:

除此之外,该文件中还定义了其他一些常用的函数,这些函数分为以下几类

编译指令

命令 说明
m 在源码树的根目录执行编译
mm 编译当前路径下所有模块,但不包含依赖
mmm [module_path] 编译指定路径下所有模块,但不包含依赖
mma 编译当前路径下所有模块,且包含依赖(通常在第一次编译某个模块时,我们都会使用该命令)
mmma [module_path] 编译指定路径下所有模块,且包含依赖
make [module_name] 如果无参数,则表示编译整个Android代码

建议:首次编译时采用make/mma/mmma编译;当依赖模块已经编译过的情况,则使用mmm/mm编译

代码搜索

命令 说明
cgrep 在所有C/C++文件中执行搜索
jgrep 在所有Java文件中执行搜索
ggrep 在所有Gradle文件中执行搜索
mangerp 在所有AndroidManifest.xml文件中执行搜索
mgrep 在所有Android.mk文件中执行搜索
sepgrep 在所有sepolicy文件中执行搜索
resgrep 在所有res/*.xml文件中执行搜索
sgrep 在所有资源文件中执行搜索

上述指令用法最终实现方式都是基于grep指令,在当前路径下进行搜索的,各个指令用法格式:

xgrep [keyword]  //xgrep代表的是上表的各个搜索指令

例如想要搜索所以AndroidManifest中包含launcher3的位置:

mangrep launcher3

结果如图所示:

导航指令

命令 说明
croot 切换到Android根目录
cproj 切换到工程根目录
godir [filename] 跳转到包含某个文件的目录

这里需要注意的是cproj的原理是一层一层的执行cd ..直到找到Android.mk文件为止,所以如果你的项目是使用Android.bp文件作来编译的话,则这个指令会不好用.如图展示了成功和失败的情况:
成功:

失败:

可以看到DeskClock使用的是Android.bp 所以没法使用cproj来进行导航

信息查询

命令 说明
hmm 查询所有指令的help信息
findmakefile 查询当前目录所在工程的Android.mk文件路径(对Android.bp无效)
print_launch_menu 查询lunch的所有可选项
printconfig 查询各项编译变量值
gettop 查询Android源码的根目录
gettargetarch 获取TARGET_ARCH值

其他常用命令

  • make clean:执行清理操作,等价于 rm -rf out/
  • make update-api:更新API,在framework API改动后需执行该指令,Api记录在目录frameworks/base/api

更多相关文章

  1. Android启动界面优化技巧-Splash Screens的正确方式
  2. Android应用AsyncTask处理机制详解及源码分析
  3. android 识别U盘以及读写文件
  4. android SD卡学习3-读写文件
  5. 【原创】Android(安卓)引用第三方库文件大全
  6. Android(安卓)之 AsyncTask 异步任务
  7. Android下修改hosts文件
  8. Android原生(Native)C开发之一:环境搭建篇
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android不依赖Activity的全局悬浮窗实现
  2. 使用eclipse打开android_sdk自带的例子
  3. android之照相、相冊裁剪功能的实现过程
  4. Android(安卓)实现全屏显示的几种方法整
  5. Android(安卓)Theme的设置
  6. android中调试之日志
  7. android sdk setup时出现:Failed to fetc
  8. Android(安卓)XML解析
  9. Android不依赖Activity的全局悬浮窗实现
  10. Android图像开源视图:SmartImageView