移植Android到具体硬件编译器的制作
2010-01-23 15:15
239 查看
国内外很多同行朋友在努力porting Android到具体的硬件平台上。既然有那么多的朋友对此感兴趣,在接下来的几个贴子里,我一步步地讲解自己的移植过程。只可惜我们的板子没有GSM通信模块,不过其他已全部移植成功。
今天先做第一事件--也是所有移植工作的最初几件事之一,就是build一个支持Android的编译器。这就要求build一个至少能支持ARM926EJ-S CPU指令集及EABI规范的GNU Toolchain。也许有好心的朋友会提醒我:网上可以下载已编译好的toolchain。是的,不过,我还是建议你自己手工做一遍!在本人过去几年的开发生涯中,很多时候得益于对编译器的理解。而你自己一步步地手工build整个编译器的经历,有助于你对编译器的理解和掌握,进而在OS Kernel或其他底层开发中给你带来帮助!
闲话少叙,手工编译GNU Toolchain的步骤如下。我已把详细过程写成一个简单脚本,可从本人blog
http://AndroidSprite.spaces.live.com
)下载,所有的步骤已经多人/次测试,直接运行即可生成完整toolchain。
1. 下载组件包 (版本不必与如下所列完全一致,但gcc应取4.0以上):
Android Linux Kernel, binutils-2.18 gcc-4.2.3 uClibc-0.9.29
2. 安装Android kernel及uClibc头文件 (其中KERN_PATH指向Android Kernel所在路径,TOOLCHAIN_SYSROOT为toolchain安装路径)
make -C ${KERN_PATH}
ARCH=arm
INSTALL_HDR_PATH=${TOOLCHAIN_SYSROOT}/usr /
headers_install 5PA*U_Xmr
#先配置uClibc,然后: z Qna;
make /
PREFIX=${TOOLCHAIN_SYSROOT} / 8 /
DEVEL_PREFIX=/usr/
RUNTIME_PREFIX=/
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- / }
HOSTCC=${HOSTCC_PATH} / )fa<(->vp(
pregen
make /
PREFIX=${TOOLCHAIN_SYSROOT} /
DEVEL_PREFIX=/usr/ /
RUNTIME_PREFIX=/ / ;
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- /
HOSTCC=${HOSTCC_PATH} / )
install_headers
3. 编译binutils(里面包括大家所熟知的gnu as, gnu ld, objdump, etc),TARGET_PLATFORM设为"arm-android-linux-uclibcgnueabi"
cd ${BUILD_PATH}/build_binutils QfpO*
${BINUTILS_PATH}/configure /
--prefix=/usr
--build=${BUILD_PLATFORM} /
--host=${BUILD_PLATFORM} /
--target=${TARGET_PLATFORM} /
--with-sysroot=${TOOLCHAIN_SYSROOT}/
--with-float=soft /
--disable-multilib /
--disable-werror Eg
make && make DESTDIR=${TOOLCHAIN_SYSROOT} {Y0]TZ=ZQ*
4. 第一趟gcc编译,指定TARGET_CPU为"arm926ej-s"
cd ${BUILD_PATH}/gcc_pass_1
${GCC_PATH}/configure /
--prefix=${TOOLCHAIN_SYSROOT}/usr /
--build=${BUILD_PLATFORM} /
--host=${BUILD_PLATFORM} /
--target=${TARGET_PLATFORM} /
--enable-languages=c /
--with-sysroot=${TOOLCHAIN_SYSROOT} / 0/B /
--disable-__cxa_atexit /
--enable-target-optspace /
--with-gnu-ld /
--disable-shared /
--enable-threads /
--enable-tls /
--enable-long-long /
--disable-multilib /
--with-float=soft /
--with-cpu=${TARGET_CPU} /
--with-tune=${TARGET_CPU} y Z
make all-gcc && make install-gcc
5. 编译uClibc
cd ${UCLIBC_PATH}
make /
PREFIX=/ / /
DEVEL_PREFIX=/ /
RUNTIME_PREFIX=/ /
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- / T}
make /
PREFIX=${TOOLCHAIN_SYSROOT} /
DEVEL_PREFIX=/usr/ /
RUNTIME_PREFIX=/ /
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- /
install_runtime install_dev
6. 第二趟编译gcc
cd ${BUILD_PATH}/gcc_pass_2
${GCC_PATH}/configure /
--prefix=/usr /
--build=${BUILD_PLATFORM} /
--host=${BUILD_PLATFORM} /
--target=${TARGET_PLATFORM} /
--enable-languages=c,c /
--with-sysroot=${TOOLCHAIN_SYSROOT} /
--with-build-time-tools=${TOOLCHAIN_SYSROOT}/usr/${TARGET_PLATFORM}/bin /
--disable-__cxa_atexit /
--enable-target-optspace /
--with-gnu-ld /
--enable-shared /
--enable-threads /
--with-tls /
--disable-multilib /
--enable-long-long /
--with-float=soft / --with-cpu=${TARGET_CPU} /
--with-tune=${TARGET_CPU}
make all W
make DESTDIR=${TOOLCHAIN_SYSROOT} install yE /
Done!整个过程在本人的AthlonXP 4000 X2/Core2 Duo T5500 1G DDR667上需要约20分钟时间。
熟悉LFS的朋友应该不难搞定,只是embedded system一般不需要Native Toolchain,故少了第三趟gcc的编译。
今天先做第一事件--也是所有移植工作的最初几件事之一,就是build一个支持Android的编译器。这就要求build一个至少能支持ARM926EJ-S CPU指令集及EABI规范的GNU Toolchain。也许有好心的朋友会提醒我:网上可以下载已编译好的toolchain。是的,不过,我还是建议你自己手工做一遍!在本人过去几年的开发生涯中,很多时候得益于对编译器的理解。而你自己一步步地手工build整个编译器的经历,有助于你对编译器的理解和掌握,进而在OS Kernel或其他底层开发中给你带来帮助!
闲话少叙,手工编译GNU Toolchain的步骤如下。我已把详细过程写成一个简单脚本,可从本人blog
http://AndroidSprite.spaces.live.com
)下载,所有的步骤已经多人/次测试,直接运行即可生成完整toolchain。
1. 下载组件包 (版本不必与如下所列完全一致,但gcc应取4.0以上):
Android Linux Kernel, binutils-2.18 gcc-4.2.3 uClibc-0.9.29
2. 安装Android kernel及uClibc头文件 (其中KERN_PATH指向Android Kernel所在路径,TOOLCHAIN_SYSROOT为toolchain安装路径)
make -C ${KERN_PATH}
ARCH=arm
INSTALL_HDR_PATH=${TOOLCHAIN_SYSROOT}/usr /
headers_install 5PA*U_Xmr
#先配置uClibc,然后: z Qna;
make /
PREFIX=${TOOLCHAIN_SYSROOT} / 8 /
DEVEL_PREFIX=/usr/
RUNTIME_PREFIX=/
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- / }
HOSTCC=${HOSTCC_PATH} / )fa<(->vp(
pregen
make /
PREFIX=${TOOLCHAIN_SYSROOT} /
DEVEL_PREFIX=/usr/ /
RUNTIME_PREFIX=/ / ;
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- /
HOSTCC=${HOSTCC_PATH} / )
install_headers
3. 编译binutils(里面包括大家所熟知的gnu as, gnu ld, objdump, etc),TARGET_PLATFORM设为"arm-android-linux-uclibcgnueabi"
cd ${BUILD_PATH}/build_binutils QfpO*
${BINUTILS_PATH}/configure /
--prefix=/usr
--build=${BUILD_PLATFORM} /
--host=${BUILD_PLATFORM} /
--target=${TARGET_PLATFORM} /
--with-sysroot=${TOOLCHAIN_SYSROOT}/
--with-float=soft /
--disable-multilib /
--disable-werror Eg
make && make DESTDIR=${TOOLCHAIN_SYSROOT} {Y0]TZ=ZQ*
4. 第一趟gcc编译,指定TARGET_CPU为"arm926ej-s"
cd ${BUILD_PATH}/gcc_pass_1
${GCC_PATH}/configure /
--prefix=${TOOLCHAIN_SYSROOT}/usr /
--build=${BUILD_PLATFORM} /
--host=${BUILD_PLATFORM} /
--target=${TARGET_PLATFORM} /
--enable-languages=c /
--with-sysroot=${TOOLCHAIN_SYSROOT} / 0/B /
--disable-__cxa_atexit /
--enable-target-optspace /
--with-gnu-ld /
--disable-shared /
--enable-threads /
--enable-tls /
--enable-long-long /
--disable-multilib /
--with-float=soft /
--with-cpu=${TARGET_CPU} /
--with-tune=${TARGET_CPU} y Z
make all-gcc && make install-gcc
5. 编译uClibc
cd ${UCLIBC_PATH}
make /
PREFIX=/ / /
DEVEL_PREFIX=/ /
RUNTIME_PREFIX=/ /
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- / T}
make /
PREFIX=${TOOLCHAIN_SYSROOT} /
DEVEL_PREFIX=/usr/ /
RUNTIME_PREFIX=/ /
KERNEL_HEADERS=${TOOLCHAIN_SYSROOT}/usr/include /
CROSS=${TOOLCHAIN_SYSROOT}/usr/bin/${TARGET_PLATFORM}- /
install_runtime install_dev
6. 第二趟编译gcc
cd ${BUILD_PATH}/gcc_pass_2
${GCC_PATH}/configure /
--prefix=/usr /
--build=${BUILD_PLATFORM} /
--host=${BUILD_PLATFORM} /
--target=${TARGET_PLATFORM} /
--enable-languages=c,c /
--with-sysroot=${TOOLCHAIN_SYSROOT} /
--with-build-time-tools=${TOOLCHAIN_SYSROOT}/usr/${TARGET_PLATFORM}/bin /
--disable-__cxa_atexit /
--enable-target-optspace /
--with-gnu-ld /
--enable-shared /
--enable-threads /
--with-tls /
--disable-multilib /
--enable-long-long /
--with-float=soft / --with-cpu=${TARGET_CPU} /
--with-tune=${TARGET_CPU}
make all W
make DESTDIR=${TOOLCHAIN_SYSROOT} install yE /
Done!整个过程在本人的AthlonXP 4000 X2/Core2 Duo T5500 1G DDR667上需要约20分钟时间。
熟悉LFS的朋友应该不难搞定,只是embedded system一般不需要Native Toolchain,故少了第三趟gcc的编译。
相关文章推荐
- 移植Android到具体硬件--方法及过程详解
- android系统硬件OpenGL 3D 移植
- 和菜鸟一起学android4.0.3源码之硬件gps简单移植
- 在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。文章通过一个具体的例子说明了这些嵌入式交叉编译开发工具的制作过程。 随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来
- 移植Debian到Android(转)--用于文件系统制作参考
- Nand flash驱动移植及带硬件Ecc的Jffs2文件系统制作
- 抛砖引玉,谈谈Android移植到现有硬件平台的可行性
- android BSP与硬件相关子系统读书笔记(1)android BSP移植综述
- 和菜鸟一起学android4.0.3源码之硬件gps简单移植
- android系统移植emmc记录(1) --制作SD卡启动u-boot
- 不同硬件平台上移植Android的Camera系统
- 和菜鸟一起学android4.0.3源码之硬件gps简单移植
- 安卓Android ROM定制、移植,安卓软件反编译、汉化实战教程第七篇:ROM单刷包的制作即刷机语法
- Porting PHP to Android——没有具体移植过程
- 和菜鸟一起学android4.0.3源码之硬件gps简单移植
- android系统硬件OpenGL 3D 移植
- android系统硬件OpenGL 3D 移植
- android BSP与硬件相关子系统读书笔记(1)android BSP移植综述
- 嵌入式S5PV210 硬件DIY uboot ,kernel ,android移植QQ群(27100460)群委员会2013年年终总结
- android系统移植emmc记录(1) --制作SD卡启动u-boot