免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 15779 | 回复: 22

Ubuntu 8.04下编译Android源码全过程 [复制链接]

论坛徽章:
0
发表于 2009-12-07 12:35 |显示全部楼层
 一、获取Android源代码

  Git是Linux Torvalds(Linux之父)为了帮助管理Linux内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库(Repository),许多个工作目录(Working Copy),而在Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNU Arch、Bazaar、Darcs、SVK、Monotone等),每一个工作目录都包含一个完整仓库,它们支持离线工作,本地提交可以稍后提交到服务器上。

  因为Android是由Kernel、Dalvik、Bionic、Prebuilt、build等多个项目组成,如果我们分别使用Git来逐个获取显得很麻烦,所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库,使得项目的获取更加简单。

  在Ubuntu 8.04上安装Git只需要设定正确的更新源,然后使用apt-get就可以了,apt-get是一条Linux命令,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。

  apt-get命令一般需要root权限执行,所以一般跟着sudo命令。

  sudo apt-get install git-core curl

  这条命令会从互联网的软件仓库中安装git-core和curl。

  其中curl是一个利用URL语法在命令行方式下工作的文件传输工具,它支持很多协议,包括FTP、FTPS、HTTP、HTTPS、TELENT等,我们需要安装它从网络上获取Repo脚本文件。

  curl http://android.git.kernel.org/repo >~/bin/repo

  这句命令会下载repo脚本文件到当前主目录的/bin目录下,并保存在文件repo中。

  最后我们需要给repo文件可执行权限

  chmod a+x ~/bin/repo

  接下来我们就可以利用repo脚本和Git、curl软件获取Android的源代码了:)

  首先建一个目录,比如~/android。

  然后使用下面命令获取源码:

  repo init –u git://android.git.kernel.org/platform/manifest.git

  这个过程会持续很长的时间(笔者下载了一天),下载完毕后会看到repo initialized in /android这样的提示,说明本地的版本库已经初始化完毕,并且包含了当前最新的sourcecode。

  如果我们想拿某个分支版本的代码,而不是主线代码,需要使用-b参数指定branch的名字,比如:

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

  如果我们只是想获取某一个project的代码,比如kernel/common,就不需要repo脚本了,直接使用Git工具即可,如果仔细研究repo脚本会发现,repo脚本其实就是组织Git工具去获取各个Project并把它们组织到同一个项目Android内。

  git clone git://android.git.kernel.org/kernel/common.git

  我们上面使用repo脚本获取了各个项目,那么接下来就需要把整个Android代码树同步到本地,如下:

  repo sync project1 project2 …

  笔者使用repo sync命令直接同步全部项目到本地。

  二、源码编译

  全部同步完毕后,进入到Android目录下,使用make命令编译,你会发现出现如下错误提示:

  host C: libneo_cgi <= external/clearsilver/cgi/cgi.c

  external/clearsilver/cgi/cgi.c:22:18: error: zlib.h: No such file or directory

  这个错误是因为我们缺少zlib1g-dev,需要使用apt-get命令从软件仓库中安装,如下:

  sudo apt-get install zlib1g-dev

  同理,我们还需要依次安装如下软件

  sudo apt-get install flex

  sudo apt-get install bison

  sudo apt-get install gperf

  sudo apt-get install libsdl-dev

  sudo apt-get install libesd0-dev

  sudo apt-get install libncurses5-dev

  sudo apt-get install libx11-dev

  以上软件全部安装完毕后,运行make命令再次编译Android源码。

  这个时候你会发现出现很多java文件无法编译的错误,打开Android的源码我们可以看到在android/dalvik/libcore/dom/src/test/java/org/w3c/domts下有很多java源文件,这意味着编译Android之前需要先安装JDK。

  首先从sun官方网站下载jdk-6u16-linux-i586.bin文件并安装它。

  在Ubuntu 8.04中,/etc/profile文件是全局的环境变量配置文件,它适用于所有的shell。在我们登陆Linux系统时,首先启动/etc/profile文件,然后再启动用户目录下的~/.bash_profile、~/.bash_login或~/.profile文件中的其中一个,执行的顺序和上面的排序一样。如果~/.bash_profile文件存在的话,一般还会执行~/.bashrc文件。

  所以我们只需要把JDK的目录放到/etc/profile里即可,如下:

  JAVA_HOME=/usr/local/src/jdk1.6.0_16

  PATH=$PATH:$JAVA_HOME/bin:/usr/local/src/android-sdk-linux_x86-1.1_r1/tools:~/bin

  然后重新启动一下机器,输入java –version命令,提示如下信息代表配置成功:

  java version "1.6.0_16"

  Java(TM) SE Runtime Environment (build 1.6.0_16-b01)

  Java HotSpot(TM) Client VM (build 14.2-b01, mixed mode, sharing)

  在编译完整个项目后,终端会出现如下提示:

  Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img

  Install system fs image: out/target/product/generic/system.img

  Target ram disk: out/target/product/generic/ramdisk.img

  Target userdata fs image: out/target/product/generic/userdata.img

  Installed file list: out/target/product/generic/installed-files.txt

  root@dfsun2009-desktop:/bin/android#

  三、源码运行

  在编译完整个项目后,如果我们需要观看编译后的运行效果,那么就需要在系统中安装模拟器android-sdk-linux_x86-1.1_r1,这个SDK的下载地址为:

  linux: http://dl.google.com/android/android-sdk-linux_x86-1.1_r1.zip

  mac: http://dl.google.com/android/android-sdk-mac_x86-1.1_r1.zip

  windows: http://dl.google.com/android/android-sdk-windows-1.1_r1.zip

  解压后需要把/usr/local/src/android-sdk-linux_x86-1.1_r1/tools目录加入到系统环境变量/etc/profile中。

  然后找到编译后android的目录文件out,我们发现在android/out/host/linux-x86/bin下多了很多应用程序,这些应用程序就是android得以运行的基础,所以我们需要把这个目录也添加到系统PATH下,在$HOME/.profile文件中加入如下内容:

  PATH=”$PATH:$HOME/android/out/host/linux-x86/bin”

  接下来我们需要把android的镜像文件加载到emulator中,使得emulator可以看到android运行的实际效果,在$HOME/.profile文件中加入如下内容:

  ANDROID_PRODUCT_OUT=$HOME/android/out/target/product/generic

  export ANDROID_PRODUCT_OUT

  然后重新启动机器。

  下面就可以进入到模拟器目录中并启动模拟器

  cd $HOME/android/out/target/product/generic

  emulator -image system.img -data userdata.img -ramdisk ramdisk.img

  总结一下安装过程中的关键点:

  1:JDK版本必须安装

  2:利用下面的命令确保所需软件都被正确安装

  sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential python valgrind curl git

  3:内存及虚拟内存保证在2GB以上,可以采用命令行free -m查看内存是否足够,如果内存不够终端停滞

评分

参与人数 1可用积分 +15 收起 理由
chenyx + 15 原创内容

查看全部评分

论坛徽章:
0
发表于 2009-12-07 12:37 |显示全部楼层

Android的源代码结构

Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示:
  1. .
  2. |-- Makefile        (全局的Makefile)
  3. |-- bionic          (Bionic含义为仿生,这里面是一些基础的库的源代码)
  4. |-- bootloader      (引导加载器)
  5. |-- build           (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具)
  6. |-- dalvik          (JAVA虚拟机)
  7. |-- development     (程序开发所需要的模板和工具)
  8. |-- external        (目标机器使用的一些库)
  9. |-- frameworks      (应用程序的框架层)
  10. |-- hardware        (与硬件相关的库)
  11. |-- kernel          (Linux2.6的源代码)
  12. |-- packages        (Android的各种应用程序)
  13. |-- prebuilt        (Android在各种平台下编译的预置脚本)
  14. |-- recovery        (与目标的恢复功能相关)
  15. `-- system          (Android的底层的一些库)
复制代码





      bionic目录展开一个级别的目录如下所示:
  1. bionic/
  2. |-- Android.mk
  3. |-- libc
  4. |-- libdl
  5. |-- libm
  6. |-- libstdc++
  7. |-- libthread_db
  8. `-- linker
复制代码



      bootloader目录展开的两个级别目录:
  1. bootloader/
  2. `-- legacy
  3.     |-- Android.mk
  4.     |-- README
  5.     |-- arch_armv6
  6.     |-- arch_msm7k
  7.     |-- fastboot_protocol.txt
  8.     |-- include
  9.     |-- libboot
  10.     |-- libc
  11.     |-- nandwrite
  12.     `-- usbloader
复制代码



      build目录展开的一个级别的目录如下所示:
  1. build/
  2. |-- buildspec.mk.default
  3. |-- cleanspec.mk
  4. |-- core                       (各种以mk为结尾的文件,它门是编译所需要的Makefile)
  5. |-- envsetup.sh
  6. |-- libs
  7. |-- target                     (包含board和product两个目录,为目标所需要文件)
  8. `-- tools                      (编译过程中主机所需要的工具,一些需要经过编译生成)
复制代码




      其中,core中的Makefile是整个Android编译所需要的真正的Makefile,它被顶层目录的Makefile引用。
      envsetup.sh是一个在使用仿真器运行的时候,用于设置环境的脚本。
      dalvik目录用于提供Android JAVA应用程序运行的基础————JAVA虚拟机。
      development目录展开的一个级别的目录如下所示:
  1. development
  2. |-- apps                       (Android应用程序的模板)
  3. |-- build                      (编译脚本模板)
  4. |-- cmds
  5. |-- data
  6. |-- docs
  7. |-- emulator                   (仿真相关)
  8. |-- host                       (包含windows平台的一些工具)
  9. |-- ide
  10. |-- pdk
  11. |-- samples                    (一些示例程序)
  12. |-- simulator                  (大多是目标机器的一些工具)
  13. `-- tools
复制代码



      在emulator目录中qemud是使用QEMU仿真时目标机器运行的后台程序,skins是仿真时手机的界面。
      samples中包含了很多Android简单工程,这些工程为开发者学习开发Android程序提供了很大便利,可以作为模板使用。
      external目录展开的一个级别的目录如下所示:
external/
|-- aes
|-- apache-http
|-- bluez
|-- clearsilver
|-- dbus
|-- dhcpcd
|-- dropbear
|-- elfcopy
|-- elfutils
|-- emma
|-- esd
|-- expat
|-- fdlibm
|-- freetype
|-- gdata
|-- giflib
|-- googleclient
|-- icu4c
|-- iptables
|-- jdiff
|-- jhead
|-- jpeg
|-- libffi
|-- libpcap
|-- libpng
|-- libxml2
|-- netcat
|-- netperf
|-- neven
|-- opencore
|-- openssl
|-- oprofile
|-- ping
|-- ppp
|-- protobuf
|-- qemu
|-- safe-iop
|-- skia
|-- sonivox
|-- sqlite
|-- srec
|-- strace
|-- tagsoup
|-- tcpdump
|-- tinyxml
|-- tremor
|-- webkit
|-- wpa_supplicant
|-- yaffs2
`-- zlib



      在external中,每个目录表示Android目标系统中的一个模块,可能有一个或者若干个库构成。其中:
      opencore为PV(PacketVideo),它是Android多媒体框架的核心。
      webkit是Android网络浏览器的核心。
      sqlite是Android数据库系统的核心。
      openssl是Secure Socket Layer,一个网络协议层,用于为数据通讯提供安全支持。
      frameworks目录展开的一个级别的目录如下所示:
frameworks/
|-- base
|-- opt
`-- policies



      frameworks是Android应用程序的框架。
      hardware是一些与硬件相关的库
      kernel是Linux2.6的源代码

      packages目录展开的两个级别的目录如下所示:
packages/
|-- apps
|   |-- AlarmClock
|   |-- Browser
|   |-- Calculator
|   |-- Calendar
|   |-- Camera
|   |-- Contacts
|   |-- Email
|   |-- GoogleSearch
|   |-- HTMLViewer
|   |-- IM
|   |-- Launcher
|   |-- Mms
|   |-- Music
|   |-- PackageInstaller
|   |-- Phone
|   |-- Settings
|   |-- SoundRecorder
|   |-- Stk
|   |-- Sync
|   |-- Updater
|   `-- VoiceDialer
`-- providers
    |-- CalendarProvider
    |-- ContactsProvider
    |-- DownloadProvider
    |-- DrmProvider
    |-- GoogleContactsProvider
    |-- GoogleSubscribedFeedsProvider
    |-- ImProvider
    |-- MediaProvider
    `-- TelephonyProvider



      packages中包含两个目录,其中apps中是Android中的各种应用程序,providers是一些内容提供者(在Android中的一个数据源)。
      packages中两个目录的内容大都是使用JAVA编写的程序,各个文件夹的层次结构是类似的。
      prebuilt目录展开的一个级别的目录如下所示:
prebuilt/
|-- Android.mk
|-- android-arm
|-- common
|-- darwin-x86
|-- linux-x86
`-- windows



      system目录展开的两个级别的目录如下所示:
system/
|-- bluetooth
|   |-- bluedroid
|   `-- brfpatch
|-- core
|   |-- Android.mk
|   |-- README
|   |-- adb
|   |-- cpio
|   |-- debuggerd
|   |-- fastboot
|   |-- include            (各个库接口的头文件)
|   |-- init
|   |-- libctest
|   |-- libcutils
|   |-- liblog
|   |-- libmincrypt
|   |-- libnetutils
|   |-- libpixelflinger
|   |-- libzipfile
|   |-- logcat
|   |-- logwrapper
|   |-- mkbootimg
|   |-- mountd
|   |-- netcfg
|   |-- rootdir
|   |-- sh
|   `-- toolbox
|-- extras
|   |-- Android.mk
|   |-- latencytop
|   |-- libpagemap
|   |-- librank
|   |-- procmem
|   |-- procrank
|   |-- showmap
|   |-- showslab
|   |-- sound
|   |-- su
|   |-- tests
|   `-- timeinfo
`-- wlan
    `-- ti

[ 本帖最后由 kns1024wh 于 2009-12-7 12:38 编辑 ]

论坛徽章:
381
CU十二周年纪念徽章
日期:2014-01-04 22:46:58CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52CU大牛徽章
日期:2013-03-14 14:08:55CU大牛徽章
日期:2013-04-17 11:17:19CU大牛徽章
日期:2013-04-17 11:17:32CU大牛徽章
日期:2013-04-17 11:17:37CU大牛徽章
日期:2013-04-17 11:17:42CU大牛徽章
日期:2013-04-17 11:17:47CU大牛徽章
日期:2013-04-17 11:17:52CU大牛徽章
日期:2013-04-17 11:17:56
发表于 2009-12-07 13:54 |显示全部楼层
好文章,收藏先

论坛徽章:
0
发表于 2009-12-07 16:06 |显示全部楼层
强!@

论坛徽章:
0
发表于 2009-12-15 12:48 |显示全部楼层
顶一个!

论坛徽章:
0
发表于 2010-05-18 19:19 |显示全部楼层
百湖的,收藏

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2010-05-18 21:38 |显示全部楼层
学习了啊。不错。虽然我还没有编译过。

论坛徽章:
0
发表于 2010-05-18 22:18 |显示全部楼层
只求会用 不求知其所以然

论坛徽章:
0
发表于 2010-05-19 11:06 |显示全部楼层
一般git clone 还是加上--depth 1 参数为好,
因为不过是为了获取最新代码,要history干嘛
省点带宽吧

论坛徽章:
0
发表于 2010-06-21 12:54 |显示全部楼层
高人呀,配服
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP