`

Android ROM研究---如何在ubuntu下下载姜饼(Gingerbread)源代码并编译android ROM

 
阅读更多

Android源代码由两部分组成,其一是Android系统应用部分的代码,其次是Android所使用的内核代码,
由于公司是针对Google nexus s来开发rom,所以需要下载三星的内核代码 
Android 系统应用代码 
  http://android.git.kernel.org/  
Android内核代码 
  http://android.git.kernel.org/?p=kernel/samsung.git

准备阶段:安装JDK  
Java 6: for Gingerbread and newer

$ 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

 

Java 5: for Froyo and older

$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu dapper main multiverse"
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu dapper-updates main multiverse"
$ sudo apt-get update

$ sudo apt-get install sun-java5-jdk

1、安装一些必备的软件。

Git是Linux Torvalds为了帮助管理Linux内核而开发的一个开放源码的分布式版本控制系统软件,它不同于SVN,CVS这样集中式的版本控制系统。在集中式版本控制系统中只有一个仓库(repository),
许多个工作目录,而git这样的分布式控制系统中,每一个工作目录都包含一个完整仓库,它们支持离线工作,
本地提交可以稍后提交到服务器上。分布式系统理论上也比集中 式的单服务器系统更健壮,单服务器系统一旦
服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而收到影响。

因为Android是由kernel,Dalvik,Bionic,prebuild,build等多个Git项目组成,

所以Android项目编写了一个名为repo的python的脚本来统一管理这些项目的仓库,使得Git的使用更加简单。

$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

2、创建源代码目录
首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它加到PATH环境变量中,
这个bin目录名字随便,是用来存放你下载的android系统应用源代码的

#cd
#mkdir bin
#export PATH=$PATH:/root/bin

3、用curl下载repo脚本,并保存在~/bin/repo文件中

#curl http://android.git.kernel.org/repo >~/bin/repo

为repo加上执行权限

#chmod a+x ~/bin/repo

4、初始化版本库
由于google nexus s所使用的是android 2.3.4版本的系统
首先建立一个目录,用来存放下载下来的东西

#mkdir repo
#cd repo

选择你所下载的版本号,Nexus S对应的是crespo android-2.3.4_r1 
Device Branch Build configuration 
crespo android-2.3.4_r1 full_crespo-userdebug 
crespo4g gingerbread full_crespo4g-userdebug 
passion android-2.3.4_r1 full_passion-userdebug 
sapphire android-2.2.2_r1 full_sapphire-userdebug 
dream android-2.2.2_r1 full_dream-userdebug 
以后,执行如下命令

#repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.4_r1

由于之前下载的是android2.3.3版本的,所用的参数是android-2.3.3_r1。由于最新的是android-2.3.4_r1,所以使用上面即可下载2.3.4的源代码
注意:如果要是把所有的版本都下载下来,那时间是需要很久很久的,需要耐心等待,但是如果仅仅是下载某一个版本的话,
很快就可以了。
最后,如果看到repo initialized in /repo的提示,说明本地的版本库已经初始化成功了(期间需要你填写姓名和邮件)

5、执行repo sync命令
在执行该命令之前,需要做一些改动,因为如果用git的方式下载的话,需要很多时间不说,而且不一定有结果,可能还会出现
Connection timed out错误等。所以进入.repo文件夹下打开后找到清单manifest.xml(manifest.xml为隐藏文件,
得显示文件后才能看到)

#cd .repo
#ll
#vim mainfest.xml

将fetch=”  git://android.git.kernel.org/”修改为fetch=”http//android.git.kernel.org”[[br ]] 通过用http的方式穿透,然后执行repo sync

#repo sync

如果出现如下的字样的话,说明下载完成了,否则,嘿嘿,你懂的。

Syncing work tree:100%(168/168),done.

这个下载过程同样需要很久,少则几个小时,多则几天,依赖于网速

6、编译Android系统应用的源代码
经过漫长的等待,在执行repo sync命令后约1天时间以后,终于将源码下载完成,然后进入bin目录

#cd ~/bin

(注意,是在root用户下)

这里的这个bin目录其实就是你下载后源代码所在的位置,查看该文件夹下的东西类似如下
|-- Makefile |-- bionic (bionic C库)
|-- bootable (启动引导相关代码)
|-- build (存放系统编译规则及generic等基础开发包配置)
|-- cts (Android兼容性测试套件标准)
|-- dalvik (dalvik JAVA虚拟机)
|-- development (应用程序开发相关)
|-- external (android使用的一些开源的模组)
|-- frameworks (核心框架——java及C++语言)
|-- hardware (主要保护硬解适配层HAL代码)
|-- out (编译完成后的代码输出与此目录)
|-- packages (应用程序包)
|-- prebuilt (x86和arm架构下预编译的一些资源)
|-- sdk (sdk及模拟器)
|-- system (文件系统库、应用及组件——C语言)
`-- vendor (厂商定制代码)

这时,如果直接执行make命令的话,会出现错误,这是因为在make(编译)之前,需要安装一些依赖包才能够正常编译,
否则会出现各种各样的问题

7、编译Gingerbread系统源代码  
首先,需要注意的是,下载后的源代码先不要编译,最好备份一下,然后再编译。不能直接make 
(1)进入到你的bin目录下,清理编译过的文件,释放空间

#make installclean
#make clean

(2)用envsetup.sh脚本初始化环境变量

#source build/envsetup.sh

或者

#. build/envsetup.sh

(3)选择版本号,执行lunch操作 


 
输入full_crespo_userdebug或者4

(4)开始编译源代码 
#make -j4 
其中-j(n)表示用n核cpu编译,这样会更快速,可以用top命令查看cpu的个数

完成编译大约1个小时左右

8、以下是各种错误对应的解决办法:

build/core/main.mk:73: You are attempting to build on a 32-bit system.
build/core/main.mk:74: Only 64-bit build environments are supported beyond froyo/2.2.
是因为froyo/2.2默认只支持64-bit,而我的计算机是32位的,所以需要修改一些文件即可

./external/clearsilver/cgi/Android.mk 
./external/clearsilver/java-jni/Android.mk 
./external/clearsilver/util/Android.mk 
./external/clearsilver/cs/Android.mk
4个文件中的

LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64 

注释掉,或者将“64”换成“32”

LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += -m32 

然后,将./build/core/main.mk 中的
ifneq (64,$(findstring 64,$(build_arch))) 
改为:
ifneq (i686,$(findstring i686,$(build_arch)))

这样,32位的计算机也可以正常编译了

编译成功后,会在~/bin/目录下得到~/bin/out/target/product/crespo。编译好的源代码会在out目录下生成两个img镜像文件,可以先执行
#updatedb 创建数据库,用来方便查询所需的文件

#locate system.img
#locate userdata.img

9、配置环境变量
增加环境变量

#vim /root/.bashrc

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

export ANDROID_PRODUCT_OUT=/root/bin/out/target/product/generic
ANDROID_PRODUCT_OUT_BIN=/root/bin/out/host/linux-x86/bin
export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT}

保存退出后,更新一下.bashrc

#source .bashrc

10、在模拟器上运行编译好的镜像文件
最后,同步这些变化:(注意,我的~是/root,我是以root用户登录的)

# source ~/.bashrc
# cd ~/android/out/target/product/crespo
# emulator -system system.img -data userdata.img -ramdisk ramdisk.img

最后进入android桌面,就说明成功了。 但是上面的只是系统应用源码编译完成后,用google自带的模拟器来运行测试的,而我需要用google nexus s
的三星的内核编译,所以还需要其他的动作要进行

11、下载Nexus s 的kernel source

#cd /root/bin

(你的项目创建的源代码,就是大多人用的~/mydroid这个目录)

#git clone git://android.git.kernel.org/kernel/samsung.git

下载完成后,会在bin目录下面出现一个samsung的文件夹,这个就是你刚才下载的内核源码所在的位置,现在开始编译

#export PATH=$PATH:/root/bin/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/
#make ARCH=arm clean
#make ARCH=arm herring _defconfig
#make -j4 ARCH=arm CROSS_COMPILE=arm-eabi-

说明:上面四条语句要正确,尤其是路径要正确,否则后面执行make的时候会出现各种各样的错误
第一条:设置交叉编译链,这样内核编译环境就设置好了
第二条:为内核结构准备源目录树
第三条:内核参数设置
第四条:j4表示4核CPU

差不多一个小时左右,你会发现,在samsung目录下有
/root/bin/samsung/arch/arm/boot/zImage镜像文件
/root/bin/samsung/drivers/net/wireless/bcm4329/bcm4329.ko

12、将你的手机取得root权限
接下来,要将编译好的镜像文件放入到真机里进行测试,首先需要做的工作是先将你的手机root,
只有有了root权限以后才能够进行下一步操作。详细的Nexus S的root步骤参考wiki上的root教程,
因为只有手机root以后,才能够将自己编译好的内核在Nexus S上测试

13、在手机上运行编译好的samsung内核  
现在的工作是将编译好的内核在Nexus S上测试,下载下面的附件,解压后将fastboot文件存放到你的SDK/tools目录下,
将unpack-booting.pl脚本文件和mkbootimg 二进制文件放入到你的roo目录下的NS-bootwork文件夹下,另外,
将你编译好的zImage镜像文件也好拷贝到此文件夹下(如果没有该文件夹,自己创建)

进入你的SDK/tools目录下,执行adb shell
$adb shell
此时,你的手机上显示“授权请求”,默认是10秒以后就过时了,所以需要在10秒之内,点击允许。点击允许以后,
$符号将会变成#,表示已经取得了root权限。(注意:手机必须root以后才能够使用)

将boot.img下载到本地,你可以用adb命令,也可以用终端程序

#adb shell
$su
#cat /dev/mtd/mtd2 > /sdcard/boot.img

退出adb到终端的tools目录下

#adb pull /sdcard/boot.img /root/NS-bootwork
#cd NS-bootwork
#./unpack-booting.pl boot.img
#cd boot.img-ramdisk/
#find . | cpio -o -H newc | gzip > /root/NS-bootwork/boot.img-ramdisk/ramdisk-repack.cpio.gz
#cd ..       
#./mkbootimg --kernel zImage --ramdisk /root/NS-bootwork/boot.img-ramdisk/ramdisk-repack.cpio.gz
 --base 0x30000000 --pagesize 4096 -o newtestboot.img

这样,就在该目录下生成了一个newtestboot.img镜像文件

进入到SDK/tools文件夹下,关闭你的手机。然后长按电源键和音量上键进入bootloader界面
在ubuntu的终端上执行

#cd /home/loulijun/android/android-sdk-linux_86/tools
#./fastboot boot newtestboot.img

(必须是root权限)

如果boot成功,说明你的内核是对的,点击“设置”--“关于手机”--“内核版本“
显示
2.6.35.7-ge382d80
root@ubuntu#1
说明成功了,但这只是测试,从新启动后,就会回复到之前的样子,可以再次执行上面的操作,可以看到
2.6.35.7-ge382d80
android-build@apa28

内核版本好都是一样的,说明下载的内核源代码跟手机用的是一样的

参考资料:  
(1)  http://source.android.com/index.html  
(2)  http://forums.androidcentral.com/t-mobile-nexus-s-rooting-roms-hacks/48675-how-compile-nexus-s-kernel-source.html  
(3)  http://forum.xda-developers.com/showthread.php?t=704561  

 

  • 大小: 47.8 KB
  • 大小: 60 KB
分享到:
评论
3 楼 q-android 2011-10-21  
楼主你好,我在编译Neuxs S内核时,使用herring _defconfig编译出的内核无法启动系统。
停在开机画面处,用adb工具可以连接,说明内核已经是可以运行的,但是无法进行接下来的启动Android系统的步骤。按说内核配置文件应该去/proc/config.gz找,但是nexus s没有这个文件,因此我不得不用herring _defconfig释放出的.config来编译内核。
不知道楼主是否遇到过这样的情况,我的nexus s kernel的版本是2.6.35.7-g1d030a7。我参考了您的文章,以及这篇文章中(http://glandium.org/blog/?p=2214)的方法进行编译,其中有一句$ echo -ge382d80 > .scmversion您的文章里面没有,不知道是什么意思。
2 楼 hualang 2011-08-03  
fortianwei 写道
您好,请问您知道怎么给android源码升级么?我们公司以前下载的是2.3.3的,现在想弄成2.3.4的,可以直接通过比较不同点什么的来升级么?

或者,单独的2.3.4需要怎么下载呢?我不是很懂git.


#sudo apt-get install curl
#curl http://android.git.kernel.org/repo >~/bin/repo
#repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.4_r1

这样下载下来的就是2.3.4的了,但是这是将所有源代码下载下来,源代码升级的话,你可以查查打patch的方式,不过我也没有试过,因为感觉这样可能存在一些不稳定,所以下载原始的可能好些
1 楼 fortianwei 2011-08-03  
您好,请问您知道怎么给android源码升级么?我们公司以前下载的是2.3.3的,现在想弄成2.3.4的,可以直接通过比较不同点什么的来升级么?

或者,单独的2.3.4需要怎么下载呢?我不是很懂git.

相关推荐

    android-2.3.3-gingerbread-src.zip

    《Android 2.3.3 Gingerbread 源代码解析》 Android 2.3.3,代号Gingerbread(姜饼),是Google在2010年推出的Android操作系统的一个重要版本。这个版本的发布标志着Android系统在功能、性能和用户体验上的显著提升...

    阿尔卡特 Alcatel OT-990 刷 姜饼( Gingerbread 2.3.4) ROM

    ### 阿尔卡特 Alcatel OT-990 刷姜饼(Gingerbread 2.3.4)ROM #### 知识点详解: **一、准备工作** 在开始之前,请确保已经做好以下准备: 1. **备份数据:**由于刷机可能会导致手机中的数据丢失,请提前备份...

    Android 2.3 源代码

    Android 2.3,又被称为Gingerbread(姜饼),是Android操作系统的一个重要版本,它带来了许多性能优化和新功能,为开发者提供了更丰富的API和更好的用户体验。源代码的开放性是Android的一大特色,允许开发者深入...

    android 2.3 sdk android-2.3-sdk

    Android 2.3 SDK,又称为Gingerbread(姜饼),是Google针对其移动操作系统Android发布的一个重要版本。这个SDK(软件开发工具包)为开发者提供了构建、测试和调试针对Android 2.3系统应用所需的工具和技术文档。...

    QuickSnap:基于官方Gingerbread相机应用程序源代码的Android相机实现-Android app source code

    最初,将Android Gingerbread相机源进行了分叉,然后进行了修改,使其向下兼容到API级别7(Eclair)。 视频功能也已删除。 然后,对该代码进行了进一步修改,以支持以下无法正常运行的设备: HTC Evo HTC Desire...

    最新2011Android4.0API源代码 包含所有API

    《全面解析Android 4.0 (ICS) API源代码》 Android 4.0,代号冰淇淋三明治(Ice Cream Sandwich,简称ICS),是Android操作系统的一个重要版本,它为开发者提供了更强大、更丰富的API接口,使得应用程序的开发更加...

    【Nexus One 刷机ROM】机友的福中福!Android 2.3.3

    本文将详细介绍如何为Nexus One手机刷入Android 2.3.3(姜饼)版本的ROM,并对其主要特点进行解析。 #### 二、Android 2.3.3(姜饼)简介 Android 2.3.3,代号为“姜饼”(Gingerbread),是Google于2011年发布的...

    android 2.3.3 source api 10

    Android 2.3.3,又称为Gingerbread(姜饼),是Google在2010年12月推出的Android操作系统版本,对应的API级别为10。这个版本的发布为移动设备带来了诸多改进和新特性,包括性能优化、电池管理、用户界面升级以及对多...

    Android 2.3.7 ROM G大出品

    Android 2.3.7,也被称为Gingerbread(姜饼),是Google于2010年推出的Android操作系统的一个版本。这个版本是Android 2.3系列的最后一个更新,带来了诸多性能优化和功能改进。Android 2.3.7 ROM是由开发者G大精心...

    Android 2.3.3-2.3.7 sdk API10

    Android 2.3.3-2.3.7 SDK API 10是Android操作系统的一个重要版本,它在2010年12月发布,代号为“Gingerbread”(姜饼)。这个版本带来了许多改进和新特性,对开发者来说具有深远的影响。下面将详细阐述其中的关键...

    安卓2.3源代码

    安卓2.3,又称为Gingerbread(姜饼),是谷歌Android操作系统的一个重要版本,发布于2010年,为当时的移动设备带来了许多性能优化和新特性。这份"安卓2.3源代码"提供了深入理解这个系统底层运作机制的机会,对于...

    Android2.3.3 Jar包+源码+javadoc(chm)

    Android 2.3.3,代号为“Gingerbread”(姜饼),是Google推出的一个重要的Android版本,针对智能手机和平板电脑进行了诸多优化。这个版本在系统性能、电池管理、用户界面以及网络功能上都有显著提升,对开发者来说...

    大胆尝姜饼:HTC Legend G6开刷Android 2.3.doc

    Android 2.3 Gingerbread,简称姜饼,是谷歌推出的一个重要版本的Android操作系统,主要针对性能优化和用户体验进行了升级。相较于之前的Android 2.2 Froyo,Gingerbread虽然在新功能上没有显著增加,但在速度提升和...

    android-2.3.3 SDK

    Android 2.3.3,代号“Gingerbread”(姜饼),是Google在2010年底推出的一个重要版本,它对前一版Android 2.3进行了诸多改进和优化,尤其在用户体验、性能提升以及开发者工具方面有着显著的提升。本文将深入探讨...

    Android版本与Linux内核的关系

    6. **Gingerbread (姜饼)**:对应于Android 2.3,其基于Linux内核版本2.6.35。 7. **Honeycomb (蜂巢)**:对应于Android 3.0,其基于Linux内核版本2.6.36.3。 这些对应关系体现了Android操作系统在其发展过程中,...

    Android应用开发-智能手机OS.pptx

    Android经历了多个版本迭代,从最初的1.1版到后续的甜点命名系列,如1.5的“纸杯蛋糕”、2.0/2.1的“甜甜圈”、2.2的“冻酸奶”、2.3的“姜饼”,再到3.0的“蜂巢”,每个版本都在用户体验、性能和功能上有所提升。...

    gingerbread

    标题“gingerbread”可能指的是Android操作系统的2.3版本,代号为“姜饼”。在这个版本中,Android系统对硬件支持,特别是传感器方面进行了显著的优化和增强。传感器在移动设备中扮演着至关重要的角色,它们能感知并...

    android发展历程

    - **2007年11月5日**:Google正式对外展示Android操作系统,并以免费开源许可证的形式发布了Android的源代码。 ##### 快速成长期 - **2008年9月**:发布Android 1.0系统,标志着Android系统最早的版本诞生。 - **...

    Android和Linux内核版本对应关系

    Gingerbread (姜饼) - **Android系统版本**: 2.3 - **发布时间**: 2010年12月7日 - **Linux Kernel内核版本**: 2.6.35 - **备注**: 移除了Android代码的Linux Kernel 2.6.33版代码库。 ##### 8. Honeycomb (蜂巢) ...

Global site tag (gtag.js) - Google Analytics