Ubuntu14.04 下载&&编译 Android 5.1.1源码(采用国内清华大学镜像)
2017-03-15 22:47
731 查看
下载和编译参考:http://www.jianshu.com/p/367f0886e62b
http://www.cnblogs.com/lanrenxinxin/p/5424554.html
http://blog.csdn.net/byhook/article/details/52270688
http://www.cnblogs.com/bluestorm/p/4419135.html
内存不足:
http://vb2005xu.iteye.com/blog/2171295
ubuntu 手动释放缓存 (清理内存cache)
http://blog.csdn.net/hanshileiai/article/details/48375589
前言:下载和编译安卓源码需要耗费巨大的硬盘资源,如下载的android5.1.1的源码约45G,编译又需要翻倍,因此,
建议硬盘至少要预留110G的空间;此外,编译时曾遇到过JVM虚拟机内存不足的问题,导致出现make ERROR,
在此建议内存得有4G(或制作交换分区,下面有方法)。
先扩展虚拟机磁盘,方法参考:
http://www.51testing.com/html/96/n-3715396.html
1. 下载android源码
由于google的官方源需要翻墙才能得到,因此改用国内清华大学的源。下载repo工具
先在Ubuntu上确保下载了Git工具(git-core)$ dpkg --get-selection | grep git
若无,则:
$ sudo apt-get install git
此时,同样因为墙的原因,我们使用清华大学的镜像下载repo工具,并将其脚本文件拷贝至~/bin目录
$ mkdir ~/bin $ PATH=~/bin:$PATH $ git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/ $ cp -rf ~/git-repo/repo$ && chmod a+x ~/bin/repo
开始下载安卓源码
修改repo脚本文件中的REPO_URL:REPO_URL = 'https://aosp.tuna.tsinghua.edu.cn/git-repo'
创建用于存放android源码的目录:
$ mkdir android_source $ cd android_source
在源码目录初始化仓库:
$ repo init -uhttps://aosp.tuna.tsinghua.edu.cn/platform/manifest/ -b android-5.1.1_r3
其中,android-5.1.1_r3为版本号。
初始化后,可以开始将源码同步到本地,由于经常会自动断网,可使用以下脚本:
#!/bin/bash echo "======start repo sync======" repo sync -j4 while [ $? -ne 0 ]; do echo "======sync failed, re-sync again======" sleep 3 repo sync -j4 done下载完毕,总大小约45 GB,可在存放android源码的目录下使用du指令测试:
$ du –lh --max-depth=1
目录结构如下:
源代码目录含义:
目录名描述
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的基本系统 |
切换源码版本
若想切换到其他源码版本分支,可以执行$ repo init –bandroid-5.1.1_r4 $ repo sync–j4
2. 搭建编译环境(Ubuntu14.04)
安装并配置JDK
对于Java版本要求:Android5.x至android 6.0 | OpenJDK 7 |
Android2.3.x至Android 4.4.x | OracleJDK 6 |
安装openjdk-7-jdk
$ sudo apt-get install openjdk-7-jdk注:验证是否安装成功
$ java –version
配置JDK
$sudo vi /etc/profile在文件末尾加上:
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export JAVA_HOME
export PATH
安装编译源码需要的依赖软件
统一放在脚本中运行.#/bin/bash echo “=============Installing Software==============” sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \ lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \ libgl1-mesa-dev libxml2-utils xsltproc unzip echo “=============Finished Installing==============”
注:Ubuntu版本不同,依赖的软件也不一样。
3. 编译安卓系统源码
导入编译命令
在安卓源码根目录执行脚本,导入编译所需命令到本地,如m/mm/mmm/lunch…$ .build/envsetup.sh
lunch:选择编译选项
执行lunch查看可以选择的编译选项$ lunch
这里我选择了1.aosp_arm-eng,lunch函数会帮助配置平台变量。
我们简单的介绍,编译版本的命令规则,其形式都是BUILD-BUILDTYPE,
BUILD指的是特定功能的组合特定代码集合的名称,源码可以运行在什么环境,比如full表示模拟器等.
BUILD TYPE则指的是编译类型,通常有三种:
-user:首先的访问,适用于发行版的产品.
-userdebug:和user模式类似,但是具有root权限并具有调试功能,适用于调试.
-eng:工程机模式,包含额外的调试工具.
不难发现,我们需要以eng模式进行编译,以便我们调试
make:开始编译
$ make –j4 | tee build.log
需要注意的是,参与编译的线程并不是越多越好,通常是根据你机器cup的核心来确定:core*2,
即当前cpu的核心的2倍,可通过以下指令查看cpu核心数:
$ cat /proc/cpuinfo
因此我选择 –j4.
第一次编译,失败
编译了约12hours后,系统居然报错:查看build.log,发现原因是物理内存不足导致无法分配足够的内存给JVM虚拟机:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c2c00000, 26738688, 0) failed; error='Cannot allocate memory' (errno=12) # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 26738688 bytes for committing reserved memory. # An error report file with more information is saved as: # /home/lijingbei/android_source/hs_err_pid54199.log # [ timer expired, abort... ]
解决方法(一)
没办法,上网搜资料,其中有种方法是在分区中建立交换分区,以扩大总内存容量。我们建立一个大小为1G的交换分区:$ sudo dd if=/dev/zero of=/swapfilebs=64M count=16 $ sudo mkswap /swapfile $ sudo swapon /swapfile
mkswap作用为将swapfile文件制造程交换分区;swapon作用为启动该交换分区.
建立前通过free查看交换分区大小为1G:
$ free
建立后通过free查看交换分区大小为2G:
编译完成后可删除该交换分区,如下:
$sudo swapoff/swapfile $sudo rm /swapfile
解决方法(二)
修改definitions.mk文件,该文件位于build/core/目录下。具体:修改transform-classes.jar-to-dex中的-JXms16M –JXmx2048M
其中第一个16M意思是最小分配的JVM堆栈大小;第二个的2048M是最大的堆栈大小。修改为-JXms1024M –JXmx1024M:
解决方法(三)
注意,线程数越高的话需要的内存也越高,如果内存不足编译到一半会出错,所以如果内存比较小的话,虽然时间长一些,但是建议直接使用make。
编译成功
4. 运行模拟器
通过以下命令运行Android虚拟机$ sourcebuild/envsetup.sh $ lunch<choose what you choose before> $ emulator
第一次写博客,若有错误,望包涵!
相关文章推荐
- Ubuntu14.04 编译 Android 5.1.1源码(采用国内镜像)
- Ubuntu 14.04 Android 5.1 源码下载和编译
- 通过清华大学镜像下载Android源码并编译源码
- Ubuntu14.04下载&编译Android(1)
- Ubuntu14.04下载、编译Android 6.0源码,并导入Android Studio
- ubuntu kylin14.04 上 android 5.1.1源码下载,编译
- Ubuntu14.04下载&编译Android(2)
- 高通源代码 Ubuntu14.04下载&编译Android(1)
- 通过清华大学镜像下载Android源码并编译源码
- 利用国内镜像源下载、编译Android源码
- Android I9100 源码编译 Step.1----下载&安装Ubuntu系统
- 利用国内镜像下载Android源码,并编译生成image镜像文件
- Ubuntu 10.04环境下载&编译Android-2.2.1 (froyo) 源代码 1/2 分享
- Ubuntu上下载及编译Android源码
- Ubuntu 10.04环境下载&编译Android-2.1_r2源代码【20110527更新说明】
- Ubuntu下下载编译android源码
- Ubuntu环境下 Android平台源码的下载及编译
- Ubuntu 9.10下的Android源码下载及编译