前文主要讲解了 Android 编译环境的搭建,接下来我们正式开始 Android 源代码的编译,主要涉及两部分内容:源代码的下载和源代码编译。

一、Android源代码下载

1)      配置 Git 信息

将自己的姓名和邮箱信息配置到 Git 中,如果要使用 Gerrit 代码审查工具,邮箱必须是 Google 账号。[1]

$ git config --global user.name "你的姓名"
$ git config --global user.email "你的邮箱"

2)      安装 Repo

Android 源代码非常庞大,通过 Git 版本管理工具分成了 art、bionic、dalvik、frameworks 等多个代码仓库,如果分别使用 Git 逐个获取代码显示很麻烦,而 Repo 就是一个用来统一管理这些代码仓库的 Python 脚本工具,通过它可以很方便地同步 Android 源代码。

使用 curl 工具下载 Repo 脚本文件并更改运行权限

$ mkdir ~/bin
$ PATH=~/bin:$PATH[2]
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

3)      创建源代码存放目录

创建 Android 源代码存放目录,如果是在 Mac 操作系统上,该目录需要大小写敏感的文件系统中创建,请参考前文讲解的创建大小写敏感的磁盘映像一节内容。

$ mkdir mydroid
$ cd mydroid

4)      初始化 Repo 工作目录

      执行以下命令下载最新 Android 源代码的 manifest 信息,默认下载的是 master 分支,如果要下载其它分支的信息,需要指定 -b 参数,以下命令所示是下载最新的 android-7.1.1_r6分支[3]。初始化完成后即在当前目录自动创建 .repo 目录,里面已经包含所有必需的信息。

$ repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r6

5)      最后执行以下命令即可开始下载 Android 的源代码

$ repo sync

      Android 的整个源代码超过 50G,下载过程非常漫长。另外,由于国人都知道的原因,以上过程必须配置代理服务器。

二、Android源代码编译

Android 源代码下载完成后,即可开始编译。如果需要移植,则需要进行很多设置和修改。但如果只是搭建一个模拟环境,编译时,只需保持默认设置即可。进入 Android 源代码所在的目录,按照以下的步骤即可开始编译。

1)      初始化编译环境

$ source build/envsetup.sh

或者将 source 用 . 代替也可以

$ . build/envsetup.sh

2)      选择目标配置

编译配置的类型说明如下:

类型 目的
user 生产版本,具有有限的访问权限
userdebug 调试版本,和生产版本类似,但具有 root 权限和可调试性
eng 开发版本,带有额外的调试工具

市面大多数手机都采用 arm 架构,如果希望编译后的 img 文件可以刷到手机上,需要使用带 arm 标识的配置,如下

$ lunch aosp_arm-eng

      笔者后续将讲解如何用模拟器加载编译生成的 img 文件,并使用 HAX(Intel Hardware Accelerated Execution)[4]加速模拟器运行,所以此处使用 x86的配置

lunch aosp_x86_64-eng

3)      开始编译

直接执行 make 命令即可开始编译,make 命令后面的 -jN 表示启用多少个并行任务同时进行编译

$ make -j4

在笔者的编译环境下,编译结果如下图所示。

第一次完整编译会非常耗时,笔者使用的是 Mac 系统、i7的CPU、8G的内存、固态硬盘,但仍然用了3个多小时。后续如果对源代码做一些修改,因为使用了前面的一些编译结果,再次编译的时间就不会这么长。如果要确保修改的结果会被编译进去,可以使用以下命令将前面的编译结果全部清除,但再次编译又需要经历漫长的等待。

$ make clobber

Android 源代码编译的产物中最重要的是三个镜像文件,它们都位于 /out/target/product/<product_name>/ 目录下,分别是:

  • system.img:包含了 Android OS 的系统文件、库、可执行文件以及预置的应用程序,将被挂载为根分区。
  • ramdisk.img:在启动时将被 Linux 内核挂载为只读分区,它包含了 /init 文件和一些配置文件。它用来挂载其他系统镜像并启动 init 进程。
  • userdata.img:将被挂载为 /data,包含了应用程序相关的数据以及和用户相关的数据。

[1] Git 的配置信息可在 ~/.gitconfig 文件中看到。

[2] 此处设置只对当前的终端窗口有效,如想长期有效,在 Mac 系统上需在 ~/.bash_profile 中设置,而 Ubuntu 系统则需在 ~/.bashrc 中设置。

[3] Android 源代码的标签和分支信息可在以下网址查看:http://source.android.com/source/build-numbers.html#source-code-tags-and-builds

[4] Intel 公司开发的一种硬件辅助虚拟化引擎技术,可以缩短 Android 模拟器的启动时间,笔者新试使用前和使用后的启动时间大概从5分钟缩短到30秒,效果非常明显。

转载于:https://my.oschina.net/u/660323/blog/806487

鸟人的Android揭秘(4)——Android 源代码编译相关推荐

  1. 鸟人的Android揭秘(3)——Android 编译环境搭建

    一.主机环境要求 要顺利编译 Android 源代码,硬件环境和操作系统都必须满足一定的条件.官方推荐的硬件环境配置是: 编译 Gingerbread(2.3.x)及后续版本必须使用64位系统 需至少 ...

  2. Android手机mm开头的大文件,[2018年最新整理]2Android源代码编译命令m和mm和mmm以及make分析.doc...

    [2018年最新整理]2Android源代码编译命令m和mm和mmm以及make分析 老罗的新浪微博:/shengyangluo,欢迎关注! 在前文中,我们分析了Android编译环境的初始化过程.A ...

  3. Android 系统编译环境设置及源代码编译

    一. 摘要    虽然已经在Android系统工作了一段时间, 但是每次需要重新setup环境的时候,都需要花一点时间, 所以就想借着这次在ubuntu 12.04 64bits系统上重新安装的机会, ...

  4. Android源代码编译的准备工作

    本文的主要内容是解决在Android源代码的编译过程中出现的各种问题. 大家都知道,Android是开源的,可以在Android Open Source Project(点击打开链接)下载.下载的流程 ...

  5. Android源代码编译原理与前期准备

    本文的主要内容是解决在Android源代码的编译过程中出现的各种问题. 大家都知道,Android是开源的,可以在Android Open Source Project(点击打开链接)下载.下载的流程 ...

  6. 鸟人的Android揭秘(5)——搭建Android SDK开发环境(一)

    前面已经完整讲解了Android平台的构成,以及从Git服务器下载源代码并进行编译的内容.接下来讲解如何搭建Android SDK开发环境,包括Android Studio.Sublime.Andro ...

  7. 鸟人的Android揭秘(7)——搭建Android SDK开发环境(三)

    前文已经讲解了Android源代码开发环境的搭建,以及如何使用模拟器加载源代码编译结果,但在开发过程中,无论是为了更地理解代码的运行机制,还是为了找出代码的Bug,都会涉及对代码的调试问题.接下来我们 ...

  8. Android源代码编译命令m/mm/mmm/make分析

    Android源代码编译命令m/mm/mmm/make分析 2014-03-10     我来说两句    来源:Android源代码编译命令m/mm/mmm/make分析   收藏    我要投稿 ...

  9. Android10.0 系统解析(02)——搭建Android源代码编译调试环境

    1.前言 Android的编译环境作为深入学习Android的基础,不可或缺,能够完整下载Android源代码并编译成功,对深入学习Android是非常关键和重要的一步.Android环境搭建比较繁琐 ...

最新文章

  1. Failed to install VS Code update.
  2. RISC-V应用创新大赛开放报名啦!
  3. python 加密解密_python加密解密
  4. 使用MAT工具分析内存溢出
  5. iso8601 转换 java_java积累----ISO8601格式时间转化为Datetime类型
  6. pdd本质上来说,没有什么壁垒
  7. 3d建模电脑配置要求_2019年3d设计渲染电脑配置推荐
  8. MongoDB3.4为单独的数据库创建用户
  9. Linux 的 Out-of-Memory (OOM) Killer
  10. java中如何获取当前文件的物理路径?
  11. vmware esxi 4.0 上安装postfix,mailx发送邮件
  12. web安全day10:通过实验理解windows域的OU和GPO
  13. Android网络视频播放器DEMO
  14. 页眉怎样从特定的一页开始以及word页眉页脚第几页共几页格式设置
  15. 【Java】Java基础之Lambda表达式和Stream流
  16. 【深度学习Faster-RCNN】深刻解读Faster R-CNN
  17. 基于涂鸦智能开发的墨水屏座位管理器——2.嵌入式功能实现篇
  18. RabbitMQ高级特性-惰性队列
  19. 云管平台监控实践分享
  20. 一文了解DCC-GARCH模型

热门文章

  1. signature=07da782715954d48aa05e9d49faf92a9,ndls-20201029
  2. python输出一个函数多项式_python实现PolynomialFeatures多项式的方法
  3. api接口文档编辑工具-YApi安装部署(window版)
  4. 全志F133(D1s)芯片 如何在Tina下进行显示旋转?
  5. iOS中定位以及地图的使用
  6. terminate called without an active exception
  7. 用python整个活(2)——用numpy做一个蜘蛛纸牌
  8. 【Javascript】【DOM】ready和onLoad区别
  9. 禁止 mysql nobody_linux中nobody账号的相关解释
  10. Qt之流式布局(FlowLayout)