上篇文章讲述了如何下载Android源码,在篇文章就来说一说Android源码编译。其实一般来说如果修改的软件和底层没什么关系,直接提取相应的源代码到Android Studio编译就可以了,如果是与底层有关的,做练习的话还是应该编一个的。在公司里都会有相应的编译环境的,大多数都是进行过二次开发的的系统源代码。话不多说,编译不编译还是看自己需求。接下来就来分享下编译的过程吧:

前言:编译对硬件也是有要求的,Google官方文档的描述如下(这也是本文的处出发依据,可以快速看一眼,或者不看,直接看步骤):

  • 硬件要求:

    您的开发工作站必须达到或超出以下硬件要求:

    • 如果是 Gingerbread (2.3.x) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。

    • 如果是进行校验,至少需要 100GB 可用磁盘空间;如果是进行单次编译,至少需要 150GB 可用磁盘空间;如果是进行多次编译,至少需要 200GB 或更多可用磁盘空间。如果您使用 ccache,则需要更多空间。

    • 如果您在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。

  • 软件要求

    Android 开放源代码项目 (AOSP) master 分支历来是在 Ubuntu Long Term Support (LTS) 版本中进行开发和测试,但您也可以使用其他 Ubuntu 分发版本。要查看建议使用的版本,请参阅下面的列表。

    您的工作站必须具有下面列出的软件。要查看所需的其他程序包以及用于安装这些程序包的命令,请参阅构建编译环境。

    • 操作系统

      Android 通常是在 GNU/Linux 或 Mac OS 操作系统中进行编译。您也可以使用虚拟机在不支持的系统(例如 Windows)中编译 Android。
    • GNU/Linux
      • Android 6.0 (Marshmallow) - AOSP master:Ubuntu 14.04 (Trusty)
      • Android 2.3.x (Gingerbread) - Android 5.x (Lollipop):Ubuntu 12.04 (Precise)
      • Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu 10.04 (Lucid)
    • Mac OS (Intel/x86)
      • Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令行工具
      • Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具
      • Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的开发者工具)
      • Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK
    • Java 开发套件 (JDK)

      请注意,由于没有适用于 Ubuntu 14.04 的受支持 OpenJDK 8 程序包,因此您必须手动安装 Ubuntu 15.04 程序包。要查看具体说明,请参阅适用于 Ubuntu LTS 14.04 的 JDK。

      • AOSP 中 Android 的 master 分支:Ubuntu - OpenJDK 8;Mac OS - jdk 8u45 或更高版本
      • Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
      • Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6; Mac OS - Java JDK 6
      • Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5
    • 主要程序包
      • python.org 中提供的 Python 2.6 - 2.7
      • gnu.org 中提供的 GNU Make 3.81 - 3.82;对于 Android 3.2.x (Honeycomb) 及更低版本,则需要将 make 3.82 还原到较低版本,以避免出现编译错误
      • git-scm.com 中提供的 Git 1.7 或更高版本

以上是Google给出的要求文档,接下来是详细操作步骤。

  1. 在编译之前,需要做一些准备工作,为了确保编译能够顺利进行,我们需要做一些相应的配置:

    ①. 安装JDK,这个可以用JDK,也可以用Open JDK。不过需要注意一点,不同版本的源码,对JDK版本的要求也不一样,一般来说是高版本兼容低版本。在这是我们使用Open JDK。

    • 如果 Ubuntu >= 15.04,请运行以下命令:

      sudo apt-get update
      sudo apt-get install openjdk-8-jdk
    • 如果是 Ubuntu LTS 14.04

      目前没有适用于 Ubuntu 14.04 的受支持 OpenJDK 8 程序包。Ubuntu 15.04 OpenJDK 8 程序包能够在 Ubuntu 14.04 中成功使用。我们发现,按照以下说明操作时,更高的程序包版本(例如适合 15.10、16.04 的版本)在 Ubuntu 14.04 中无法正常工作。

      官方文档如是说,而我却没在其给的链接中找到open-jdk8,可以去openjdk.java.net自行下载安装。

    • 更新默认的 Java 版本 - 可选

      (可选)对于以上 Ubuntu 版本,您可以通过运行以下命令来更新默认的 Java 版本:

      sudo update-alternatives --config java
      sudo update-alternatives --config javac

    ②. 安装依赖库

    执行以下命令,安装编译所需的依赖库:

    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
    sudo apt-get install libc6-dev-i386
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
    sudo apt-get install lib32z-dev ccache

    ③. 安装GCC

    sudo apt-get install gcc

    ④. 更新所有库

    sudo apt-get update

    ⑤. 设置jack服务内存

    export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx6g"

    其中TieredCompilation为设置分层编译,Xmx6g是为JVM分配最大的堆内存。我电脑12G就制定了6G。

  2. 开始编译

    ①. 进入源代码目录

    cd ~/source

    ②. 设置环境

    source build/envsetup.sh 

    ③. 选择目标

    lunch

    lunch以后会有很多数字提示,选择需要的进行操作就可以了。

    ④. clean项目(如果之前有编译过,则需要调用这个命令,如果没有编译过则不需要)

    make clean

    ⑤. 开始编译(可以添加参数-jN,N代表用多少线程进行编译,根据CPU而定)

    make -j8

    然后就是无比漫长的等待了,最后编译完成,编译好的软件和相关的库文件都在out目录下,对什么感兴趣就可以去里面找了,。皆大欢喜,皆大欢喜。从下图可以看出,我的电脑编译了两个多小时:

编译完成以后就可以跑一跑了,把虚拟机开起来:

export ANDROID_PRODUCT_OUT=out/target/product/generic
export ANDROID_BIN=out/host/linux-x86/bin
PATH=$ANDROID_BIN:$PATH
source build/envsetup.sh
lunch aosp_arm-eng
emulator64-arm -gpu off -memory 2048

后话:Ubuntu自带的源,有时候下载软件会很慢,有时候会找不到软件。此时修改下国内源就好了。其详细步骤如下:

  • 备份Ubuntu自带的源

    sudo cp /etc/apt/sources.list /etc/apt/sources.list.old
  • 修改源文件

    sudo gedit /etc/apt/sources.list
  • 添加国内镜像地址

    deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
  • 更新数据源

    sudo apt-get update

    以上属于个人体验心得总结,若有不足之处,还望不吝赐教,欢迎批评指正,共同进步

Android_7.1.1_r6源码编译的更多相关文章

  1. Android_7.1.1_r6源码下载

    作为一名Android工程师,阅读Android源代码也是一门基本功,前段时间由于公司开发需要,便下载编译了Android_7.1.1_r6的源代码.在Windows下貌似是无法编译源代码的,为了以后 ...

  2. Android 源码编译之旅

    目录 前言 背景 安装软件 正文 Mac 分区 移动硬盘分区 Repo 下载源码 编译 源码导入 Android Studio 查看 碰到的问题 Could not find a supported ...

  3. Android 5.0源码编译问题

    如果是自己通过repo和git直接从google官网上download的源码,请忽略这个问题,但是由于google在国内被限制登录,通过这一种方法不是每个人都能download下来源码,通常的做法就是 ...

  4. Android stdio Apktool源码编译

    Android Apktool源码编译 标签(空格分隔): Android Apktool 源码编译 需求 习惯NetBeans调试smali需要用Apktool反编译apk,需要用-d的参数才能生成 ...

  5. SSH/SSL 源码编译安装简易操作说明

    环境:CentOS 6.7 安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复: 解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过). 当 ...

  6. Hadoop源码编译过程

    一.           为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...

  7. World Wind .NET源码编译问题处理

    World  Wind  .NET源码编译问题处理 下载了World_Wind_1.4.0_Source源码(http://worldwindcentral.com/wiki/NASA_World_W ...

  8. 源码编译安装 MySQL 5.5.x 实践

    1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...

  9. Linux 安装node.js ---- 源码编译的方式

    一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-release 2.检查 gcc.gcc-c++ 是否安装过 命令: rpm -q gcc rp ...

随机推荐

  1. 学到了林海峰,武沛齐讲的Day19 迭代细讲

    在家加1个月学了8day的课  出差6天看了8day的课..说明再忙也是可以挤挤多学习的. 广州出差最后两天没学习.一天做车,一天做公司的事...4天就过去了. 老师讲的包子和鸡蛋需求不好...讲的有 ...

  2. LOJ P10148 能量项链 题解

    Analysis 区间dp裸题,因为是环所以存两次 #include<iostream> #include<cstdio> #include<cstring> #i ...

  3. MySQL表结构,表空间,段,区,页,MVCC ,undo 事务槽

    索引组织表(IOT表):为什么引入索引组织表,好处在那里,组织结构特点是什么,如何创建,创建IOT的限制LIMIT. IOT是以索引的方式存储的表,表的记录存储在索引中,索引即是数据,索引的KEY为P ...

  4. 元素(element)创建

    一.元素创建的三种方式-------元素创建是为了提高用户的体验 1.第一种 document.write("标签代码及内容") <input type="butt ...

  5. 爬虫(十二):scrapy中spiders的用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...

  6. 视觉SLAM十四讲(三)——三维空间刚体运动(下)

    理论部分请看 :三维空间刚体运动 一.Eigen的使用 首先安装 Eigen: sudo apt-get install libeigen3-dev 一般都安装在 /usr/include/eigen ...

  7. hadoop2.9.2 调整jvm

    错误:namenode挂掉 查看hadoop的日志文件,发现存在大量的GC,导致namenode挂掉 命令行执行错误信息: 解决: 查看系统内存: # /data1/hadoop/hadoop/etc ...

  8. getLocation需要在app.json中声明permission字段,解决办法

    具体开发方法如下: 在 app.json 里面增加 permission 属性配置(小游戏需在game.json中配置): "permission": { "scope. ...

  9. Hive和Hadoop

    我最近研究了hive的相关技术,有点心得,这里和大家分享下. 首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将 ...

  10. Chrome接口调试工具

    网页接口测试工具开发背景 在web开发中,服务器端和客户端的开发和测试必不可少,但是测试的工作往往需要服务器端完成之后,客户端才能进行测试,这无疑延后了测试流程,导致服务器端开发完成后,无法进行充分的 ...