赞
踩
本文基于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 -u https://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 directory
- make: *** [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版本不对
解决办法:
安装之前先了解清楚所要编译的Android版本对应的jdk,然后安装相应的jdk(附:安装jdk5或6的方法):
a.由于Ubuntu中已经不支持自动获取jdk5和6,所以得自己下载,官网下载jdk的linux版本安装包
可以自行进入甲骨文官网获取自己要的版本,需要注册。
b.安装
我下载的是bin文件,我将下载的jdk-6-linux-i586.bin文件置于/usr/lib/jvm/java中。
然后修改bin文件权限,使其可执行,在shell中执行:
或者直接在/etc/profile中添加:(推荐使用)
通过这一步将我们安装的jdk加入java选单,执行:
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] 40021
- zfs@zfs-virtual-machine:~/aosp$ emulator:未找到命令</span><span style="font-size:14px;">
- </span>
在我们编译完sdk时,紧接着运行emulator是不会有问题的,但是关闭终端,重新再运行虚拟机时,则会报错,这个问题也困扰了我好久,最后还是找出来解决办法:
重新初始化环境,就像编译sdk一样:
$ . build/envsetup.sh
$ lunch (选择1即可)
$ emulator
转载请说明出处: 夜雨灬闻铃的博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。