Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145821
  • 博文数量: 33
  • 博客积分: 667
  • 博客等级: 中士
  • 技术积分: 277
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-27 11:18
文章分类

全部博文(33)

文章存档

2014年(1)

2013年(2)

2012年(11)

2011年(19)

分类: 嵌入式

2011-08-30 23:31:44

学习了Android的版本管理工具Git和Repo之后,已经迫不及待的要下载Android的源代码、编译并运行了。(注:本文是基于Ubuntu11.04)

初始化编译环境
  • 下载Android全部代码大概需要2G的磁盘空间,编译Android源码则至少需要10G的磁盘空间。所以,在开始之间最好先检查下系统的可用空间
    1. $ df -h
    2. Filesystem Size Used Avail Use% Mounted on
    3. /dev/sda8   37G  23G   13G  65% /
  • 安装JDK
    Ubuntu默认的包管理配置文件中不包含SUN JDK的地址,可以采用如下方法将其包仓库的地址通知给APT,并下载安装:
    1. $ sudo add-apt-repository "deb lucid partner"
    2. $ sudo add-apt-repository "deb-src ubuntu lucid partner"
    3. $ sudo apt-get update
    4. $ sudo apt-get install sun-java6-jdk
  • 安装Android编译所必须的包
    1. $ sudo apt-get install git-core gnupg flex bison gperf build-essential \
    2. zip curl zlib1g-dev libc6-dev libncurses5-dev \
    3. x11proto-core-dev libx11-dev libreadline5-dev \
    4. libgl1-mesa-dev g++-multilib mingw32 tofrodos
    (注:和Android官网提供的安装手册不一致的是,在Ubuntu11.04中,lib32ncurses5-dev和lib32readline5-dev包名字有所改变,ia32-libs和lib32z-dev已经不存在了,但是不影响编译运行)
  • 配置USB访问权限
    在Ubuntu系统中,普通用户默认情况下是不能直接访问USB设备的。但是,可以通过创建文件/etc/udev/rules.d/51-android.rule,并添加如下内容来配置用户可以访问USB设备:
    1. # adb protocol on passion (Nexus One)
    2. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER=""
    3. # fastboot protocol on passion (Nexus One)
    4. SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER=""
    5. # adb protocol on crespo (Nexus S)
    6. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER=""
    7. # fastboot protocol on crespo (Nexus S)
    8. SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER=""
下载Android源代码
  • 采用Android源码学习(2)使用Git和Repo进行版本管理所述的方法下载源代码
  • 如果之前没有指定分支,可以通过如下方法指定分支,并更新代码
    1. $ repo init -b gingerbread
    2. $ repo sync
  • repo sync命令的作用就是下载整个Android源码到本地,这个操作时间较长,具体时间和网速有关(我整整下载了一宿)。
源码编译
  • 初始化环境变量
    1. $ source build/envsetup.sh
    2. including device/htc/passion/vendorsetup.sh
      including device/samsung/crespo4g/vendorsetup.sh
      including device/samsung/crespo/vendorsetup.sh
  • 配置编译目标
    1. $ lunch
    2. You're building on Linux

    3. Lunch menu... pick a combo:
    4. 1. generic-eng
    5. 2. simulator
    6. 3. full_passion-userdebug
    7. 4. full_crespo4g-userdebug
    8. 5. full_crespo-userdebug

    9. Which would you like? [generic-eng]

    10. ============================================
    11. PLATFORM_VERSION_CODENAME=REL
    12. PLATFORM_VERSION=2.3.5
    13. TARGET_PRODUCT=generic
    14. TARGET_BUILD_VARIANT=eng
    15. TARGET_SIMULATOR=false
    16. TARGET_BUILD_TYPE=release
    17. TARGET_BUILD_APPS=
    18. TARGET_ARCH=arm
    19. HOST_ARCH=x86
    20. HOST_OS=linux
    21. HOST_BUILD_TYPE=release
    22. BUILD_ID=GINGERBREAD
    23. ============================================
  • 编译源码
    1. $ make -j4
运行模拟器
编译成功后,生成的全部目标文件都在源码所在目录的out目录下。在运行模拟器,体验Android之前,需要添加如下环境变量到你的.profile文件中:
  1. export ANDROID_SRC=${HOME}/android/source
  2. export ANDROID_OUT=${ANDROID_SRC}/out
  3. export PATH=${PATH}:${ANDROID_OUT}/host/linux-x86/bin
  4. export ANDROID_PRODUCT_OUT=${ANDROID_OUT}/target/product/generic
然后,重新开启新终端,使刚才的设置生效,在命令行运行如下命令
  1. $ emulator
终于看到了Android桌面了


编译错误解决方法备注
  • 如果在Ubuntu11.10上编译Android,遇到如下错误
    1. host C++: libutils <= frameworks/base/libs/utils/RefBase.cpp
    2. frameworks/base/libs/utils/RefBase.cpp: In member function ‘void android::RefBase::weakref_type::trackMe(bool, bool)’:
    3. frameworks/base/libs/utils/RefBase.cpp:507:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive]
    4. make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] Bd 1
    解决方法:
    1. cd frameworks/base/
    2. git cherry-pick c4fbbe06
  • 如果在Ubuntu11.10上编译Android,遇到如下错误
    1. host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp
    2. :0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]
    3. :0:0: note: this is the location of the previous definition
    4. cc1plus: all warnings being treated as errors
    5. make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/
    6. Main.o] Error 1
    解决方法:
    Ubuntu11.10默认提供的gcc和g++版本为4.6,安装版本为4.4的gcc和g++就可以解决此编译问题。
阅读(2903) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

emili2011-08-31 15:04:15

chinaunix的blog真的没有csdn的好用,你看到了Android桌面了吗?