在Ubuntu中下载、编译Android源码

来源:互联网 发布:146总决赛詹姆斯数据 编辑:程序博客网 时间:2024/05/09 11:07


本文基于VMware虚拟机以及Ubuntu系统,使用清华大学镜像源aosp:

一.系统准备

(一)下载VMware虚拟机,最好12.0以上版本

(二)下载Ubuntu系统ios镜像

(三)将Ubuntu系统安装至VMware虚拟机中,内核*2,线程*2,内存2G,硬盘50G。

详情请参考上篇博文:VMwareUbuntu安装详解

 

二.工具准备

(一)安装Git工具

$ sudo apt-get install git

$ git config –global user.email "xx@gmail.com"  (谷歌邮箱)

$ git config –global user.name “xxx”  (用户名)

(二)安装Java JDK(版本需要与Android源码对应)

  1.下载Oracle Jdk

到官网下载linux版本的jdk。选择自己对应的操作系统及32或64位版本,这里我下载的是64位版本的jdk-7u79-linux-x64.tar.gz

  2.安装JDK

   a.创建Java的目标路径文件夹,这里我们放在usr/lib/jdk下面。在终端下操作:$  sudo mkdir /usr/lib/jdk

之后输入你的密码完成创建

  b.解压你下载的jdk压缩文件至你创建的目录,用以下命令:

$ sudo tar -C/usr/lib/jdk -xzf jdk-7u79-linux-x64.tar.gz

注意把你的jdk文件放到你的主页home下

  c.查看本机上是否还有java可选。这里用到以下命令

$ sudoupdate-alternatives --list java

如果显示”错误”,系统中没有java可选.

   d.配置环境变量命令:

$sudo gedit~/.bashrc

添加以下代码:

export JAVA_HOME=/usr/lib/jdk/jdk1.7.0_79  

exportJRE_HOME=${JAVA_HOME}/jre 

exportCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 

exportPATH=${JAVA_HOME}/bin:$PATH

e.查看是否配置成功:java -version,如果显示版本号,则成功。

(三)安装curl(用于下载、安装repo)

$ sudo apt-get install curl

(四)安装repo

$ mkdir ~/bin  (创建文件夹)

$ PATH=~/bin:$PATH  (设置path路径)

$ curlhttps://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  (下载)

##如果上述 URL 不可访问,可以用下面的:

$ curl https://storage-googleapis.lug.ustc.edu.cn/git-repo-downloads/repo> ~/bin/repo

$ chmod a+x~/bin/repo   (授权)

 

三.下载源码

(一)建立源码文件夹

$ mkdir AndroidSource

$ cd AndroidSource

(二)初始化仓库

   我们将上面的AndroidSource文件夹作为仓库,现在需要来初始化这个仓库了.通过执行初始化仓库命令可以获取AOSP项目master上最新的代码并初始化该仓库,命令如下:

$ repo init -uhttps://aosp.tuna.tsinghua.edu.cn/platform/manifest

或者使用:

$ repo init -u git://aosp.tuna.tsinghua.edu.cn/aosp/platform/manifest

如果执行该命令的过程中,如果提示无法连接到 gerrit.googlesource.com,那么我们只需要编辑~/bin/repo文件,找到REPO_URL这一行,然后将其内容修改为:

REPO_URL ='https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'


补充说明:

不带参数的manifest命令用于获取master上最新的代码,但是可以通过-b参数指定获取某个特定的android版本,比如我们想要获取android-4.0.1_r1分支,那么命令如下:

$ repo init -uhttps://aosp.tuna.tsinghua.edu.cn/platform/manifest-b android-4.0.1_r1

(三)同步源码到本地

初始化仓库之后,就可以开始正式同步代码到本地了,命令如下:

repo sync


然后就是漫长的等待。。。。。

为了防止网络不稳定而导致中断,我们可以使用脚本命令下载:

1. 创建脚本download.sh

  #!/bin/bash    

    echo "======start reposync======"    

    repo sync    

    while [ $? == 1 ]; do    

    echo "======sync failed, re-syncagain======"    

    sleep 3    

    repo sync    

    done


2.$ chomda+x download.sh  赋予权限让其可以运行

3.$ ./download.sh开始下载

 

附:由于首次同步需要下载 19GB 数据,过程中任何网络故障都可能造成同步失败,建议直接使用初始化包进行初始化。
1.下载初始包

#下载重试不限次数,防止网络异常中断

$ wget -c -t 0 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar

tar -vxzf aosp-latest.tar             (如下载中断,此语句可重复使用,也可直接用迅雷下载)

 

下载后,解压到aosp文件夹中

$ cd aosp

#这时ls的话什么也看不到,因为只有一个隐藏的.repo目录

$ repo sync(这里直接同步的话就是最新版的代码,想下载特定版本,请看下一步)

 

 

2选择版本同步

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest-b android-4.0.1_r1

repo sync -j4(后缀的意思是4线程下载,清华的源最大支持4线程)

下载好了就是下图(ctrl+h显示隐藏目录)

 

源代码目录含义:

目录名

描述

abi

应用程序二进制接口

bionic

C/C++运行时库,在NDK程序中很大一部分调用就是这里的程序

bootable

用于Android装载和启动程序,其中就包括bootloader和recovery。bootloader是Android中唯一在LInux内核之前执行的程序。通过这段程序可以初始化硬件,建立内存控件的映射图等,总之,bootloader就是为LInux内核准备合适的运行环境。

build

用于编译Android源代码以及建议system.img,ramdisk.img等文件的工具

cts

用于兼容性测试的工具

dalvik

Dalvik虚拟机的源代码

development

高层的开发和调试工具

device

与设备相关的代码

docs

包含与Android源代码项目的文档和工具,如Dalvik虚拟机格式文档等

external

扩展工具的源代码

framworks

Android框架层源代码。也就是Android SDK的源代码

hardware

硬件层接口和库

libcore

Java核心库

ndk

NDK相关的源代码

packages

与Android系统一同发布的应用程序的源代码

prebuilts

Android在各种平台下编译之前要使用的工具

sdk

在开发环境中使用的工具,如ddms,draw9path,sdkmanager等

system

Android的基本系统

注意:
查看所有分支

cd .repo/manifests

git branch -a

如果想切换到其它分支可以重新执行

repo init -b android-6.0.1_r63

repo sync

 

四、编译

(一)初始化编译环境

 进入aosp的解压目录,执行初始化文件:

$ cd aosp

$ . build/envsetup.sh   (.后面有空格)

 (二)选择目标

$ lunch

在列表中选择默认:full-eng(直接回车即可)。full-eng,表示正对所有的移动设备,Android模拟器有效,并打开所有的调试选项。

 (三)编译Android源代码

  make命令只会利用一个CPU核进行编译,如果是多核CPU,为了缩短时间,可以加上-jn参数。

1.安装必须的依赖

$ sudoapt-get install xsltproc flex bison gperf libxml2-utils libswitch-perlgcc-multilib

2.开始编译

$ make-j4

大概需要三小时左右,视硬件配置高低而定。

 

(四)编译SDK

 $ . build/envsetup.sh

$lunch 

$sdk-eng(在选择列表的后面直接输入)

$make sdk


编译完成就是下图:

 

(五)运行模拟器

$ emulator


OK,大功告成。


下面将此过程中遇到的几个问题列出,供大家参考,如对上述教程有疑问,欢迎留言交流:

1. libz.so.1库文件缺失错误:

<span style="font-size:18px;">error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directorymake: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/CopyFile.o] 错误 1</span>
<p><span style="font-size:18px;">make: *** 正在等待未完成的任务....</span></p><p><span style="font-size:18px;">/home/zfs/aosp/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/bin/../lib/gcc/i686-linux/4.6.x-google/../../../../i686-linux/bin/as:error while loading shared libraries: libz.so.1: cannot open shared objectfile: No such file or directory</span></p><p><span style="font-size:18px;">make: ***[out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/pseudolocalize.o]错误 1</span></p><p><span style="font-size:18px;">/home/zfs/aosp/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6/bin/../lib/gcc/i686-linux/4.6.x-google/../../../../i686-linux/bin/as:error while loading shared libraries: libz.so.1: cannot open shared objectfile: No such file or directory</span></p><p><span style="font-size:18px;">make: ***[out/host/linux-x86/obj/STATIC_LIBRARIES/libandroidfw_intermediates/Asset.o] 错误 1</span></p><p><span style="font-size:18px;">注意:某些输入文件使用或覆盖了已过时的 API。</span></p><p><span style="font-size:18px;">注意:要了解详细信息,请使用-Xlint:deprecation 重新编译。</span></p><span style="font-size:14px;"></span>
解决办法:

$  sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5


2.jdk版本不对

  1. build/core/config.mk:271:   
  2. *** Error: could not find jdk tools.jar, please install JDK6, which you can download from java.sun.com.  Stop.  

解决办法:

  安装之前先了解清楚所要编译的Android版本对应的jdk,然后安装相应的jdk(附:安装jdk5或6的方法):

a.由于Ubuntu中已经不支持自动获取jdk5和6,所以得自己下载,官网下载jdk的linux版本安装包

   http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html

    可以自行进入甲骨文官网获取自己要的版本,需要注册。


b.安装

我下载的是bin文件,我将下载的jdk-6-linux-i586.bin文件置于/usr/lib/jvm/java中。
然后修改bin文件权限,使其可执行,在shell中执行:

sudo chmod u+x /usr/lib/jvm/java/jdk-6-linux-i586.binview plain co

执行下面命令,将会出现字幕,持续按回车键,直至屏幕显示要求输入yes/no,此时输入y回车,将会把jdk解压到文件夹,得到jdk1.6.0_12目录。
sudo /usr/lib/jvm/java/jdk-6-linux-i586.bin 
此时,jdk已安装完毕。
下面进行配置,在environment中修改,
sudo vi /etc/environment 
添加如下部分
PATH="......:/usr/lib/jvm/java/jdk1.6.0/bin"  
  1. CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0/lib  
  2. JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0  

或者直接在/etc/profile中添加:(推荐使用)

sudo vi /etc/profile  
#JAVAEVIRENMENT   
export JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_34 
export JRE_HOME=$JAVA_HOME/jre 
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH  
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 
设置环境变量(设置环境变量的方法很多,不一一列举)

sudo source ~/.bashrc
由于ubuntu中可能会有默认的jdk,如openjdk,所以,为了使默认使用的是我们安装的jdk,还要进行如下工作。

通过这一步将我们安装的jdk加入java选单,执行:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0/bin/java 300  
  1. sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0/bin/javac 300  
  2. sudo update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/java/jdk1.6.0/bin/javah 300 

然后执行,通过这一步选择系统默认的jdk:
sudo update-alternatives --config java  
  1. sudo update-alternatives --config javac  
  2. sudo update-alternatives --config javah 

这样,再在shell中输入,就会显示系统使用的java是sun的java:
java -version  


3.在编译SDK源码时,javadoc 报错:

javadoc: 错误 - 找不到文件:"out/target/common/obj/APPS/framework-res_intermediates/src/android/R.java"
javadoc: 错误 - 找不到文件:"out/target/common/obj/APPS/framework-res_intermediates/src/android/Manifest.java"
javadoc: 错误 - 找不到文件:"out/target/common/obj/APPS/framework-res_intermediates/src/com/android/internal/R.java"3 错误
make: *** [out/target/common/docs/api-stubs-timestamp] 错误 45

解决办法:

  官方文档说如果用sun-java6-jdk可出问题,得要用sun-java5-jdk。经测试发现,如果仅仅make(make不包括make sdk),用sun-java6-jdk是没有问题的。而make sdk,就会有问题,严格来说是在make doc出问题,它需要的javadoc版本为1.5。

  因此,我们安装完sun-java6-jdk后最好再安装sun-java5-jdk,或者 只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装,并只修改javadoc.1.gz和 javadoc。因为只有这两个是make sdk用到的。这样的话,除了javadoc工具是用1.5版本,其它均用1.6版本:

$sudo apt-get install sun-java5-jdk

a.修改javadoc的link

$cd /etc/alternatives

$sudo rm javadoc.1.gz

$sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz

$sudo rm javadoc

$sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc


b.设置环境变量

$sudo gedit~/.bashrc

在.bashrc中新增或整合PATH变量,如下

#java 程序开发/运行的一些环境变量

JAVA_HOME=/usr/lib/jvm/java-6-sun

JRE_HOME=${JAVA_HOME}/jre

export ANDROID_JAVA_HOME=$JAVA_HOME

export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSP ATH

export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin

export JAVA_HOME;

export JRE_HOME;

export CLASSPATH;

HOME_BIN=~/bin/

export PATH=${PATH}:${JAVA_PATH}:${JRE_PATH}:${HOME_BIN};

#echo $PATH;

最后,同步这些变化:

$ source ~/.bashr

 

3.虚拟机错误

<span style="font-size:18px;">zfs@zfs-virtual-machine:~/aosp$ emulator &[1] 40021zfs@zfs-virtual-machine:~/aosp$ emulator:未找到命令</span><span style="font-size:14px;"></span>
 

  在我们编译完sdk时,紧接着运行emulator是不会有问题的,但是关闭终端,重新再运行虚拟机时,则会报错,这个问题也困扰了我好久,最后还是找出来解决办法:

  重新初始化环境,就像编译sdk一样:

$ . build/envsetup.sh
$ lunch  (选择1即可)
$ emulator   
 

    

 

转载请说明出处: 夜雨灬闻铃的博客

1 0