如何在32位ubuntu11.10 下编译android 4.0.1源码和goldfish内核

如何在32位ubuntu11.10 下编译android 4.0.1源码和goldfish内核,第1张

一准备工作

1安装javasdk6

(1)从jdk官方网站http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u29-download-513648.html下载jdk-6u29-linux-i586.bin文件。

(2)执行jdk安装文件

[html] view plaincopy

$chmod a+x jdk-6u29-linux-i586.bin

$jdk-6u29-linux-i586.bin

(3)配置jdk环境变量

[html] view plaincopy

$sudo vim /etc/profile

[html] view plaincopy

#JAVAEVIRENMENT

exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29

exportJRE_HOME=$JAVA_HOME/jre

exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

保存后退出编辑,并重启系统。

2安装依赖包

[html] view plaincopy

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

zipcurlzlib1g-devlibc6-devlib32ncurses5-devia32-libs\

x11proto-core-devlibx11-devlib32readline5-devlib32z-dev\

libgl1-mesa-devg++-multilibmingw32tofrodospython-markdown\

libxml2-utils

3用repo工具下载源码

(1)初始化repo

[html] view plaincopy

$cd ~

$mkdir bin

$curlhttps://dl-ssl.google.com/dl/googlesource/git-repo/repo>~/bin/repo

$chmod a+x ~/bin/repo

$exportPATH=$PATH:~/bin(导出环境变量)

(2)下载android最新源码

[html] view plaincopy

$mkdir android

$cd android

$ repo init -u https://android.googlesource.com/platform/manifest -bandroid-4.0.1_r1

...(输入用户名和邮箱名)

$repo sync -j5

...(此处用5个线程开始下载源码,下载过程及其漫长,需要耐心等待)

编译源码

1开始编译

[html] view plaincopy

$source build/envsetup.sh

includingdevice/samsung/maguro/vendorsetup.sh

includingdevice/samsung/tuna/vendorsetup.sh

includingdevice/ti/panda/vendorsetup.sh

includingsdk/bash_completion/adb.bash

$make-j4(此处用4个线程编译)

编译完成后,会看到类似的输出:

[html] view plaincopy

Targetramdisk:out/target/product/generic/ramdisk.img

Targetuserdatafsimage:out/target/product/generic/userdata.img

Installedfilelist:out/target/product/generic/installed-files.txt

2编译遇到的问题

编译错误:

[html] view plaincopy

<命令行>:0:0:错误:“_FORTIFY_SOURCE”重定义[-Werror]

<built-in>:0:0:附注: 这是先前定义的位置

cc1plus:所有的警告都被当作是错误

make:*** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o]错误 1

原因:

因机器上的gcc版本过高,需替换成4.4.6重新进行编译。

解决方法:

1)安装4.4版本的gcc和g++

[html] view plaincopy

$ sudo apt-get install gcc-4.4

$ sudo apt-get install g++-4.4

2)设置gcc版本,使gcc链接到gcc-4.4

[html] view plaincopy

$ ls -l /usr/bin/gcc*

lrwxrwxrwx 1 root root 7 2011-11-01 23:56 /usr/bin/gcc ->gcc-4.6

-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 /usr/bin/gcc-4.4

-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 /usr/bin/gcc-4.6

$ cd /usr/bin

$ sudo mv gcc gcc.bak

$ sudo ln -s gcc-4.4 gcc

3)设置g++版本,使g++链接到g++-4.4

[html] view plaincopy

$ sudo mv g++ g++.bak

$ sudo ln -s g++-4.4 g++

4)设置完毕后,重新进行编译即可

3从模拟器启动编译后的镜像文件

1)设置环境变量:

[html] view plaincopy

export PATH=~/android/out/host/linux-x86/bin:$PATH

export ANDROID_PRODUCT_OUT=~/android/out/target/product/generic

其中linux-x86/bin存放模拟器emulator工具,product/generic存在编译后的镜像文件。

2)启动模拟器

[html] view plaincopy

$emulator

emulator:WARNING: system partition size adjusted to match image file (162 MB >66 MB)

启动后的截图:

三 编译androidgoldfish内核

1)进入android4.0.1源码目录,下载goldfish内核源码

[html] view plaincopy

$ mkdir kernel

$ cd kernel

$ git clone http://android.googlesource.com/kernel/goldfish.git

$ cd goldfish

$ git branch -a

* (no branch)

master

remotes/origin/HEAD ->origin/master

remotes/origin/android-goldfish-2.6.29

remotes/origin/master

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

2)修改Makefile

[html] view plaincopy

goldfish$ gedit Makefile

修改

[html] view plaincopy

ARCH ?=$(SUBARCH)

CROSS_COMPILE ?=

[html] view plaincopy

ARCH ?=arm

CROSS_COMPILE ?=arm-eabi-

3)导出交叉编译器目录为环境变量

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

4)编译内核

[html] view plaincopy

goldfish$ make goldfish_armv7_defconfig

goldfish$ make

编译完成后,可看到类似如下的输出:

[html] view plaincopy

OBJCOPY arch/arm/boot/zImage

Kernel: arch/arm/boot/zImage is ready

5)从模拟器中启动内核镜像

[html] view plaincopy

$emulator -kernel ~/android/kernel/goldfish/arch/arm/boot/zImage &

启动模拟器后,可从Settings->System->AboutPhone中查看内核版本信息。

Android和 Linux 是两码事,Android系统是基于 Linux 内核的。我们编译的 Android源码是 Android 系统本身的源码,而内核是指通过原生 Linux 源码移植过来的内核源码,所以它们需要我们分别编译。并且 Android 系统的版本号和 Linux 源码的版本号是没有严格意义上的对应关系的,只要某个版本的 Linux 内核能支撑起某个版本的 Android 系统,那么它们就可以组合使用。内核就不多说了,它在 Android 中的作用跟在其它 Linux 发行版中的作用没什么区别,我们简单介绍一下 Android 文件系统的结构。Linux 系统的启动过程:bootloader(GRUB)---->zImage(Kernel)---->ramdisk(临时根,在内存中)---->rootfs(永久根,在磁盘上)Android 的启动过程:bootloader(厂商提供)---->zImage(Kernel)---->ramdisk(永久根,为了提速所以放在内存中)那么 Android 的 ramdisk 中存放了什么呢,通常分为四个分区:[fat32] 内置存储空间。fat32 不是名字,是分区格式。[system] 系统启动时挂载到system目录[data] 系统启动时挂载到data目录[cache] 相当于swap分区其中 system 分区和 data 分区是 Android 系统中非常重要的两个分区,我们简单介绍一下它们常用的作用。system:[app] xxx.apk | 系统自带的软件安装目录,普通用户无权卸载。像电话本、拨号器、短信等等系统应用都安装在这里。还有许多定制版手机被无良厂商预装了各种无法被卸载的垃圾程序都放在这里。这里的程序都是用 Java 编写的。[framework] xxx.jar | 存放用 Java 编写的库[bin] xxx | 存放本地程序,一般都是由 C/C++/asm 编写[lib] xxx.so | 存放用 C/C++/asm 编写的库data:这个目录在内存中,是android系统的家目录。系统配置文件都在这个分区中,恢复出厂设置通常就是格式化该分区。好了,android 的文件系统就先简单介绍到这了,下面开始今天的正题吧,编译 Linux 内核源码。我手上用的是 Linux 3.5 的内核,并且已经被大神们移植过了,所以我就不再执行 make menuconfig 了,而是直接用大神给做好的配置文件进行编译了。自己还没有研究过怎么移植内核,上次折腾到半夜还失败了,所以这次先老老实实的拿大神移植好的内核做实验,等过段时间研究好了内核移植再拿出来分享。既然有了大神移植好的内核,那么编译起来也就简单多了,过程当中也没有遇到什么坑。[yuhuashi@local android]$ tar xzf linux-3.5-20140422.tgz[yuhuashi@local android]$ cd linux-3.5/[yuhuashi@local linux-3.5]$ cp tiny4412_linux_defconfig .config[yuhuashi@local linux-3.5]$ make -j4......此处省略一万字OBJCOPY arch/arm/boot/zImageKernel: arch/arm/boot/zImage is readyOK,看到上面这两句话我们就知道编译成功了,并且编译好的内核放在了 arch/arm/boot/zImage 这里。可以开始烧写系统到开发板了,鸡冻ing...====================华丽的分割线====================接下来我们将编译好的数据拷贝到SD卡上,然后就可以通过SD卡烧写系统了。首先将友善之臂(Tiny4412 开发板的制造商)提供的 Superboot(就是个 bootloader) 烧写到 SD 卡上,使我们的 SD 卡可以引导起来。1.插入 SD 卡2.查看 SD 卡对应的设备文件[yuhuashi@local tools]$ sudo fdisk -lDisk /dev/sdc: 7948 MB, 7948206080 bytes19 heads, 10 sectors/track, 81704 cylinders, total 15523840 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x00000000Device Boot Start End Blocks Id System/dev/sdc1 155217 15523839 7684311+ b W95 FAT32可见我的 SD 卡是 /dev/sdc,各位在后面看到我的命令中包含 /dev/sdc 或 /dev/sdc1 时,需要替换成你机器上查询出来对应的设备文件路径,千万不要写错了!====前方高能预警,请无关人员立即撤离,相关人员必须在意识清醒的情况下谨慎 *** 作!!!====3.将 Superboot 烧写到 SD 卡上其实可以自己用 read(2)、write(2) 函数等方式烧写,我已经有一个现成的工具了,所以直接就拿来用了。各位如果没有烧写工具可以自己写一个,因为我没有该工具的源码所以就不贴源码了,注意别把分区表覆盖了就行。另外 bootloader 是烧写在设备上的(即/dev/sdc),而不是烧写在分区上的(/dev/sdc1)。[yuhuashi@local tools]$ ./write4412boot Usage:<./write4412boot><boot.bin><dev>[yuhuashi@local tools]$ sudo ./write4412boot ../images_all/Superboot4412.bin /dev/sdc start ...........end ...........4.将 ramdisk-u.img、system.img、userdata.img 以及 linux 内核 linux-x.x/arch/arm/boot/zImage 以及 Superboot4412.bin 拷贝到SD卡images目录下。[yuhuashi@local android-4.2.2_r1]$ mkdir -p /media/yuhuashi/2CAA-71B6/images/Android4.2.2/[yuhuashi@local android-4.2.2_r1]$ cp ramdisk-u.img system.img userdata-4g.img /media/yuhuashi/2CAA-71B6/images/Android4.2.2/[yuhuashi@local android-4.2.2_r1]$ cp userdata-16g.img userdata-8g.img userdata.img /media/yuhuashi/2CAA-71B6/images/Android4.2.2/[yuhuashi@local android-4.2.2_r1]$ cd ..[yuhuashi@local android]$ cd linux-3.5/[yuhuashi@local linux-3.5]$ cp arch/arm/boot/zImage /media/yuhuashi/2CAA-71B6/images/Android4.2.2/[yuhuashi@local android-4.2.2_r1]$ cp ~/arm/class_boot/source/images_all/Superboot4412.bin /media/yuhuashi/2CAA-71B6/images/我们前面已经将 Superboot 烧写到 SD 卡上了,之所以还要再拷贝 一份到 SD 卡上,是因为之前烧写 Superboot 是为了让 SD 卡可以启动,而现在拷贝到 SD 卡上的这份 Superboot 是为了一会儿烧写进 eMMC 中在开发板上引导我们的 Android 系统。注意我拷贝的一个镜像叫做 userdata-4g.img,昨天说过在 Android 编译完成后,我们执行 ./gen-img.sh 命令生成了几个 img 文件,其中包含 userdata-16g.img、userdata-4g.img、userdata-8g.img、userdata.img,这几个镜像适用于不同大小的 eMMC 的设备。一般来说使用 userdata.img 就可以了,但是 友善之臂 的开发板有些特殊,4GB eMMC 的板子必须使用 userdata-4g.img 才行。5.在 SD 卡的 images 文件夹中创建 FriendlyARM.ini 文件[yuhuashi@local images]$ vim FriendlyARM.ini#This line cannot be removed. by FriendlyARM(www.arm9.net)CheckOneButton=NoAction = InstallOS = AndroidLowFormat = NoVerifyNandWrite = NoLCD-Mode = NoCheckCRC32=NoStatusType = Beeper | LED################### Android 4.2.2 ####################Android-BootLoader = Superboot4412.binAndroid-Kernel = Android4.2.2/zImageAndroid-CommandLine = console=ttySAC0,115200n8 androidboot.console=ttySAC0 ctp=2 skipcali=y vmalloc=512m ethmac=1C:6F:65:34:51:7E lcd=S70 uhost=nAndroid-RamDisk =Android4.2.2/ramdisk-u.imgAndroid-RootFs-InstallImage = Android4.2.2/system.imgAndroid-UserData-4G = Android4.2.2/userdata-4g.imgAndroid-UserData-8G = Android4.2.2/userdata-8g.imgAndroid-UserData-16G = Android4.2.2/userdata-16g.imgAndroid-UserData = Android4.2.2/userdata.img注意第一行的注释不要删掉,不然 Superboot 可能无法引导。 完成后卸载掉 SD 卡,然后将卡插入到开发板的插槽中,将启动模式开关拨动到 SD 卡启动。[yuhuashi@local images]$ cd ~[yuhuashi@local ~]$ umount /media/yuhuashi/2CAA-71B6


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8724376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存