第4章 源代码的下裁和编译

使用环境

1.需要Ubuntu 64bit,建议Ubuntu14.04 64-bit

安装Rope

1.打开终端输入

$ makdir ~/bin
$ PATH=~/bin:$PATH

2.完成后输入以下命令

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

下载源码

1.建立android源码存放目录

$ mkdir AOSP
$ cd AOSP

2.初始化git信息

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

3.初始化源码信息

$ repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r11

4.同步下载

$ repo sync -j8

之前我们所做的搭建编译环境与下载Android源码,其实最终都是为了能够顺利的把Android源码编译出来。准备工作做好了以后,今天咱们就来把之前下载好的源码编译一下吧。

凡是有官方指导文档的,我一定都要去看一下。Google当然也会指导我们如何编译源码了,https://source.android.com/source/building-running.html这里就是官方文档了。如果你想做一个合格的程序员,那么养成看官方文档的习惯是很重要的,虽然可能看起来并不是很舒服,但这一定是最权威的。

选择一个分支

Android系统从发布到现在已经有了许多个大版本,至于小版本那就更多了,可能已经上百个了,你需要选择一个想要编译的分支。当然了,这一步我们实际上是在下载Android源码的时候就已经决定了,好吧,我这里选择的是Android 5.1.1_r8的分支。

初始化

在Android源码的根目录(如/home/username/Android5.1.1_r8)执行

1

$source build/envsetup.sh

1

$.build/envsetup.sh

这里是使用envsetup.sh脚本来初始化环境。可以使用一个点“.”来代替source,这样的话可以节约输入命令的时间,在文档中Google比较推荐用这种更加简洁的方式。

选择编译目标

这里使用lunch命令来选择一个编译的目标,所谓的编译目标,其实就是指最终生成的镜像要运行在什么样的设备上,单独输入lunch命令后再按tab键,系统就会显示出一共可以选择哪些设备:

其中,aosp代表Android Open Source Project——Android开源工程,实际上各个手机厂家就是利用aosp的代码,自己进行修改适配,其中比较重要的就是各个硬件的驱动的适配,然后再改一改Framework层,写一些自己的应用,就可以变成一个自己的手机“系统”了。第一个aosp_arm64-eng,arm代表这个选项的目标是arm架构的模拟器,64代表64位系统,eng代表engineer版本,也就是开发工程师的版本,包含一些debug的工具,方便调试。后缀为user代表这是可以用来正式发布到市场的版本,权限是被限制的(如没有root,没有debug),而userdebug版本则在user版本的基础上开放了root权限和debug的权限。

中间的字段,除了arm的,还有x86的——这个就顾名思义了跑在x86模拟器上的,而一些单词则实际上是Nexus设备的代号,如shamu代表了Nexus 6,hammerhead代表了Nexus 5等等。如果你没有这些设备,那么通常选择arm或者x86的模拟器版本,我手中有Nexus 5和6两部手机,而5已经成为我的开发测试机,所以我选择了hammerhead版本。

1

$lunch aosp_hammerhead-userdebug

看得出来,实际上这个lunch命令就是设定了一系列的环境变量。当然,如果你有兴趣的话,可以到build/envsetup.sh脚本里面看看lunch命令到底是怎么回事:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

functionlunch()

{

local answer

if["$1"];then

answer=$1

else

print_lunch_menu

echo-n"Which would you like? [aosp_arm-eng] "

readanswer

fi

local selection=

if[-z"$answer"]

then

selection=aosp_arm-eng

elif(echo-n$answer|grep-q-e"^[0-9][0-9]*$")

then

if[$answer-le${#LUNCH_MENU_CHOICES[@]}]

then

selection=${LUNCH_MENU_CHOICES[$(($answer-1))]}

fi

elif(echo-n$answer|grep-q-e"^[^\-][^\-]*-[^\-][^\-]*$")

then

selection=$answer

fi

if[-z"$selection"]

then

echo

echo"Invalid lunch combo: $answer"

return1

fi

export TARGET_BUILD_APPS=

local product=$(echo-n$selection|sed-e"s/-.*$//")

check_product$product

if[$?-ne0]

then

echo

echo"** Don‘t have a product spec for: ‘$product‘"

echo"** Do you have the right repo manifest?"

product=

fi

local variant=$(echo-n$selection|sed-e"s/^[^\-]*-//")

check_variant$variant

if[$?-ne0]

then

echo

echo"** Invalid variant: ‘$variant‘"

echo"** Must be one of ${VARIANT_CHOICES[@]}"

variant=

fi

if[-z"$product"-o-z"$variant"]

then

echo

return1

fi

export TARGET_PRODUCT=$product

export TARGET_BUILD_VARIANT=$variant

export TARGET_BUILD_TYPE=release

echo

set_stuff_for_environment

printconfig

}

如果你对shell脚本有一定的了解,那么应该就能看出来lunch命令到底是怎么回事了。

编译源码

在GNU中编译源码可以用-jN参数来决定使用多少线程,一般来说,如果你的电脑(或者服务器)是4个核心8个线程的cpu,那么就可以使用make -j16这样的命令来编译。N太小速度会比较慢,N太大远远超过线程数2倍的时候则没什么作用。在这里我的输入是:

1

$make-j16

这时候,编译就开始了。根据编译环境的性能不同,耗费的时间也是不一样的。一般来说,更先进的CPU、更快更大的内存以及是否有固态硬盘SSD这几个因素会有着决定性的影响。另外,更新的gcc编译器版本会对新一代cpu的指令有着更好的利用,效率会更高。通常Android源码的编译时间需要1个小时以上,如果要花费四五个小时甚至更久的朋友,需要考虑升级一下配置了。

如果之前的Java以及依赖包的安装比较顺利,那么这个编译过程通常也不会有什么问题。当然,凡事总会有意外,如果出现了什么错误,那就需要具体问题具体分析了。我这里很顺利的编译完成了,一共用了2个小时:

时间: 2024-12-27 23:31:11

第4章 源代码的下裁和编译的相关文章

Lua_第19章 String 库(下)

Lua_第19章 String 库(下) 19.3捕获(Captures) Capture(下面译为捕获或者capture,模式中捕获的概念指,使用临时变量来保存匹配的子模式,常用于 向前引用.)是这样一种机制:可以使用模式串的一部分匹配目标串的一部分.将你想捕 获的模式用圆括号括起来,就指定了一个capture.在 string.find 使用captures 的时候,函数会返回捕获的值作为额外的结果.这常被用 来将一个目标串拆分成多个: pair = "name =Anna" _,

Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记

Android深度探索(卷1)HAL与驱动开发 第四章 源代码的下载和编译 读书笔记     本章学习了使用git下载两套源代码并搭建两个开发环境.分别为Android源代码和Linux内核源代码.Android源代码中包含了HAL(即硬件抽象层) 的代码,并学习了如何搭建这两种开发环境. Android 的移植的本质就是Linux内核的移植,Linux内核的移植主要是Linux驱动的移植.而开发和测试Linux驱动就需要安装以上两个开发环境. 搭建两套环境的具体步骤如下: 一.下载编译和测试A

第四章源代码的下载和编译 心得体会

第四章源代码的下载和编译 心得体会 通过学习Android深度探索(卷1)HAL与驱动开发的第四章源代码的下载和编译,我知道了该操作的基本流程,也学习到了一些基本的操作命令. 一.初始环境搭建 1.安装JDK 2.安装编译工具 二.下载Android源码 3.创建工作目录 进入工作目录(比如works),创建bin目录: mkdir ~/works mkdir ~/works/android_dev cd ~/works/android_dev mkdir bin 4.安装repo版本管理工具(

第四章 源代码的下载和编译

Android移植主要就是Linux内核的移植,而Linux内核的移植主要是Linux驱动的移植.为了开发和测试Linux驱动,需在Ubuntu Linux下搭建两套开发环境:Android应用程序开发环境和Linux内核开发环境.需要对源代码进行下载和编译,由于Android源代码包含了很多东西,如内嵌在Android系统中的应用程序的源代码,Android SDK带的各种工具的源代码,Android NDK的源代码,以及HAL源代码,所以对Android源代码的下载.编译和测试过程比较复杂.

第四章 源代码的下载和编译 心得笔记

1.要用适应于Android的Linux内核. 2.配置Android源代码下载环境 1>创建一个用于存放下载脚本文件(repo)的目录 #mkdir ~/bin #PATH=~/bin:$PATH 2>下载repo脚本文件 #curl https://dl-ssl.google.com/dl/googlesourse/git-repo/repo > ~/bin/repo #chmod a+x ~/bin/repo 3>创建用于存放Android源代码的目录 #mkdir andr

Android学习心得(10) --- MAC下Android反编译(2)

我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 在前一章我们学习了基本的ndk-build脚本参数用法. 这一章再次学习一下反编译. 1.简介 这次分析的是一个很简单的程序,算是反编译入门的一个入门教程 主要学习一下工具的使用,下面是从网上下载下来的测试样本 测试样本EX_05_01_.apk 链接: http://pan.baidu.com/s/1sjOIXJn 密码: 5uq4 2.首先,使用dex2jar和jd-gui查看 参考:Android学习心得(8) --- M

ubuntu下使用Tesseract-ocr(编译、安装、使用、训练新的语言库)

本文前半部分是来自http://www.qisanfen.com/?p=185的一篇文章,主要讲了安装.训练的大致流程,注意如果需要训练语言库需要把所需要的库安装完整 后半部分大致是官方wiki的翻译版本 如果只安装,不训练,可以看我的另一篇比较简洁的文章http://blog.csdn.net/yimingsilence/article/details/51276138 关于训练的具体细节可以查看官方wiki : https://github.com/tesseract-ocr/tessera

windows下用vs2010编译ffmpeg

转载自;http://q1q2q3q4q5q6ln.blog.163.com/blog/static/500794332014666536283/ (注意:请务必先阅读:七,后记补充:) ffmpeg是一个开源的多媒体库,使用非常广泛.在linux下编译ffmpeg非常简单,而在Windows下编译就不是那么容易了.一般在windows下使用MinGW的gcc toolchain进行编译,这样的话,因为ffmpeg的导出函数均是C风格,因而gcc编译的lib可以被vs链接.但是gcc的debug

手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)

转自:http://www.th7.cn/Program/cp/201407/242762.shtml 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言开发的,不可避免的,libav源码使用了一些gcc的特性,那么在Windows下很难使用VC编译,但是使用MinGW编译却简单多了,下面我将根据自己的经历逐步介绍使用MinGW编译libav的过程以及在此过程中遇到的问题及其解决方法. 1      安装MinGW编译环境 1.1    安装MinG