本帖最后由 pcy190 于 2019-5-22 21:29 编辑
最近尝试编译安卓源码,写了一下自己编译的过程,翻了一下自己的笔记,这里分享给大家。
这里尽可能使用的是国内的镜像源,速度应该比较快(包括后面的docker,也是大佬们修改过的脚本,这里感谢他们)
传统方法
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
安装依赖软件
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
下载 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
这里最好将加入到环境变量中,这样以后每次启动都不用再设置PATH
vim ~/.bashrc 在文件最后添加
export PATH=~/bin:$PATH
然后刷新
source ~/.bashrc
- 如果是zsh的话,则编辑
vim ~/.zshrc
添加
export PATH=~/bin:$PATH
然后刷新
source ~/.zshrc
下载和同步源码
参考 https://lug.ustc.edu.cn/wiki/mirrors/help/aosp#%E5%88%9D%E5%A7%8B%E5%90%8C%E6%AD%A5%E6%96%B9%E6%B3%951
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
编译
执行
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
make clobber
make -j12
所有的编译目标的格式都是:BUILD-BUILDTYPE ,BUILD 指的是指定特性的结合,
BUILDTYPE 是下面列出的其中一个: |
Buildtype |
用途 |
user |
有限的权限;适合一般用户 |
userdebug |
类似user模式,但有root权限和debug能力,适合debug |
eng |
带有额外的debug工具的开发配置。 |
运行
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
PS
编译出错
编译出现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 是为了去除所有本地化的设置,让命令能正确执行。
make版本问题
编译Android源码需要make的版本为3.8.1或者3.8.2(在Ubuntu18上的make版本太新了)需要降版本
- 在http://ftp.gnu.org/gnu/make/下载相应版本的压缩包,然后解压,切换目录
- 执行
./configure --prefix=/usr
make
sudo make install
如果出现错误提示glob/glob.c:xxx: undefined reference to __alloca' 的错误,
修改 /glob/glob.c 为(即加两行注释)
// #if !defined __alloca && !defined __GNU_LIBRARY__
# ifdef __GNUC__
# undef alloca
# define alloca(n) __builtin_alloca (n)
# else /* Not GCC. */
# ifdef HAVE_ALLOCA_H
# include <alloca.h>
# else /* Not HAVE_ALLOCA_H. */
# ifndef _AIX
# ifdef WINDOWS32
# include <malloc.h>
# else
extern char *alloca ();
# endif /* WINDOWS32 */
# endif /* Not _AIX. */
# endif /* sparc or HAVE_ALLOCA_H. */
# endif /* GCC. */
# define __alloca alloca
// #endif
保存后编译通过。(这个错误是glibc2.7引起的)
随笔
编译的时候make 12线程就会有这样的壮观场面
采用docker自动编译
linux至少要分配100g的硬盘空间。
安装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
开始编译
-
开始之前先启动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
编译完成后,使用的是系统默认自带的内核,
|