《深入理解Android》一1.1 Android全源码开发环境

1.1 Android全源码开发环境

Android 2.3版本以后谷歌官方推荐在64位Linux系统上编译其源代码,推荐的编译平台是Ubuntu LTS 10.04/12.04。

1.1.1 PC配置建议

Android源码包很大,源码至少3.5GB以上,包含git版本信息约增加一倍空间,编译输出的out目录10GB以上,因此交叉编译的代码量是相当大的。有人曾用DELL Latitude E5410(i3机型)Ubuntu实体机(非虚拟机)做首次编译,整整花了10个小时。所谓“工欲善其事必先利其器”,推荐使用高配置主机,例如:
CPU:Intel i7-4770;
内存:16GB DDR3-1600;
硬盘:500GB以上。

1.1.2 Ubuntu系统安装

Ubuntu的常见安装方法有:
1)使用光盘安装最简单,将刻录有ubuntu-12.04LTS-AMD64.iso的光盘插入光驱,重新启动机器,按照Ubuntu提示安装即可。
 如果不方便刻录光盘,可以采用制作USB系统盘的方式安装。
2)使用iso硬盘安装,适合Windows 7/Ubuntu双系统。预先对硬盘分区,为Ubuntu预留的总分区空间应该在60GB以上,安装easybcd启动管理工具,将ubuntu-12.04LTS-AMD64.iso中casper目录下的vmlinuz和initrd.lz两个文件解压到C盘根目录,启动easybcd,添加一个NeoGrub条目,配置启动项目如下:

title Install Ubuntu
root (hd0,0)
kernel (hd0,0)/vmlinuz boot=casper
iso-scan/filename=/ubuntu-13.04-desktop-i386.iso ro quiet splash
locale=zh_CN.UTF-8
initrd (hd0,0)/initrd.lz

重新启动机器,选择Ubuntu启动项,就进入安装界面,按照提示完成安装。
3)通过Vmware或VirtualBox软件,将Ubuntu安装到虚拟机里,这种方法会降低Ubuntu的性能,但是优点是可同时运行Windows和Ubuntu两种操作系统,适合机器配置比较高的用户。
为方便开发,Ubuntu系统安装好后一般还需要配置SSH和Samba服务,以便通过其他终端(比如安装有Windows系统的笔记本电脑)来控制系统以及访问系统中的文件。

1.1.3 Ubuntu下Android编译环境搭建

Ubuntu系统安装完毕后,需要更新和安装Android编译环境需要的系统工具包,以及配置JDK等。
(1)安装sun-java6-jdk包
由于版权问题,Ubuntu社区不再对sun-java6-jdk提供支持,用户需要从Oracle官方网站下载安装包jdk-6u45-linux-x64.bin。
安装过程:

$ chmod u+x jdk-6u45-linux-x64.bin
$ ./jdk-6u45-linux-x64.bin
$ sudo mv jdk1.6.0_45 /opt
$sudo update-alternatives --install "/usr/bin/java"
"java" "/opt/jdk1.6.0_45/bin/java" 1
$sudo update-alternatives --install "/usr/bin/javac"
"javac" "/opt/jdk1.6.0_45/bin/javac" 1
$sudo update-alternatives --install "/usr/lib/mozilla/plugins/libjavaplugin.so"
"mozilla-javaplugin.so" "/opt/jdk1.6.0_45/jre/lib/amd64/libnpjp2.so" 1
$ sudo update-alternatives --install "/usr/bin/javaws" "javaws"
"/opt/jdk1.6.0_45/bin/javaws"
选择默认的JDK版本(sun-java6-jdk):
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac

设置环境变量:

export JAVA_HOME=/opt/jdk1.6.0_45/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

(2) 安装依赖包

$ sudo apt-get install git gnupg flex bison gperf build-essential \
  zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
  libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos \
  python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1
/usr/lib/i386-linux-gnu/libGL.so

至此,环境搭建完成。
 如果读者使用其他的Linux 发行版搭建编译环境,可进入Android官方网站http://source.android.com/source/initializing.html参考环境搭建方法。

1.1.4 工作目录设置

Android源码大约占用8.5GB的硬盘空间,至少需要30GB可用空间完成编译。我们假定下载到用户的HOME目录下,因此/home目录所在分区剩余空间不能少于30GB。

1.1.5 源代码下载

Android的官方源码放在Google git服务器上,通过Google提供的repo脚本同步到本地。步骤如下:

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir $HOME/android
$ cd $HOME/android
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.2_r1
$ repo sync

以上步骤,先通过curl下载repo脚本,再通过repo脚本下载Android源码,在repo init时可以指定分支,比如本次是 android-4.2_r1,说明要下载android 4.2 release 1的源码。如果网络不好,repo sync花的时间非常长,而且经常中断,可以用如下简单脚本来sync代码:

repo sync
while [ $? -ne 0 ]
do
    repo sync
done

此外,也可以通过git命令实现单个git库下载。需要在repo init产生.repo目录后,按照.repo/manifest.xml中的工程描述来逐个下载:

$git clone https://android-review.googlesource.com/build
$git clone https://android-review.googlesource.com/abi/cpp
......

下载源码耗时很长,比较痛苦,可以在下载时建立本地镜像,方便下次同步代码:

$ mkdir -p /usr/local/aosp/mirror
$ cd /usr/local/aosp/mirror
$ repo init -u https://android.googlesource.com/mirror/manifest --mirror
$ repo sync

这样在本机/usr/local/aosp/mirror建立了源码树,下次同步源码时就不用在网络上下载了,而只需:

$ mkdir -p /usr/local/aosp/master
$ cd /usr/local/aosp/master
$ repo init -u /usr/local/aosp/mirror/platform/manifest.git
$ repo sync

1.1.6 整体编译Android源代码

编译步骤如下:

$ cd $HOME/android/android-4.2_r1    //进入源码目录
$ source build/envsetup.sh    //初始化环境变量
$ lunch aosp_arm-eng         //选择目标开发板
$ make -j8                 //编译

命令中source和launch两步的目的在于配置环境变量,如果不开新的终端,source和launch 只运行一次就可以了。编译参数-j8的作用是启动多核并行编译,可显著提高编译速度。-jn中的n取决于CPU的核心数,一般设置为“CPU核心数 * 2”。如果没有运行launch,会提示用户选择编译目标,每一个编译目标格式是BUILD-BUILDTYPE,其中BUILD是产品名称,BUILDTYPE是编译类型。常见的BUILD如下:
aosp_arm:模拟器,包含所有语言、apps、输入法。
aosp_maguro:maguro设备,可运行在Galaxy Nexus GSM/HSPA+上。
aosp_panda:panda设备,运行在PandaBoard设备上。
常见的BUILDTYPE如下:
user:最终用户机,无root,限制访问。
userdebug:调试测试机有root权限,有调试工具。
eng:工程机,带有全部调试符号。
编译输出在out/target/product/xx/system/,其中xx代表某产品,比如generic表示模拟器,maguro代表Galaxy nexus.system/app是所有apk目录,lib是so库的目录。与WebKit浏览器关联的Browser.apk和libwebcore.so就分别在这两个目录。
带调试符号的so库输出在out/target/product/xx/symbol/system/lib/,调试native 代码(比如WebKit)时,就会用到这些带有符号的.so文件。

1.1.7 单个模块按需编译

编译单个模块,可以在Android源码主目录“make 模块名”编译,比如编译Browser模块:

$ make -j8 Browser

模块名可以是多个。也可以进到模块目录,用mm命令编译。mm是source build/envsetup.sh定义的bash函数:

$ cd packages/apps/Browser
$ mm

如果要查看编译中make实际做了什么事情,要加上showcommands参数:

$ mm showcommands

1.1.8 编译生成本地Android SDK

进入Android源码目录,设置环境,运行make生成sdk:

make sdk

上述命令生成文件out/host/linux-x86/sdk/android-sdk_eng.xxxx_linux-x86.zip。在Android源码编译成功的基础上重新编译带自己API的android.jar需要进行以下几步操作:
添加自己源代码:在Android源码frameworks/base目录下新建一个文件夹保存代码,如tv,以包的形式命名添加文件所在的路径,如/tv/java/android/tv,并将相应的包的名称定义在目录内Java文件的头部。
修改makefile文件。
庑薷腷uild/core/pathmap.mk文件,在FRAMEWORKS_BASE_SUBDIRS变量后添加tv,代码如下(makefile文件中的语句以Tab键空格开头):

FRAMEWORKS_BASE_SUBDIRS := \
     $(addsuffix /java,\
    core\
    graphics\
    location\
    media\
    opengl\
    sax\
    telephony\
    wifi\
    vpn\
    keystore\
    tv\
    )

庑薷膄rameworks/base/Android.mk文件,在packages_to_document变量后添加自己源代码的包名称,如android/tv,结果如下(makefile文件中的语句以Tab键空格开头):

packages_to_document := \
         android \
         javax/microedition/khronos android/tv

在Ubuntu命令行终端使用如下命令进行编译:

make clean
make update-api
make PRODUCT-sdk-sdk

最后一行也可以用如下两个命令代替:

make –j4 sdk

android.jar文件所在的目录为:/out/target/common/obj/PACKAGING/android_jar_interme-diates/android.jar,并在/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_inter-me diates/src目录下重新以package形式组织所有生成到android.jar中的源代码。
SDK所在目录为out/host/linux-x86/sdk/,生成的SDK文件目录和压缩包为:android-sdk_eng.xxx_linux-x86.zip(xxx为自己Android源码所在的根目录文件名)。

时间: 2024-09-25 14:29:40

《深入理解Android》一1.1 Android全源码开发环境的相关文章

Android入门之使用eclipse进行源码开发的方法_Android

本文实例讲述了Android入门之使用eclipse进行源码开发的方法.分享给大家供大家参考,具体如下: 一.版本说明: 1. eclipse for javaEE 3.5.2 2. jdk1.6 3. adt12.0 4. linux/Ubuntu10.04 或者 linux/ubuntu10.10 二.准备工作: 1. 下载 Android2.3.7 源码 欲了解具体内容可以参看 android 官网. 2. 编译源码 必须编译源码,否则会引发很多问题.记住:如果下载没问题的话,编译只是时间

Android入门之使用eclipse进行源码开发的方法

本文实例讲述了Android入门之使用eclipse进行源码开发的方法.分享给大家供大家参考,具体如下: 一.版本说明: 1. eclipse for javaEE 3.5.2 2. jdk1.6 3. adt12.0 4. linux/Ubuntu10.04 或者 linux/ubuntu10.10 二.准备工作: 1. 下载 Android2.3.7 源码 欲了解具体内容可以参看 android 官网. 2. 编译源码 必须编译源码,否则会引发很多问题.记住:如果下载没问题的话,编译只是时间

Android入门之源码开发基础教程_Android

本文讲述了Android入门之源码开发基础教程.分享给大家供大家参考,具体如下: 下载 Android 源码之后,接下来就是学习或者进行开发. 在开发之前,谈一些开发必备知识或者工具,工欲善其事必先利其器嘛! 在前面一篇<Android入门之使用eclipse进行源码开发的方法>中基本上说了开发使用工具. 但是我们如何使用模拟器开发呢?! 当然你去删除或者增加app到模拟器就不可以按常规来操作了,花 5 -10 分钟了解一下,如果你有需要. 0. 编译源码 直接在下载的源码根目录下面,执行:

Android入门之源码开发基础教程

本文讲述了Android入门之源码开发基础教程.分享给大家供大家参考,具体如下: 下载 Android 源码之后,接下来就是学习或者进行开发. 在开发之前,谈一些开发必备知识或者工具,工欲善其事必先利其器嘛! 在前面一篇<Android入门之使用eclipse进行源码开发的方法>中基本上说了开发使用工具. 但是我们如何使用模拟器开发呢?! 当然你去删除或者增加app到模拟器就不可以按常规来操作了,花 5 -10 分钟了解一下,如果你有需要. 0. 编译源码 直接在下载的源码根目录下面,执行:

Android View事件分发和消费源码简单理解

Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开的感觉. 很重要的学习方法:化繁为简,只抓重点. 源码一坨,不要指望每一行代码都看懂.首先是没必要,其次大量非关键代码会让你模糊真正重要的部分. 以下也只是学姐的学习成果,各位同学要想理解深刻,还需要自己亲自去看源码. 2.源码分析 由于源码实在太长,而且也不容易看懂,学姐这里就不贴出来了,因为没必

月下载量上千次Android实现二维码生成器app源码分享_Android

在360上面上线了一个月,下载量上千余次.这里把代码都分享出来,供大家学习哈!还包括教大家如何接入广告,赚点小钱花花,喜欢的帮忙顶一个,大神见了勿喷,小学僧刚学Android没多久.首先介绍这款应用:APP是一款二维码生成器,虽然如何制作二维码教程网上有很多,我这里再唠叨一下并把我的所有功能模块代码都分享出来. 在这里我们需要一个辅助类RGBLuminanceSource,这个类Google也提供了,我们直接粘贴过去就可以使用了 package com.njupt.liyao; import c

《Android的设计与实现:卷I》——第1章 1.5Android源码开发工具的配置和使用

1.5 Android源码开发工具的配置和使用 Android源码开发需要安装配置Android SDK.Eclipse +ADT插件以及Source Insight工具,Android SDK中提供了大量的命令行工具供开发者操作设备和调试源代码:Eclipse+ADT插件用于开发和调试应用层以及应用框架层Java部分代码:Source Insight是阅读Android全部源代码的必备工具,但不具备调试功能.本节将分别介绍这三种工具的安装和使用. 1.5.1 配置Android SDK 步骤1

android recovery升级时执行的程序源码在哪里??

问题描述 android recovery升级时执行的程序源码在哪里?? 我再详细说明一下:当从应用层跳转到recovery后,如果执行升级,执行的程序对应的源码位置在哪里(个人感觉好像不是bootable/recovery下面的recovery.cpp) 解决方案 recovery.cpp算是整个recovery的入口吧,你还得看看 bootable/recovery/updater下的install.c, 这个会生成脚本程序(印象中是python脚本), 脚本程序又是根据升级包update.

Android 简单的图片查看器源码实现

本文介绍了Android 简单的图片查看器源码实现,分享给大家,具体如下: public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建handler 对象 // private Handler handler = new Handler(){ // // //处理消息 // public void handleMessage(android.os.Message