ubuntu 下基于源码的android平台搭建与内核编译


 基于YLMF_OS_3第六次编辑:

怎么调试都不行,过程也就不写了,自己找了原先有旧电脑,千辛万苦地安装了YLMF_OS_3,又找了几个安装方法,重新编辑如下:

1.      安装git和gnupg。输入

$sudo apt-get install git-core gnupg

2.   安装其它工具

$sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

3.  安装python、valgrind工具
$sudo apt-get install python
$sudo apt-get install valgrind

4.  安装java sdk

$sudo apt-get install sun-java6-sdk
$sudo apt-get install sun-java5-sdk
$cd /etc/alternatives
$sudo rm javadoc.1.gz javadoc
$sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz
$sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc

android仅支持1.5以上版本的java sdk,且1.6版本的java sdk在进行android sdk编译时会出现java doc错误,在这里我的解决办法时先安装java sdk 1.6,接着安装java sdk 1.5,然后将系统的java sdk链接到java sdk 1.6上,仅是将javadoc和javadoc.1.gz链接到java sdk 1.5上,这样做的好处是在编译android源码和进行android应用开发时,使用的是java sdk 1.6,仅在编译android sdk的doc时,使用的是java sdk 1.5版本的javadoc和javadoc.1gz。

5.       下载repo工具

$mkdir $HOME/bin
$vi .bashrc

加入   export PATH=$HOME/bin:$PATH
:wp
保存退出
$source .bashrc
$curl http://android.git.kernel.org/repo>$HOME/bin/repo
$cd $HOME/bin

$chmod a+x repo

  (修改repo脚本权限前repo是没有执行权限即不可以执行的 通过 ls –l repo 可以查看;如果在此不添加执行权限则下面执行repo init –u …会提示 permission denied)

6.       导出android项目

$ mkdir  Android
$ cd  Android

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

另一种导出

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

 

执行后会提示没有用户名和邮件地址等信息,输入在GOOGLE注册的用户及邮箱
再次运行上面命令 输入刚设置的用户名和邮件地址即可让我们建立的目录就和Google的android源码库建立了链接。

 

    通常情况下会出现error提示(如果是以前没有创建过repo账户的话),这个错误可以忽略。最后的-cupcake就是      为了下载cupcake版本,如果不加的话,下载的是master版本,master版本属于开发测试版本,很多功能还不稳定

7.       开始下载android platform的源代码

$ repo sync

由于android的源码很大,现在完整的代码已经高达3G以上,所以最分文件夹进行同步下载。如要下载kernel:

$repo sync kernel

现在,就可以做别的事,让电脑自动完成源码的下载工作。

如果下载kernel时提示 error: project kernel not found 可以先查看.repo目录下 manifest.xml 是否有kernel 没有则 可以通过

http://android.git.kernel.org/   (android官网) 上提示的方法 单独下载 想下载的目录

    git clone git://android.git.kernel.org/ 加 project path.

这样需自己建立目录如下载kernel/common则 先建立kernel目录再在此目录下运行git clone git://android.git.kernel.org/kernel/common.git

或者在manifest.xml 添加想要下载的projects 然后再repo sync即可

比如要下载 kernel/common kernel/omap kernel/experimental 三个kernel分支则添加

<project path="kernel/omap" name="kernel/omap" />
<project path="kernel/experimental" name="kernel/experimental" />
<project path="kernel/common" name="kernel/common" />

三个分支即可!!

 

 

编译

 

 

google的android很多人都希望在gphone没有出来之前,把它移植到相关的硬件平台上去。网上看了不少文章,总的感觉是:在这一步走得最远的就是openmoko的一个大师级别的黑客Ben “Benno” Leslie,他曾经试图把目前google发布的android移植到openmoko的平台上去,并且做了10000多行代码的尝试。最终虽然由于 open moko采用比较老的arm 920t的内核,而android采用较新的arm926-ej-s内核,而且使用了新的内核的一些新特性,导致移植失败,但是anyway,他已经做了足够多的前期工作了,尔后的宣布成功移植android到real target板子上的人,大多是在他提供的patch的基础上继续走下去做出来的。

下面是一些有用的参考,希望有助于对此感兴趣的开发人员:
(1)Ben “Benno” Leslie的关于andorid移植到openmoko的个人博客地址:
http://benno.id.au/blog/

(2)早期宣布成功移植android到zauraus-sl-c760的详细方法描述的链接:
http://euedge.com/blog/2007/12/06/google-android-runs-on-sharp-zaurus-sl-c760/

(3)后续的根据上述先行者们的工作,成功移植android到zauraus-c3000的方法:
http://androidzaurus.seesaa.net/article/74237419.html

(4)本文是参考下面的wiki,接合个人的实践写出来的,对原文的作者表示一下感谢:
http://wiki.droiddocs.net/Compilation_of_Android_kernel

很羡慕这些人阿!

不过很可惜,偶的开发板是s3c2410的,恰好是arm920t的核心的。。。估计移植上去戏不是很大,需要重写很多代码,毕竟偶跟benno相差得太远太远了,同样是开发人员,差距咋就那么大呢?!
(毕竟google仅仅开放了kernel的源代码而已,他们需要开放的东西还很多。)

在这里把关于android内核编译方法简单写一下,或许对希望移植内核的朋友能有些帮助:
(看了Benno的移植过程以后,觉得即使你能够编译google开放出来的内核,意义也不是特别大,因为这个内核中加入了为了支持qemu的很多东西,而这些代码似乎对希望移植到真机上的朋友来说,没有任何意义,反而是一种阻碍)。

1)从CodeSourcery上面载用于交叉编译的工具链:
http://www.codesourcery.com/gnu_toolchains/arm/download.html
我在这里选择的是->ARM GNU/Linux,以及IA32-GNU/Linux。有文章说应该选择ARM EABI,我不知道了,没有测试过,反正我选择的这个编译的内核也是可以跑起来的:P

2)下载google的android linux的内核源代码:
http://code.google.com/p/android/downloads/list
主要是这个文件:linux-2.6.23-android-m3-rc20.tar.gz

3)把下载到的内核和交叉编译工具解压缩,并最好把工具链的路径放到PATH里面去

解压缩内核:
 $ mkdir -p android
 $ cd android
 $ tar xzvf ../linux-2.6.23-android-m3-rc20.tar.gz
 会解压出来一个叫做kernel的目录,google的android的linux内核就在里面了。

解压缩交叉编译工具链:
 $ cd /usr/local/
 $ sudo cp ~/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 .
 $ sudo tar zxvf arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
此时会解压出来一个叫做arm2007q3的一个目录,这里面就是工具链了。

设置一下环境变量:
 $ export PATH=$PATH:/usr/local/arm2007q3/bin
好了,到此,基本的内核编译环境就搞好了。

4)现在是要得到android的内核编译参数的配置文件的时候了,该文件需要从已经安装好的android的模拟器
中得到才行。所以安装android的sdk也是必须的,这一步不太明白的朋友可以参考我以前发的android
命令行体验的文章。
首先启动android模拟器,然后通过adb得到模拟器中提供的内核配置文件:
 $emulator &
 $adb pull /proc/config.gz .
这时候adb工具会连接模拟器,并从它里面下载一个叫做config.gz的文件到你的当前目录下。
把它拷贝到你的kernel目录:
 $cd ~/android/kernel
 $cp ~/config.gz .
解压缩该文件,并重命名为.config,这一步做了就可以跳过make menuconfig之类的内核参数设置
动作了。
 $gunzip config.gz
 $mv config .config

5)修改kernel目录中的Makefile文件,用emacs或vi打开该Makefile

修改CROSS_COMPILE变量为:
CROSS_COMPILE=arm-none-linux-gnueabi-
这个就是刚刚的下载和解压的工具链的前缀了,旨在告诉make,在编译的时候要使用我们的工具链。

在Makefile中注释掉LDFLAGS_BUILD_ID这个变量:
例如将如下定义:
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/
                  $(call ld-option, -Wl$(comma)--build-id,))
修改为:
LDFLAGS_BUILD_ID=
#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/
#                  $(call ld-option, -Wl$(comma)--build-id,))
把它注释掉的原因是目前android的内核还不支持这个选项。--build-id选项,主要是用于在生成的elf
可执行文件中加入一个内置的id,这样在core dump,或者debuginfo的时候就可以很快定位这个模块是
哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由
哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。
目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。
所以,用#注释掉即可,或者害怕不保险的话,就加入LDFLAGS_BUILD_ID=空,这样即使编译的时候用了,
也只是一个空格而已。
对这个--build-id选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了:
http://fedoraproject.org/wiki/Releases/FeatureBuildId

6)终于可以开始make了。
 $ make
不出意外的话,应该整个过程都会非常顺利,最终会在~/android/kernel/arch/arm/boot目录下面
生成一个zImage,这个就是我们要的内核映像了。

7)激动人心的时刻终于到来了,我们可以测试一下刚刚编译出来的内核可以不可以用了。
 $emulator -kernel ~/android/kernel/arch/arm/boot/zImage
当看到red eye在晃来晃去,最终显示出来android的界面的时候,一颗悬着的心总算放下了。

android的proc里面的version如下:
# cat version
Linux version 2.6.23 (wayne@wayne) (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-51)) #1 Sat Jan 19 18:11:44 HKT 2008
从这里就可以看出,这是自己编译的kernel,而不是人家sdk里面自带的kernel-qemu了。

android自带的sdk里面的kernel映像的version应该是:
# cat version
Linux version 2.6.23-gcc3bc3b4 (arve@arvelnx.corp.google.com) (gcc version 4.2.1) #3 Tue Oct 30 16:28:18 PDT 2007
hoho, 这里不会把这个开发者的email暴露出来了吧。。。

android的cpuinfo如下:
Processor       : ARM926EJ-S rev 5 (v5l)
BogoMIPS        : 313.75
Features        : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5
Cache type      : write-through
Cache clean     : not required
Cache lockdown  : not supported
Cache format    : Harvard
I size          : 4096
I assoc         : 4
I line length   : 32
I sets          : 32
D size          : 65536
D assoc         : 4
D line length   : 32
D sets          : 512

Hardware        : Goldfish
Revision        : 0000
Serial          : 0000000000000000
不过挺奇怪的,google sdk自带的内核映像的BogoMIPS是3.18的,偶编译出来的是3.13的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuandll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值