下载完了源代码,终于到了编译的阶段了。这个阶段远比你想象的简单,一个make命令就可以完成源代码的编译了.参照下面的教程你就可以编译出适用于Android源代码树上的所有分支,包括master.基本的编译流程如下:

准备编译环境

用envsetup.sh(它在源代码根目录/build下面)脚本初始化环境,注意后面的lunch命令等都跟这一步有没有执行有关。如果没有执行后面会提示找不到lunch命令.注意将source替换成.省得打那么多字,并且这种简短的方式更常见于文档中。我们需要进到源代码的根目录下,运行下面其中一个命令。

$ source build/envsetup.sh

或者

$ . build/envsetup.sh

选择编译目标

用lunch命令选择编译目标.额外的配置可以用参数传递。比如下面的命令:

$ lunch aosp_arm-eng

它指的是一个适用于模拟器的完整编译版本,带编译的版本。

如果运行lunch的时候没有带任何参数,他就会弹出一个选择菜单.

Lunch menu... pick a combo:

1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. 省略一些选项...
17. aosp_angler-userdebug

所有的编译目标的格式都是:BUILD-BUILDTYPE,BUILD指的是指定特性的结合,

BUILDTYPE是下面列出的其中一个:

Buildtype 用途
user 有限的权限;适合一般用户
userdebug 类似user模式,但有root权限和debug能力,适合debug
eng 带有额外的debug工具的开发配置。

如果你只是想编译出一个可以运行的版本看看效果,那么可以直接运行lunch aosp_arm-eng,比如我有一个Nexus 6p的真机,我就可以运行 lunch aosp_angler-userdebug.

注意:执行lunch命令的时候,弹出Can not find SDK 10.6错误,具体的解决方法见Android编译过程中的碎碎念.

更多关于编译和真机运行的内容,看 Running Builds.

编译代码

用make编译所有东西.GNU make 可以使用-jN参数并行地处理,并且他一般用CPU线程数的1~2倍进行编译.比如在一个dual-E5520机器上(2 CPU,每个CPU 4核,每个核2线程),那么想让编译速度最大化就可以用make -j16或者make -j32.

$ make -j4

等待编译完成后,会产生一些txt、img文件,android-info.txt、cache.imgramdisk-recovery.img、recovery.img、userdata.img

boot.img、ramdisk.img 、system.img。这些文件跟后面烧录的过程有关,非常重要.一般他们在源代码路径下的out文件夹中。比如我之前输入lunch aosp_angler-userdebug,那么就会生成在 “源代码根目录/out/debug/target/product/angler”,你也可以用源代码根目录下输入 find . -name system.img查找.

![Uploading Snip20160214_7_020290.png . . .]

开始运行!

你可以直接在模拟器上运行或者将他烧录到一个设备上。要注意之前已经用lunch选择了特定的设备,不然他就很可能不能运行不同的编译目标上。

运行模拟器

如果在选择编译目标那一步选择的是lunch aosp_arm-eng.那么这时候就可以直接输入emulator命令来运行模拟器了(emulator命令在编译过程中会自动添加到Path路径下)

$ emulator

刷机

如果在选择编译目标那步选择了跟特定机型有关的编译选项,比如Nexus 6P,那么就需要烧录到设备上.

进入fastboot模式

为了烧录到设备上,你需要使用fastboot,在成功编译后他就会在path路径下。把设备弄到fastboot模式下,要嘛手动按特定的组合键(对于Nexus系列可以参考这里),要嘛使用命令行如下:

$ adb reboot bootloader

解锁bootloader

如果你的机器是第一次采用fastboot进行刷机,那么还需要运行下面的命令(要在fastboot模式下)进行bootloader解锁.bootloader默认是锁住的.bootloader只需要解锁一次,解锁后就不需要再解锁了.

解锁命令跟fastboot的版本有关,你可以运行fastboot不加参数,它会弹出明星提示,看看具体是哪个,按照我的经验:

版本 命令
在Nexus 5x、Nexus 6p之前的机器上运行 fastboot oem unlock
Nexus 5x、Nexus 6p fastboot flashing unlock

一旦设备进入fastboot模式, 先进入到产生的img文件目录下(一般在源代码根目录下面,你可以搜索),运行

$ fastboot flashall -w

-w 选项清空设备上的/data分区,在第一次烧录的时候很有必要,但其他时候就不是必须的.

你可能会好奇,一般不都使用rom文件(一个zip包)进行刷机吗,这时候怎么就直接通过这个命令就行了?

是的,更具体的解释可以见Android编译过程中的碎碎念.

更多关于编译和运行在真实设备上的东西,请查看running builds.

这时候所有的工作就完成了.

编译Android AOSP代码的更多相关文章

  1. Ubentu编译Android源码(AOSP)

    前言: 一直想要编译一下Android 源码,之前去google 看,下载要下载repo. 当时很懵逼,repo 是个什么?(repo 是一个python 脚本,因为Android 源码git 仓库太 ...

  2. Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机

    Android源码浅析(三)--Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机 最近比较忙,而且又要维护自己的博客,视频和公众号,也就没 ...

  3. Android 程序分析环境搭建-Android 9 -代码下载编译

    Android 9 -代码下载编译 一,翻墙下载: 1.背景: 背景: 现在Android framework 开发的同学,整体在公司里面解一些无关痛痒的bug,对于Android framework ...

  4. user模式下编译android 代码被proguard优化导致类和变量丢失

    在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了.所以,在JNI应用中该慎用progurad啊. 解决办法: 1.在An ...

  5. Android开发:APK的反编译(获取代码和资源文件)

    一.反编译工具: 1.APKTool: APKTool是由GOOGLE提供的APK编译工具,能够完成反编译及回编译apk的工作.同时,它也有着安装反编译系统apk所需要的framework-res框架 ...

  6. Android - 使用JD-GUI反编译Android代码

    使用JD-GUI反编译Android代码 本文地址: http://blog.csdn.net/caroline_wendy Android程序出现Bug时,须要依据Bug寻找问题出错的地方; 须要使 ...

  7. 【FAQ】Ubuntu环境下ant编译android代码问题

    在Ubuntu14.04环境下,编译android程序时候,运行ant debug的时候出现如下异常:

  8. 在Mac mini上编译Android源码

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

  9. [转]编译Android源代码常见错误解决办法

    1. 编译时出现/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when ...

随机推荐

  1. 远程登录VirtualBox虚拟机Linux

    通过端口转发的方式,使用终端(如MobaXterm,Xshell,putty等终端)远程登录本机虚拟机Linux, 打开虚拟机,找到 [设置]-->[网络]--> [网卡1] 确认以下设置 ...

  2. XOR Swap

    swap(a, b): a ^= b b ^= a a ^= b 先明确一下,a ^ a = 0,同时对于一切数x ^ 0 = x 可以这样理解,第三行: b ^= a b ^= a ^ b b = ...

  3. Centos7中安装Mysql及配置

    CentOS 7 安装 MySQL 首先检查 MySQL 是否已安装 yum list installed | grep mysql 如果有的话 就全部卸载 yum -y remove +数据库名称 ...

  4. Android中轻松显示Gif图片

    android中现在没有直接显示gif的view,只能通过mediaplay来显示,且还常常不能正常显示出来,为此写了这个gifview,其用法和imageview一样使用方法:1-把GifView. ...

  5. Redis——学习之路二(初识redis服务器命令)

    上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息   s ...

  6. iOS 真机测试时报错:Provisioning profile "iOS Team Provisioning Profile: XXX” doesn't include the currently selected device “XXX”.

    这几天因工作需要,去给客户演示iOS项目打包的过程.之前演示都是顺利的,但后来客户自己操作时打电话说遇到了问题,出现报错. 就过去看了一下,发现一个很陌生的错误提示: The operation co ...

  7. oracle(sql)基础篇系列(四)——数字字典、索引、序列、三范式

      数字字典表 --查看当前用户下面有哪些张表 select * from user_tables; select table_name from user_tables;   --查看当前用户下面有 ...

  8. Logback配置连接

    logback 简介 logback 常用配置详解(一)<configuration> and <logger> logback 常用配置详解(二)<appender&g ...

  9. 【C++设计模式】单件类与DCLP(Double Check Lock Pattern)的风险

    [单件类] 保证只能有一个实例化对象,并提供全局的访问入口. [设计注意事项] 1.阻止所有实例化的方法: private 修饰构造函数,赋值构造函数,赋值拷贝函数. 2.定义单实例化对象的方法: a ...

  10. SilverLight抛出 System.InvalidOperationException: 超出了2083 的最大URI

    在SilverLight中对于抛出 System.InvalidOperationException: 超出了 2083 的最大 URI 长度 的异常 处理 其实很简单 在 EntityFramewo ...