编译版本要求

基本安装环境

ubuntu 14.04 64

  1. sudo apt-get install git-core gnupg flex bison gperf build-essential \
  2. zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  3. lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
  4. libgl1-mesa-dev libxml2-utils xsltproc unzip

ubuntu 16.04 64

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

配置环境变量

  1. source build/envsetup.sh

设置编译选项

  1. lunch aosp_hammerhead-userdebug

编译

  1. make -j4

make失败或停止后,可以使用make -k 继续编译

运行模拟器

在编译完成之后,就可以通过以下命令运行Android虚拟机了,

命令如下:

  1. source build/envsetup.sh
  2. lunch(选择刚才你设置的目标版本,比如这里了我选择的是2
  3. emulator

如果你是在编译完后立刻运行虚拟机,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行虚拟机:

既然谈到了模拟器运行,这里我们顺便介绍模拟器运行所需要四个文件:

  1. Linux Kernel
  2. system.
  3. img
  4. userdate
  5. .img
  6. ramdisk.img

如果你在使用lunch命令时选择的是aosp_arm-eng,

那么在执行不带参数的emualtor命令时,Linux Kernel默认使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目录下的kernel-qemu文件

;而android镜像文件则是默认使用source/out/target/product/generic目录下的system.img,userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像文件.

上面我在使用lunch命令时选择的是aosp_arm64-eng,因此linux默认使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,

而其他文件则是使用的source/out/target/product/generic64目录下的system.img,userdata.img和ramdisk.img.

当然,emulator指令允许你通过参数制定使用不同的文件,具体用法可以通过emulator --help查看

模块编译

除了通过make命令编译可以整个android源码外,

Google也为我们提供了相应的命令来支持单独模块的编译.

编译环境初始化(即执行source build/envsetup.sh)之后,我们可以得到一些有用的指令,

除了上边用到的lunch,还有以下:

  1. - croot: Changes directory to the top of the tree.
  2. - m: Makes from the top of the tree.
  3. - mm: Builds all of the modules in the current directory.
  4. - mmm: Builds all of the modules in the supplied directories.
  5. - cgrep: Greps on all local C/C++ files.
  6. - jgrep: Greps on all local Java files.
  7. - resgrep: Greps on all local res/*.xml files.
  8. - godir: Go to the directory containing a file.

其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Launcher2模块,

执行指令:

mmm packages/apps/Launcher2/

稍等一会之后,

如果提示:

  1. ### make completed success fully ###

即表示编译完成,

此时在out/target/product/gereric/system/app就可以看到编译的Launcher2.apk文件了.

重新打包系统镜像

编译好指定模块后,如果我们想要将该模块对应的apk集成到系统镜像中,

需要借助make snod指令重新打包系统镜像,这样我们新生成的system.img中就包含了刚才编译的Launcher2模块了.

重启模拟器之后生效.

单独安装模块

我们在不断的修改某些模块,总不能每次编译完成后都要重新打包system.img

,然后重启手机吧?有没有什么简单的方法呢?

在编译完后,借助adb install命令直接将生成的apk文件安装到设备上即可,

相比使用make snod,会节省很多事件.

补充

我们简单的来介绍out/target/product/generic/system目录下的常用目录:

Android系统自带的apk文件都在out/target/product/generic/system/apk目录下;

一些可执行文件(比如C编译的执行),放在out/target/product/generic/system/bin目录下;

动态链接库放在out/target/product/generic/system/lib目录下;

硬件抽象层文件都放在out/targer/product/generic/system/lib/hw目录下.

SDK编译

如果你需要自己编译SDK使用,很简单,只需要执行命令make sdk即可.

编译fastboot adb

  1. make fastboot adb

BUILD

指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境.

其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统

是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架

构的处理器;此外,还有一些单词代表了特定的Nexus设备,下面是常用的设备代码和

编译目标,更多参考官方文档

  1. |受型号|设备代码|编译目标
  2. |Nexus 6P|angler|aosp_angler-userdebug|
  3. |Nexus 5X|bullhead|aosp_bullhead-userdebug|
  4. |Nexus 6|shamu|aosp_shamu-userdebug|
  5. |Nexus 5|hammerhead|aosp_hammerhead-userdebug|

BUILD TYPE

则指的是编译类型,通常有三种:

  1. -user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,
  2. 其权限是被限制的(如,没有root权限,不能dedug等)
  3. -userdebug:在user版本的基础上开放了root权限和debug权限.
  4. -eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),
  5. 此外还附带了许多debug工具

清除编译

  1. make clobber

理解 Android Build 系统

外部文档

编译Android源码的更多相关文章

  1. 在Mac mini上编译Android源码

    参考文章 1.Android 6.0 源代码编译实践 2.编译Android源码致命错误解决方案 实践过程 1.Mac下安装Ubuntu双系统 (1)Ubuntu版本:Ubuntu 15.10 注:实 ...

  2. [原]编译Android源码过程中遇到的问题

    编译Android源码的过程参考Android官网介绍: 1.下载Android源码的步骤:https://source.android.com/source/downloading.html 2.编 ...

  3. 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)

    2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...

  4. 一次编译Android源码实验

    注意,本文只供参考,是老文章 1.必要的软件环境 sudo apt-get install build-essential sudo apt-get install make sudo apt-get ...

  5. 【转】在Ubuntu下编译Android源码并运行Emulator

    原文网址:http://www.mcuos.com/thread-4553-1-1.html 建立编译环境 1.在VirtualBox上安装Ubuntu 2.安装JDK   $ sudo apt-ge ...

  6. 【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)

    原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编 ...

  7. Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决

    昨晚在编译源码,make一段时间之后报错如下: # A fatal error has been detected by the Java Runtime Environment: # # SIGSE ...

  8. wubi安装ubuntu后,增加swap大小,优化swap的使用参数-----------让ubuntu健步如飞,为编译android源码准备

    wubi安装ubuntu后,终端输入free -m可以查到如下信息: total used free shared buffers cached Mem: 1944 1801 143 0 557 70 ...

  9. Ubuntu编译Android源码过程中的空间不足解决方法

    Android源码一般几十G,就拿Android5.0来说,下载下来大概也有44G左右,和编译产生的文件以及Ubuntu系统占用的空间加起来,源码双倍的空间都不够有.编译源码前能分配足够的空间再好不过 ...

  10. 在ubuntu16.04上编译android源码【转】

    本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...

随机推荐

  1. 简单服务接口访问时权限以及缓存HashMap实现

    实现拦截器: package com.zqc.share.framework.interceptor; import javax.annotation.Resource; import javax.s ...

  2. Mac如何找到从AppStore下载的正版Xcode安装包

    前言:本文介绍在Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用,希望对大家有所帮助(前提:想要提取某个安装包,前提是你正在从AppStore安装这个程序.比如你想提取im ...

  3. eclipse自动提示功能没了的解决办法(转载)

    eclipse自动提示功能没了的解决办法 标签: eclipse联想 2012-08-09 14:32 24687人阅读 评论(7) 收藏 举报  分类: Android(38)  版权声明:本文为博 ...

  4. WebApi2跨域问题

    一.跨域问题产生的原因:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能. 现在所有支持JavaScript 的浏览器都会使用这个策略. 所谓同源是指,域 ...

  5. 从梯度下降到Fista

    前言: FISTA(A fast iterative shrinkage-thresholding algorithm)是一种快速的迭代阈值收缩算法(ISTA).FISTA和ISTA都是基于梯度下降的 ...

  6. JS组件系列——图片切换特效:简易抽奖系统

    前言:前两天在网上找组件,无意中发现了我们儿时游戏机效果的“SlotMachine组件”,浏览一遍下来,勾起了博主小时候满满的回忆.于是下定决定要研究下这么一个东西,不得不再次叹息开源社区的强大,原来 ...

  7. URLDecoder解析url编码

    try { strJson = URLDecoder.decode(strJson, "utf-8"); } catch (UnsupportedEncodingException ...

  8. python基础-文件操作

    一.文件操作 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ,只读模式[默认模式,文件必须存在,不存在则抛出异 ...

  9. yum

    yum repolist:列出所有可用repo grouplist:列出所有的包组 clean {all|packages|metadata|expire-cache|rpmdb|plugins} : ...

  10. web框架 之 Tornado

    初识 Tornado : tornado web server 是使用python编写出来的一个轻量级.高可伸缩性和非阻塞IO的Web服务器软件,其特点是采用epoll非阻塞IO,相应快速,可处理数千 ...