LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6767|回复: 4

移植google操作系统android的5个步骤之(一)

[复制链接]
发表于 2008-4-19 22:10:59 | 显示全部楼层 |阅读模式
移植Android到具体硬件--方法及过程详解(1)
国内外很多同行朋友在努力porting Android到具体的硬件平台上。既然有那么多的朋友对此感兴趣,在接下来的几个贴子里,我一步步地讲解自己的移植过程。只可惜我们的板子没有GSM通信模块,不过其他已全部移植成功。
    今天先做第一事件--也是所有移植工作的最初几件事之一,就是build一个支持Android的编译器。这就要求build一个至少能支持ARM926EJ-S CPU指令集及EABI规范的GNU Toolchain。也许有好心的朋友会提醒我:网上可以下载已编译好的toolchain。是的,不过,我还是建议你自己手工做一遍!在本人过去几年的开发生涯中,很多时候得益于对编译器的理解。而你自己一步步地手工build整个编译器的经历,有助于你对编译器的理解和掌握,进而在OS Kernel或其他底层开发中给你带来帮助!
   
    闲话少叙,手工编译GNU Toolchain的步骤如下。我已把详细过程写成一个简单脚本,可从本人blog(http://AndroidSprite.spaces.live ... 完整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
       #先配置uClibc,然后:
       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} \
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
       ${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
      make && make DESTDIR=${TOOLCHAIN_SYSROOT}
   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} \
--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}
      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}- \
all
      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
     make DESTDIR=${TOOLCHAIN_SYSROOT} install
     
     Done!整个过程在本人的AthlonXP 4000+ X2/Core2 Duo T5500 + 1G DDR667上需要约20分钟时间。
     熟悉LFS的朋友应该不难搞定,只是embedded system一般不需要Native Toolchain,故少了第三趟gcc的编译。
 楼主| 发表于 2008-4-19 22:15:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2008-4-26 08:30:10 | 显示全部楼层
顶,感谢楼主工作。虽然我没有生产工具
回复 支持 反对

使用道具 举报

发表于 2008-5-28 16:19:22 | 显示全部楼层
很有吸引力,请继续
回复 支持 反对

使用道具 举报

发表于 2008-6-5 09:09:34 | 显示全部楼层
然后呢? 建立工具链完了。 该rootfs了吧?
U-BOOT呢?

大概给个步骤。呵呵。 :)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表