android代码编译过程,Android编译过程总结

本文详细介绍了在Ubuntu10.04及更高版本系统中编译Android2.3的全过程,包括环境配置、编译环境搭建、源代码同步、编译过程以及编译后的文件结构解析。主要涉及JDK安装、repo工具配置、git操作、源代码下载、编译选项设置、模块编译和make命令的使用。整个过程详尽且实用,适合对Android系统内核感兴趣的开发者参考。
摘要由CSDN通过智能技术生成

编译环境:ubuntu

10.04(或者更高)(windows平台目前不被支持)

本文以编译android2.3为例,64位操作系统

1、编译环境的准备

( 1)确保安装有ubuntu系统或者虚拟机

(2)安装JDK1.6(对于Android2.3以上代码)

$

sudo add-apt-repository "deb http://archive.canonical.com/ lucid

partner"

$

sudo add-apt-repository "deb-src

http://archive.canonical.com/ubuntu lucid partner"

$

sudo apt-get update

$

sudo apt-get install sun-java6-jdk

(3)安装一些需要软件包

$

sudo apt-get install git-core gnupg flex bison gperf build-essential

\

zip

curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \

x11proto-core-dev

libx11-dev lib32readline5-dev lib32z-dev \

libgl1-mesa-dev

g++-multilib mingw32 tofrodos

(4)安装repo

$

git clone git://android.git.kernel.org/tools/repo.git

$ mkdir ~/bin

$ cp repo-script/repo ~/bin

$ vim ~/.bashrc ,将~/bin加入PARH环境变量,如:

$

export PATH=~/bin:$PATH

保存后,同步更新:source

~/.bashrc

(5)设置git

执行以下语句$git

config --global user.name"你的名字"$git

config --global user.email "你的email地址"

(6)同步源代码

1)创建工程目录:

$ mkdir myandroid

$ cd myandroid

2)repo初始化以及同步代码

$repo

init -u server@192.168.x.xx:git库名/manifest.git -b 主分支名

在此过程中需要输入名字和email地址。初始化成功后,会显示:repo

initialized in /android

在~/android下会有一个.repo的隐藏目录

$repo

sync(这一步会花费很长时间)

2、编译

(1)注意事项

执行ls

-la /bin/sh命令,如果输出/bin/sh

-> dash,

请执行$

sudo dpkg-reconfigure dash命令修改sh版本,并选择“否”;

此处如果不改好的话,编译时会出现错误。

(2)代码下载完成后就可以进行编译了

$

cd myandroid

$

make(此过程需要很长时间)

(3)编译完成后的代码结构

Android编译完成之后,将会在根目录下生成一个out文件夹,所有生成的内容均放在这个文件夹中。

Out文件夹的内容以及结构如下:

out/|--

CaseCheck.txt|--

casecheck.txt|--

host|

|-- common|

`-- linux-x86`--

target|--

common`--

product

两个主要的目录为host和target,host表示主机(x86)生成的工具,target表示目标机运行的内容。

Host目录的结构如下所示:

out/host/|--

common|

`-- obj(JAVA库)`--

linux-x86|--

bin(二进制程序)|--

framework(JAVA库,*.jar文件)|--

lib(共享库*.so)`--

obj(中间生成的目标文件)

host目录是一些在主机上用的工具,有一些是JAVA的程序。

Target目录的结构如下:

out/target/|--

common|

|-- R(资源文件)|

|-- docs|

`-- obj(目标文件)`--

product`--

generic

其中common目录表示通用的内容,product表示的产品的内容。

在common目录的obj中,包含两个重要的目录:

APPS:包含了JAVA应用程序生成的目标,每个应用程序对应其中的一个子目录,将结合每个应用程序的原始文件生成Android应用程序的APK包。

JAVA_LIBRARIES中包含了JAVA的库,每个库对应其中的一个子目录。

在默认情况下,Android编译将生成generic目录,如果选定产品还可以生成其他的目录(如ventana)。generic一般包含以下内容:

out/target/product/generic/|--

android-info.txt|--

clean_steps.mk|--

data|--

obj|--ramdisk.img|--

root|--

symbols|--

system|--system.img|--userdata.img

在generic/obj/APPS目录中包含可各种JAVA应用,这与common/APPS想对应,但是已经打成了APK包。

system目录是主要的文件系统;data目录是存放数据的文件系统。

obj/SHARED_LIBRARIES中存放所有的动态库;STATIC_LIBRARIES中存放所有的静态库。

以img结尾的文件是目标映像文件,其中ramdisk.img是作为内存盘的根文件系统映像,system.img是主要文件系统的映像,userdata.img是数据内容映像。这几个Image文件是运行时真正需要的文件。

(4)编译单个模块

android中的一个应用程序可以单独编译,生成想对应的APK包,以Email为例。

$

source build/envsetup.sh

就多出一些命令:-

croot: Changes directory to the top of the tree.

- m:

Makes from the top of the tree.

- mm: Builds all of the

modules in the current directory.

- mmm: Builds all of the

modules in the supplied directories.

- cgrep: Greps on all

local C/C++ files.

- jgrep: Greps on all local Java

files.

- resgrep: Greps on all local res/*.xml files.

-

godir: Go to the directory containing a file.

$

mm Email

编译之后生成out/target/product/generic/system/app/Email.apk

3、编译文件分类

(1)配置类

主要用来配置product、board,以及根据你的Host和Target选择相应的工具以及设定相应的通用编译选项:

config文件说明

build/core/config.mkConfig文件的概括性说明

build/core/envsetup.mkgenerate目录构成等配置

build/target/product产品相关配置

build/target/board硬件相关的配置

build/core/combo编译选项配置

Config.mk是一个总括性的东西,它里面定义了各种midule编译所需要使用的HOST工具以及如何来编译各种模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。

board主要是涉及到硬件芯片的配置,比如是否提供硬件的某些功能,或者芯片支持浮点运算等等。product针对当前的芯片配置来定义你将要生产产品的个性配置,只要指APK方面的配置,如哪些APK会包含在哪个product中,哪些APK在当前product中是不提供的。

这类文件主要定义了如何来处理Module和Android.mk,以及采用何种方式来生成目标模块,这些模块的规则都定义在config.mk里面,如下:

CLEAR_VARS:=

$(BUILD_SYSTEM)/clear_vars.mk

BUILD_HOST_STATIC_LIBRARY:=

$(BUILD_SYSTEM)/host_static_library.mk

BUILD_HOST_SHARED_LIBRARY:=

$(BUILD_SYSTEM)/host_shared_library.mk

BUILD_STATIC_LIBRARY:=

$(BUILD_SYSTEM)/static_library.mk

BUILD_RAW_STATIC_LIBRARY

:= $(BUILD_SYSTEM)/raw_static_library.mk

BUILD_SHARED_LIBRARY:=

$(BUILD_SYSTEM)/shared_library.mk

BUILD_EXECUTABLE:=

$(BUILD_SYSTEM)/executable.mk

BUILD_RAW_EXECUTABLE:=

$(BUILD_SYSTEM)/raw_executable.mk

BUILD_HOST_EXECUTABLE:=

$(BUILD_SYSTEM)/host_executable.mk

BUILD_PACKAGE:=

$(BUILD_SYSTEM)/package.mk

BUILD_PHONY_PACKAGE:=

$(BUILD_SYSTEM)/phony_package.mk

BUILD_HOST_PREBUILT:=

$(BUILD_SYSTEM)/host_prebuilt.mk

BUILD_PREBUILT:=

$(BUILD_SYSTEM)/prebuilt.mk

BUILD_MULTI_PREBUILT:=

$(BUILD_SYSTEM)/multi_prebuilt.mk

BUILD_JAVA_LIBRARY:=

$(BUILD_SYSTEM)/java_library.mk

BUILD_STATIC_JAVA_LIBRARY:=

$(BUILD_SYSTEM)/static_java_library.mk

BUILD_HOST_JAVA_LIBRARY:=

$(BUILD_SYSTEM)/host_java_library.mk

BUILD_DROIDDOC:=

$(BUILD_SYSTEM)/droiddoc.mk

BUILD_COPY_HEADERS

:= $(BUILD_SYSTEM)/copy_headers.mk

BUILD_KEY_CHAR_MAP

:= $(BUILD_SYSTEM)/key_char_map.mk

除了CLEAR_VARS是清除本地变量之外,其他所有的都对应了一种模块的生成规则,每一个本地模块最后都会include其中的一种来生成目标模块。大部分上面的.mk都会包含base_rules.mk,这是对模块进行处理的基础文件。

(3)单个模块的编译

本地模块的Makefile文件就是Android.mk文件。Android进行编译的时候会通过下面的函数来遍历所有子目录中的Android.mk,一旦找到就不会再往层子目录继续寻找(所有你的模块定义的顶层Android.mk必须包含自己定义的子目录中的Android.mk)。

subdir_makefiles

+= \

$(shellbuild/tools/findleaves.sh

--prune="./out" $(subdirs) Android.mk)

不同类型的本地模块具有不同的语法,但基本上是相通的,只有个别变量的不同。

Android通过LOCAL_MODULE_TAGS来决定哪些本地模块会不会编译进系统,通过PRODUCT和LOCAL_MODULE_TAGS来决定哪些应用包会编译进系统,如果用户不指定LOCAL_MODULE_TAGS,默认它的值是user。此外用户可以通过buildspec.mk来指定你需要编译进系统的模块。用户也可以通过mm来编译指定模块,或者通过make

clean-module_name来删除指定模块。

(4)系统生成类

主要指build/core/Makefile文件,这个文件定义了生成各种img的方式,包括ramdisk.img,

urerdata.img, system.img, recovery.img等。

所有的Makefile都通过build/core/main.mk这个文件组织在一起,它定义了一个默认goals:droid,当我们在TOP目录下敲Make实际上就等同于我们执行make

droid。当Make

include所有的文件,完成对所有make文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。

4、make命令

make

clean:删除本次配置所编译输出的结果文件。类似于:rm

–rf ./out/

make

showcommands:在编译的时候显示脚本的命令,而不是显示编译的简报。用于调试脚本

make:映像编译成功后会在目录~/android/src/out/target/product/generic下产生一些image文件ramdisk.img

system.img userdata.img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值