编译Android源码

关于android系统的编译,Android的官方网站上也给出了详细的说明。

http://source.android.com/source/building.html

Ø  初始化编译环境

切换到Android源码目录:

$ cd WORKING_DIRECTORY

执行下面命令,加载编译过程中用到的命令、环境变量:

$ source build/envsetup.sh

Ø  选择编译选项

执行下面的命令,从列表中选择一个编译项:

$ lunch
You're building on LinuxLunch menu... pick a combo:1. full-eng2.full_x86-eng3.vbox_x86-eng4.full_maguro-userdebug5.full_tuna-userdebug6.full_panda-eng

我们选择:1,也就是说,编译full-eng的目标,当然我们也可以直接指定编译项,如下:

$ lunch full-eng

其中,lunch命令是指打印或设置出当前系统中设置的编译项,full-eng这个编译项由两部分组成,其中前半部分full表示目标设备为Android的模拟器,官方解释为:fully configured with all languages,apps, input methods,全部的应用程序及语言,输入法等。后半部分eng表示带有调试功能的工程机。

lunch命令打印全部的信息,如下表所示:

Build name

Device

Notes

full

emulator

fully configured with all languages, apps, input methods

full_maguro

maguro

full build running on Galaxy Nexus GSM/HSPA+ ("maguro")

full_panda

panda

full build running on PandaBoard ("panda")

Buildtype

Use

user

limited access; suited for production

userdebug

like "user" but with root access and debuggability; preferred for debugging

eng

development configuration with additional debugging tools

Ø  编译前的准备

由于我们使用ubuntu12.04对Android进行编译,Android对Ubuntu12.04的编译平台的支持不是很推荐,有些库的兼容方面会有一些问题,在编译过程中会产生一些错误,我们要进行一些修正。

错误信息:

g++ selected multilib '32' not installed

<command-line>:0:0: error:"_FORTIFY_SOURCE" redefined [-Werror]<built-in>:0:0: note: this is thelocation of the previous definitioncc1plus: all warnings being treated aserrors
make: ***[out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

原因:

在Android系统过程中,要使用gcc-4.4/g++-4.4的编译器,而Ubuntu12.04的gcc版本为4.6.3

解决方法:

安装gcc-4.4

$sudo apt-get install gcc-4.4
$sudo apt-get install g++-4.4

进入到/usr/bin目录下,删除gcc对gcc-4.6的链接,创建到新安装的gcc-4.4的链接:

$cd /usr/bin
$sudo rm -r gcc
$sudo ln -s gcc-4.4 gcc

验证结果:

$gcc -v
$g++ -v

打印其版本为gcc-4.4x、g++-4.4x即可。

Ø  编译源码

输入下面命令开始编译:

$ make -jn

其中,-jn表示,n个线程同时编译,一般n的值为CPU核的2倍,但是,也要和你的Ubuntu的内存有关系,每个线程在编译时最少需要1G内存,如果你没有很多内存,还是直接使用make命令吧,否则,编译到后面会出错。

这个过程,如果是虚拟机的话,至少要4个多小时,如果是实体机的话,要看配置,一般在1个小时以上。

编译成功结果如下图所示:

编译goldfish内核源码

编译Linux源码必然要先指定gcc交叉编译器,我们直接使用Android自带的arm-eabi-4.4.3编译器,它在WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin路径下。

$ ls WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

我们编译下面一个编译脚本make_zImage.sh,让这个脚本去编译goldfish的内核:

#!/bin/bashexport PATH=/home/farsight/andorid/android4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make goldfish_armv7_defconfig
make

给make_zImage.sh添加可执行权限,然后执行该编译脚本:

$ chmod a+x make_zImage.sh
$ ./make_zImage.sh

当我们看到下面的结果时,表示goldfish的内核编译出来了:

4.    Android编译过程分析

如果想要了解,Android的编译过程,可以参照下面三篇博文:

Android编译系统详解(一):http:/blog.csdn.net/mr_raptor/article/details/7539978

Android编译系统详解(二):http://blog.csdn.net/mr_raptor/article/details/7540066

Android编译系统详解(三):http:/blog.csdn.net/mr_raptor/article/details/7540730

按照google给出的编译步骤如下:

1> source build/envsetup.sh:加载命令

2> lunch:选择目标平台编译选项

3> make:执行编译

我们按照编译步骤来分析编译过程的细节,最终添加自己的平台产品的编译选项。

4.1 source build/envsetup.sh

该命令是用来将envsetup.sh里的所有用到的命令加载到环境变量里去。主要几个命令如下:

function help()                                                                                #显示帮助信息
function check_product()                                           # 检查product
function check_variant()                                             # 检查变量
function printconfig()                                                                    #打印配置
function add_lunch_combo()                                    # 添加lunch项目
function print_lunch_menu()                                    # 打印lunch列表
function lunch()                                                                              #配置lunch
function m()                                                                                     #make from top
function mm()                                                                                 #make from current directory
function mmm()                                                                              #make the supplied directories

build/envsetup.sh其主要作用如下:

ü  加载了编译时使用到的函数命令,如:help,lunch,m,mm,mmm等

ü  添加了两个编译选项:generic-eng和simulator,这两个选项是系统默认选项

ü  查找vendor/*/*/vendorsetup.sh和device/*/*/vendorsetup.sh,也就是说从vendor/<厂商目录>/<平台设备目录>/目录和device/<厂商目录>/<平台设备目录>/目录下,查找vendorsetup.sh,如果找到的话,加载执行它,添加厂商自定义产品的编译选项。

如果想要添加自己的目标设备编译选项,我们就要在device或vendor目录下创建设备厂商,然后在设备厂商目录下,创建一个vendorsetup.sh文件,在里面添加上自己的编译项。

$mkdir -p device/farsight/fsdevice
$touch device/farsight/fsdevice/vendorsetup.sh
$echo "add_lunch_combo fs100-eng" > device/farsight/fsdevice/vendorsetup.sh

注:

                  farsight:厂商名

                  fsdevice:平台设备名

                  fs100-eng:自定义的目标产品名为fs100,eng为编译目标类型

所有的编译项的格式都是:设备名-编译目标类型,编译目标类型为:eng,user,userdebug,三种类型之一(详细见3.1节)。

下面验证一下我们的结果,当在Android目录下,再次执行source build/envsetup.sh时,我们可以看到我们新添加的编译项:

4.2执行lunch full-eng

我们当然也可以直接执行lunch命令,然后在弹出菜单里面来选择我们的编译项,如下图所示:

注:我们添加的编译项这时已经存在了,但是如果你选择了它,在编译时会出错,因为我们还没有对应编译项的配置文件。

lunch命令可以带参数和不带参数,最终导出一些重要的环境变量,从而影响编译系统的编译结果。导出的变量如下(以lunch full-eng为例):

TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release

4.3执行make命令

当我们输入make命令后,就开始android系统的编译了,所有的Makefile都通过build/core/main.mk这个文件组织在一起,它定义了一个默认goals:droid,当我们在TOP目录下,敲make实际上就等同于我们执行make droid。

当make include所有的文件,完成对所有make文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。其中,config.mk,envsetup.mk,product_config.mk文件是编译用户指定平台系统的关键文件。Android的编译系统比较复杂,详细的说明请参照前面给出博文内容。

下面列出在编译过程中经常使用的一些命令:

source build/envsetup.sh:加载编译命令,产生编译选项
lunch或lunch xxx-yyy:打印编译选项菜单或指定编译选项,xxx表示产品,yyy表示编译类型
make:根据lunch选项,编译Android系统,最后产出为:system.img,ramdisk.img,userdate.img
m:和make命令一样
mm:从当前目录下开始向下编译目标
mmm:指定一个目录,仅编译指定目录下的目标
make snod:只将out/target/product/XXX/system/目录下的内容打包生成system.img,不会检查依赖关系
make bootimage:只将out/target/product/XXX/root/目录下的内容打包生成ramdisk.img

深入浅出 - Android系统移植与平台开发(二) - 准备Android开发环境相关推荐

  1. Android系统移植与调试之-------如何修改Android设备添加重启、飞行模式、静音模式等功能(一)...

    1.首先先来看一下修改前后的效果对比图 修改之后的图片 确认重启界面 具体的修改内容在下一篇中具体介绍. Android系统移植与调试之------->如何修改Android设备添加重启.飞行模 ...

  2. 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM

    作者:唐老师,华清远见嵌入式学院讲师. 一. 修改化定制Android4.0系统 Android系统启动时,先加载Linux内核,在Linux的framebuffer驱动里可以定制开机界面,Linux ...

  3. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)...

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  4. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  5. 深入浅出 - Android系统移植与平台开发(一)

    +-------------------------------------------------+ +      本系列为连载,不定期会更新       + +------------------ ...

  6. 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速【转】

    本文转载自:http://blog.csdn.net/mr_raptor/article/details/8006721 Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速 ...

  7. 深入浅出 - Android系统移植与平台开发(十三)- Android的对象管理

    第六章.Android的对象管理 在Java中,不再使用的对象会通过gc机制来自己主动回收.而Android系统执行时库层代码是由C++编写的,在C++中创建的对象通常使用指针来操作,一旦使用不当.轻 ...

  8. Android系统移植与调试之如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关

    转自:[http://blog.csdn.net/ouyang_peng] http://blog.csdn.net/qq446282412/article/details/49815865 今天有个 ...

  9. Android系统移植与调试之-------)如何修改Android手机NFC模块,使黑屏时候能够使用NFC

    我们都知道在不修改源代码的情况下,只能是解锁之后才能使用NFC功能.而在锁屏和黑屏2个状态下是没办法用NFC的,但是最近有个客户要求手机在黑屏状态下能够使用NFC,因此我们需要去修改Android源代 ...

最新文章

  1. AI时代,谈数据分析时我们要谈些什么?
  2. pptp client
  3. 深入理解Java中的抽象类和接口
  4. 等值连接_sql高阶教程:非等值自连接
  5. java限制发送短信次数_使用java发送短信验证码码,出现流量限制怎么办?急急急...
  6. 电机与拖动,直流发电机实验,江南大学物联网自动化
  7. 怎么实现两周联动加减速_LOL:野辅联动成版本主旋律,三大辅助对线游走兼备...
  8. kodi 自动升级_如何设置您的Kodi库以自动更新
  9. 【机器学习实战】利用朴素贝叶斯算法(naive_bayes)实现新闻分类
  10. python切片负数_Python切片
  11. 龙果支付 mysql_龙果支付系统怎么搭建与部署?
  12. 论文精读及分析:Fully Convolutional Networks for Semantic Segmentation
  13. three.js 控制动画进度 进度条拖拽控制
  14. Biaofun分享给你什么是文案?
  15. verilog中的initial语句
  16. 算法还是算力?一篇微博引爆深度学习的“鸡生蛋,蛋生鸡”问题
  17. java模拟cpu返回_Java CPU 占用高 模拟及排查
  18. 深入理解Spark RDD——RDD实现的初次分析
  19. uniapp微信小程序富文本编辑器组件
  20. macOS 系统向日葵远程控制鼠标无法点击的问题

热门文章

  1. win11本地安装docker
  2. stm32驱动微雪墨水屏1.54inch e-Paper V2
  3. xml文件中引入xsd文件问题解决
  4. 为Visual SVN Server添加认证用户IP功能
  5. QCA三天写论文!模糊集数据校准实战
  6. 【verbs】ibv_get_cq_event|ibv_ack_cq_events()
  7. 判断二叉树是否为满二叉树
  8. 百度适配代码【移动搜索】如何让百度正确识别跳转适配关系
  9. 使用Websocket技术实现聊天功能--小程序前端部分(一)
  10. 2022年5月7日-8日 复盘计划