注意,本文只供参考,是老文章

1.必要的软件环境

 sudo apt-get install build-essential
 sudo apt-get install make
 sudo apt-get install gcc
 sudo apt-get install g++
 sudo apt-get install libc6-dev
 sudo apt-get install patch
 sudo apt-get install texinfo
 sudo apt-get install libncurses-dev
 sudo apt-get install git-core gnupg
 sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
 sudo apt-get install ncurses-dev
 sudo apt-get install zlib1g-dev
 sudo apt-get install valgrind
 sudo apt-get install python2.5

  有一些应该是linux系统自带的,如果缺少就按照提示install一下

  安装java环境,这里有必要说一下,大家装环境的时候很多人会一起装,不过笔者建议java和其他的分开,因为装java很可能会失败,从而导致其他的也fail

sudo apt-get install sun-java6-jdk

1.1遇到的问题:

  这里就说到上面说很多人会安装java失败的问题,笔者也是从网上找的解决办法现在一起整理出来:

  ubuntu10.04 lucid 去掉了sun-java6-jre,sun-java6-jdk的源,所以如果是直接apt-get install 提示是
  现在没有可用的软件包 sun-java6-jdk,但是它被其它的软件包引用了。


这可能意味着这个缺失的软件包可能已被废弃,

或者只能在其他发布源中找到

E: 软件包 sun-java6-jdk
还没有可供安装的候选者

1.2解决办法(选择一个即可):

1、系统->系统管理->软件源->“其它软件”下添加一个
deb http://archive.canonical.com/ lucid partner

之后,再执行apt-get install

如果是下载java5就添加deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse”


2、自己从sun网站下载相应的Jre,JDK安装即可

3、从新立德软件管理器中search openJDK,用openJDK代替

  注: 官方文档说如果用sun-java6-jdk可出问题,得要用sun-java5-jdk。经测试发现,如果仅仅make(make不包括make
sdk),用sun-java6-jdk是没有问题的。而make sdk,就会有问题,严格来说是在make doc出问题,它需要的javadoc版本为1.5。

  因此,我们安装完sun-java6-jdk后最好再安装sun-java5-jdk,或者
只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装,并只修改javadoc.1.gz和
javadoc。因为只有这两个是make sdk用到的。这样的话,除了javadoc工具是用1.5版本,其它均用1.6版本:

sudo apt-get install sun-java5-jdk

修改javadoc的link

cd /etc/alternatives
sudo rm javadoc.1.gz
sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz
sudo rm javadoc
sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc

2、设置环境变量

vim ~/.bashrc

在.bashrc中新增或整合PATH变量,如下

#java 程序开发/运行的一些环境变量

JAVA_HOME=/usr/lib/jvm/java-6-sun
JRE_HOME=${JAVA_HOME}/jre
export ANDROID_JAVA_HOME=$JAVA_HOME
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSP ATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export JAVA_HOME;
export JRE_HOME;
export CLASSPATH;
HOME_BIN=~/bin/
export PATH=${PATH}:${JAVA_PATH}:${JRE_PATH}:${HOME_BIN};
#echo $PATH;

最后,同步这些变化:

source ~/.bashr

3.安装repo(用来更新android源码)

创建~/bin目录,用来存放repo程序,如下:

$ cd ~ $ mkdir bin

并加到环境变量PATH中,在第2步中已经加入

下载repo脚本并使其可执行:

$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/rep

4.初始化repo

repo是android对git的一个封装,简化了一些git的操作。

4.1创建工程目录:

$ mkdir android
$ cd android

4.2repo初始化

  $ repo init -u git://android.git.kernel.org/platform/manifest.git

这里包含了android最新的源码

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

repo initialized in /android

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

  如果想拿某个branch而不是主线上的代码,我们需要用-b参数制定branch名字,比如:

  repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake 这 里抓下来的分支是cupcake,网上关于编译到文章大多是针对cupcake分支,是andoird 1.5版本,但是之前我没有输入后面的参数,以致于下到的代码是主线上的代码,是android 2.1版本。两者目录结构有一些差别,导致当我按照网上的说明步骤来执行遇到错误时,不知道是版本不同的原因还是其他什么原因。因此很奇怪为什么网上的文 章都是说cupcake的,而没有怎么讲主线的源代码编译。

5.同步源代码

$ repo sync

这一步要很久,要看个人的网络速度

6.编译android源码,并得到~/android/out目录

$ cd ~/andoird

$ make -j2 笔者的电脑是双核所以是-j2,以此类推8核就可以-j8

这一过程很久,主要看机器的配置

如果是cupcake,那么直接make的时候,会出现以下错误:

6.1产生的问题1:

  frameworks/policies/base/PolicyConfig.mk:22: *** No module defined for the given PRODUCT_POLICY (android.policy_phone). Stop.错误。

  解决办法:

    在build/tools/findleaves.sh中的第89行,
    这一句find "${@:0:$nargs}"
$findargs -type f -name "$filename" -print |
    改为find "${@:1:$nargs-1}"
$findargs -type f -name "$filename" -print |

6.2产生的问题2:

  frameworks/base/tools/aidl/AST.cpp:10: error: 'fprintf' was not
declared in this scope的错误

  解决办法:
    下载gcc-4.3和g++-4.3

    apt-get install gcc-4.3 g++-4.3
    因为ubuntu 9.10自带到是gcc
4.4,因此需要重新下载gcc 4.3,最后设置gcc软连接到gcc 4.3
    进入/usr/bin
    cd /usr/bin

    建个软连接
    ln -s gcc-4.3 gcc
    ln -s g++-4.3 g++

    然后进入android目录下,执行make,就可以了。

  主线代码则没有此问题

7.在模拟器上运行编译好的android

  编译好android之后,emulator在~/android/out/host/linux-x86/bin
下,ramdisk.img,system.img和userdata.img则在~/android/out/target/product /generic下

$ cd ~/android/out/host/linux-x86/bin

增加环境变量

$ emacs ~/.bashrc

在.bashrc中新增环境变量,如下

#java 程序开发/运行的一些环境变量

export ANDROID_PRODUCT_OUT=~/android/out/target/product/g eneric

ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x 86/bin

export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_ PRODUCT_OUT};

最后,同步这些变化:

$ source ~/.bashrc

$ cd ~/android/out/target/product/generic

$ emulator -system system.img -data userdata.img -ramdisk ramdisk.img

最后进入android桌面,就说明成功了。

8.编译模块

android中的一个应用程序可以单独编译,编译后要重新生成system.img

8.1单独编译命令

在源码目录下执行

$ . 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.

可以加—help查看用法

8.2单独编译联系人模块示例

我们可以使用mmm来编译指定目录的模块,如编译联系人:

$ mmm packages/apps/Contacts/

编完之后生成两个文件:

out/target/product/generic/data/app/ContactsTests. apk

out/target/product/generic/system/app/Contacts.apk

可以使用

$ make snod

重新生成system.img,再运行模拟器

9.编译SDK

直接执行make是不包括make sdk的。make sdk用来生成SDK,这样,我们就可以用与源码同步的SDK来开发android了。

9.1修改/frameworks/base/include/utils/Asset.h

  ‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改为 ‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’

原因是eclipse编译工程需要大于1.3M的buffer;

  这一步,笔者编译的是主线程的,在Asset.h文件里没找到上面的常量,所以就没做这一步,但是也成功了。

9.2编译ADT

  如果想用eclipse开发android应用程序,最好是安装ADT,这样就可以在eclipse下创建android的工程。

产生ADT
eclipse plugins
$ development/tools/eclipse/scripts/build_server.sh ~/adt/

  使用前建议设定一下ECLIPSE_HOME的环境变量,不然会以为没有装eclipse,然后帮你download下来。

 
这里要非常注意,本人就曾经卡在这里,始终编译不过。一开始会提示eclipse的什么什么jar找不到,因此fail。这主要是因为我到
ECLIPSE_HOME到环境变量设置错误。我之前装的eclipse只从新力得上面抓下来的,好像找不到eclipse所在到目录是哪个,结果就设置
了一个名为eclipse的文件夹作为环境变量。因此后来直接从eclipse的官网上下了一个,以为这样就可以。结果杯具的是下到是一个eclipse
Galileo,到头来还是提示eclipse什么什么文件找不到。最后实在没法,索性把eclipse删个干净,让程序自己去下eclipse,发现抓
的是eclipse ganymede。在此要郑重说明一下,自己去下的话应该下载jee的ganymade,而不能是java
的ganymade,具体原因试试就知道了。

  主线代码编译ADT的时候方法相同,但是没有development/tools/eclipse这个目录,而是在/sdk/eclipse这个目录

9.3执行make sdk

  注意,这里需要的javadoc版本为1.5,所以你需要在步骤1中同时安装sun-java5-jdk

$ make sdk

  编译很慢。编译后生成的SDK存放在out/host/linux-x86/sdk/,此目录下有android-sdk_eng.xxx_linux-
x86.zip和android-sdk_eng.xxx_linux-x86目录。android-sdk_eng.xxx_linux-x86就是 SDK目录

  实际上,当用mmm命令编译模块时,一样会把SDK的输出文件清除,因此,最好把android-sdk_eng.xxx_linux-x86移出来

  此后的应用开发,就在该SDK上进行,所以把7)对于~/.bashrc的修改注释掉,增加如下一行:

export PATH=${PATH}:~/android/out/host/linux-x86/sdk/andr
oid-sdk_eng.xxx_linux-x86/tools

注意要把xxx换成真实的路径;

  同样笔者编译的是主线程,所以编译完之后,发现~/android/out/host/linux-x86/sdk/android-sdk_eng.x
xx_linux-x86/目录下有2个文件夹一个是tools一个是platform-tools,然后用eclipse指向这个目录的时候会提示找不到ADB,这时候只要把platform-tools下的ADB拷贝到tools文件夹就OK了

9.4关于环境变量、android工具的选择

目前的android工具有:

  A、我们从网上下载的SDK,如果你下载过的话( tools下有许多android工具,lib/images下有img映像)

  B、我们用make sdk编译出来的SDK( tools下也有许多android工具,lib/images下有img映像)

  C、我们用make编译出来的out目录( tools下也有许多android工具,lib/images下有img映像)

那么我们应该用那些工具和img呢?

  首先,我们一般不会用A选项的工具和img,因为一般来说它比较旧,也源码不同步。其次,也不会用C选项的工具和img,因为这些工具和img没有经过
SDK的归类处理,会有工具和配置找不到的情况;事实上,make sdk产生的很多工具和img,在make编译出来out目录的时候,已经编译产生了,make
sdk只是做了copy而已。

9.5安装、配置ADT

  ~/adt/android-eclipse/下的文件压缩,然后从eclipse中install就行了,当然还有其他方法

10.编译linux内核映像

10.1准备交叉编译工具链

  android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。

10.2设定环境变量

$ emacs ~/.bashrc

增加如下两行:

export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/ arm-eabi-4.4.0/bin

export ARCH=arm

保存后,同步变化:

$ source ~/.bashrc

10.3获得合适的内核源代码

$ cd ~/android

获得内核源代码仓库

$ git clone git://android.git.kernel.org/kernel/common.git kernel

$ cd kernel

$ git branch

显示 * android-2.6.27

说明你现在在android-2.6.27这个分支上,也是kernel/common.git的默认主分支。

显示所有head分支:

$ git branch -a

显示 * android-2.6.27

remotes/origin/HEAD -> origin/android-2.6.27

remotes/origin/android-2.6.25

remotes/origin/android-2.6.27

remotes/origin/android-2.6.29

remotes/origin/android-goldfish-2.6.27

remotes/origin/android-goldfish-2.6.29

我们选取最新的android-goldfish-2.6.29,其中goldfish是android的模拟器模拟的CPU。

$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29

$ git branch

显示 android-2.6.27

* android-goldfish-2.6.29

我们已经工作在android-goldfish-2.6.29分支上了。

10.4设定交叉编译参数

  打开kernel目录下的Makefile文件,把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器

CROSS_COMPILE ?= arm-eabi-

把 LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\

$(call ld-option, -Wl$(comma) build-id,))

  这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下:

LDFLAGS_BUILD_ID =

10.5编译内核映像

$ cd ~/android/kernel

$ make goldfish_defconfig

$ make f)测试生成的内核映像

$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage

一次编译Android源码实验的更多相关文章

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

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

  2. 在Mac mini上编译Android源码

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. ligerui+json_001_实现表格(grid)的后台数据显示、分页

    代码下载地址: http://download.csdn.net/detail/poiuy1991719/8556841 效果: 需要导入的包: 01:编写界面:index.jsp <%@ pa ...

  2. rails控制台进入

    数据库控制台: rails db .help查看可使用的命令 rails控制台 rails c 普通ruby控制台: irb

  3. Power Gating的设计(模块)

    Switching Fabric的设计: 三种架构:P沟道的switch vdd(header switch),N沟道的switch vss(footer switch),两个switch. 但是如果 ...

  4. Servlet工作原理(转)

    Servlet运行在Servlet容器中,由容器负责Servlet实例的查找及创建工作,并按照Servlet规范的规定调用Servlet的一组方法,这些方法也叫生命周期的方法.具体调用过程如下图所示: ...

  5. Java 的局部变量和成员变量

    在Java语言中没有全局变量  分析各种变量的作用域的最简单方法是以花括号为界, 1.在类体中定义的是成员变量,成员变量会被默认初始化 2.在方法中定义的是局部变量,局部变量不会被默认初始化

  6. 【python cookbook】【数据结构与算法】20.将多个映射合并为单个映射

    问题:在逻辑上将多个字典或映射合并为一个单独的映射结构,以此执行某些特定的操作,比如查找值或者检查键是否存在 解决方案:利用collections模块中的ChainMap类 ChainMap可接受多个 ...

  7. __ATTRIBUTE__ 你知多少?【转】

    转自:http://www.cnblogs.com/astwish/p/3460618.html GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属 ...

  8. C# Driver LINQ Tutorial

    1.介绍 该教程涵盖了1.8版本的C#驱动中的LINQ查询.你可能已经阅读最新的C# Driver Tutorial. 2.快速开始 首先,给程序添加下面的using声明 using MongoDB. ...

  9. 【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.8.Datepicker控件

    默认datepicker的安装启用 探索它的配置选项 安装启用一个触发按钮 配置一个供选择的动画 dateFormat选项 简单的国际化 多月datepicker 日期范围选择 datepicker的 ...

  10. 将helps.php或者functions.php直接进行了加载

    TP3系列中functions.php文件默认其实是空文件,很好找.我们可以直接封装代码. Laravel5系列中的path/vendor/laravel/framework/src/Illumina ...