android源码编译 简书,Ubuntu18.04下编译Android源码笔记

一. 最新的方法-采用docker自动编译

linux至少要分配100g的硬盘空间。

1.1 安装docker

默认源中没有docker,我们需要在添加backports源,在/etc/apt/sources.list文件 加入下面这行

deb http://http.debian.net/debian jessie-backports main

运行如下命令安装docker

apt-get update

apt-get install docker.io

1.2 开始编译

开始之前先启动docker服务,不然到后面会报错

/etc/init.d/docker start

设置AOSP_VOL环境变量,设置为你要存放源码的路径,给VMWare添加硬盘扩容的设置成挂载的硬盘的路径。(注意这个export会在重新打开一个shell以后失效)

export AOSP_VOL=/home/Android

下载Wrapper脚本,我这里演示编译kitkat(Android 4.4),编译其他版本可以参考, 脚本对国内环境做了优化,使用速度比较快的清华源

curl -O https://raw.githubusercontent.com/tiann/docker-aosp/master/tests/build-kitkat.sh

编译源码,直接运行上一步下载下来的源码。该脚本会下载docker镜像,并且下载Android源码到AOSP_VOL指定的路径,然后编译。(注意要使用root权限,否则将无法正常使用docker)

sudo bash ./build-kitkat.sh

编译完成后,使用的是系统默认自带的内核

二. 传统方法

2.1 JDK安装和版本切换

安装Oracle JDK (此处编译Android4.4的源码,使用JDK6版本)

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java6-installer

也可以安装OpenJDK(安卓官方使用)(推荐)

sudo add-apt-repository ppa:openjdk-r/ppa

sudo apt-get update

sudo apt-get install openjdk-7-jdk

JDK版本切换

sudo update-alternatives --config java

sudo update-alternatives --config javac

2.2 安装依赖软件

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib

sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386

sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386

sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev

sudo apt-get install git-core gnupg flex bison gperf build-essential

sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib

sudo apt-get install libc6-dev-i386

sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev

sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4

sudo apt-get install lib32z-dev ccache bison

2.3 下载 repo 工具

mkdir ~/bin

PATH=~/bin:$PATH

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

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

## curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo

chmod a+x ~/bin/repo

设置环境变量

如果是默认的bash,则编辑vim ~/.bashrc文件

export PATH=~/bin:$PATH

source ~/.bashrc

如果是zsh的话,则编辑vim ~/.zshrc文件

export PATH=~/bin:$PATH

source ~/.zshrc

2.4 下载和同步源码

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-7.1.1_r1

repo sync --force-sync --force-broken

注意:如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的

REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'

同步也可以使用如下命令

repo sync

2.5 编译

执行

export USE_CCACHE=1

export CCACHE_DIR=ccache

prebuilts/misc/linux-x86/ccache/ccache -M 50G

准备编译环境

source build/envsetup.sh

用lunch命令选择编译目标

lunch aosp_angler-userdebug //lunch aosp_arm64-eng

注意:所有的编译目标的格式都是:BUILD-BUILDTYPE,BUILD指的是指定特性的结合,BUILDTYPE是下面列出的其中一个:

BUILDTYPE

用途

userdebug

类似user模式,但有root权限和debug能力,适合debug

eng

带有额外的debug工具的开发配置。

user

有限的权限;适合一般用户

然后

make clobber

make -j12

2.6 运行

export ANDROID_PRODUCT_OUT=out/target/product/generic

export ANDROID_BIN=out/host/linux-x86/bin

PATH=$ANDROID_BIN:$PATH

source build/envsetup.sh

lunch aosp_arm-eng

emulator64-arm -gpu off -memory 2048

2.7 错误处理

2.7.1 编译出错

编译出现如下错误提示时

flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertioncnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed. Aborted (core dumped)

可以将export LC_ALL=C添加到~/.bashrc文件。LC_ALL=C 是为了去除所有本地化的设置,让命令能正确执行。

2.7.2 make版本问题

编译Android源码需要make的版本为3.8.1或者3.8.2(在Ubuntu18上的make版本太新了)需要降版本

./configure --prefix=/usr

make

sudo make install

如果出现错误提示glob/glob.c:xxx: undefined reference to __alloca'的错误,

修改 /glob/glob.c为(即加两行注释),保存后编译通过。(这个错误是glibc2.7引起的)

// #if !defined __alloca && !defined __GNU_LIBRARY__

# ifdef __GNUC__

# undef alloca

# define alloca(n) __builtin_alloca (n)

# else /* Not GCC. */

# ifdef HAVE_ALLOCA_H

# include

# else /* Not HAVE_ALLOCA_H. */

# ifndef _AIX

# ifdef WINDOWS32

# include

# else

extern char *alloca ();

# endif /* WINDOWS32 */

# endif /* Not _AIX. */

# endif /* sparc or HAVE_ALLOCA_H. */

# endif /* GCC. */

# define __alloca alloca

// #endif

最后

本文主要对原文进行了二次编辑与排版使得更便于阅读与操作,这里感谢作者pcy190的原创

你可能感兴趣的:(android源码编译,简书)