Android官网建议编译Android6.0的源码使用Ubuntu14.04,所以大家最好使用此Ubuntu版本。
Git配置
进行过此配置的直接跳过。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
全局代/理
将ss启动后,再安装polipo,polipo可以将socks5代/理转换为http/https全局代/理,可以让终端代/理生效。
//安装polipo
sudo apt-get install polipo
//配置polipo
sudo vim /etc/polipo/config
在config文件里写入如下配置:
logFile = /var/log/polipo/polipo.log
socksParentProxy = "localhost:1080"
socksProxyType = socks5
logLevel=4
然后再启动polipo:
//停止polipo服务
sudo service polipo stop
//启动polipo服务
sudo service polipo start
//设置Terminal全局代理,取消则用"unset http_proxy"、"unset https_proxy"
export http_proxy="http://localhost:8123"
export https_proxy="http://localhost:8123"
//验证ip是否已飞到国外
curl ip.gs
//例如:当前 IP:210.x.x.x 来自:日本XX县XX市
下载repo
Repo是google用Python脚本写的调用git的一个脚本,主要是用来下载、管理许多git仓库,google用repo来负责android的版本控制。
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
同步源码
初始化工作目录
工作目录用于存放要下载的Android源码,就要用户根目录下放置即可。
mkdir android-6.0.1_r46
cd android-6.0.1_r46
同步源码
在此可看到所有android版本 ,选择要下载哪个分支的代码,在此我选择的是使用清华AOSP镜像站下载所有代码,方便以后查看。
//下载特定分支代码
repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r46
//清华源:repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r46
初始化后即使用自动下载脚本进行源码下载:
#!/bin/bash
#download_android_source.sh
for (( ; ; ))
do
repo sync -j4
if [ $? == 0 ]; then
break;
fi
done
也可以自己执行命令同步:
repo sync
下载代码这里真的是耗时很久,先开始用的清华源下载,可下到一定起码40G以上的时候就开始报下面的错误:
the remote end hung up unexpectedly early eof index-pack failed
下了好久都没好,之后就换了官方源,也报过这个错误,不过没在理会一直下,耗了几个星期才下完,不知为何我这要用这么久~_~。
安装openjdk-7
官网建议编译android6.0代码使用java7。
sudo apt-get install openjdk-7-jdk
//如果系统上安装有多个jdk,需要配置默认jdk版本到java7。
sudo update-alternatives --config java
sudo update-alternatives --config javac
//设置后检查是否当前默认版本为java7。
java -version
安装依赖项(Ubuntu14.04)
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
配置USB访问权限
wget -S -O - http://source.android.com/source/51-android.txt | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
设置编译缓存ccahe(可选)
使用 ccache 编译工具可以对 C 和 C++ 进行缓存来达到加快编译的效果,最好设置,毕竟我们要编译源码。
echo export USE_CCACHE=1 >> ~/.bashrc
prebuilts/misc/linux-x86/ccache/ccache -M 50G
之后可以通过下面的命令查看已使用的缓存空间大小:
watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s
下载真机驱动镜像(可选)
编译好的文件要刷到真机上时就需要下载这些,可先跳过,后序需要刷到真机再看此节。
https://developers.google.com/android/drivers
编译源码
//初始化编译环境
source build/envsetup.sh
//使用lunch命令选择编译目标:
lunch
//使用make命令进行构建
make -j4
-j4参数使用4个线程进行编译构建,具体数值建议使用nproc命令查询到的数据,例如Ubuntu是在Virtualbox虚拟机内,最好是到Settings->System->Processor处调到与宿主机同一配置,以便近可能的提示编译速度。编译需要几个小时,编译好后即可启动模拟器查看运行效果。
每次重新打开Terminal编译时都执行一下上述三条命令。有编译问题时请查看编译问题汇总。
emulator
编译问题汇总
Jack编译工具链配置
$HOME/.jack file
The $HOME/.jack file contains settings for Jack server variables, in a full bash syntax.
Here are the available settings, with their definitions and default values:
- SRVER=true Enable the server feature of Jack.
- SRVER_PORT_SERVICE=8072 Set the TCP port number of the server for compilation purposes.
- SRVER_PORT_ADMIN=8073 Set the TCP port number of the server for admin purposes.
- SRVER_COUNT=1 Unused at present.
- SRVER_NB_COMPILE=4 Maximum number of parallel compilations allowed.
- SRVER_TIMEOUT=60 Number of idle seconds the server has to wait without any - mpilation before shutting itself down.
- SERVER_LOG={SERVER_LOG:=SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} File where server logs are written. By default, this variable can be overloaded by an environment variable.
- JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} The default command used to launch a JVM on the host. By default, this variable can be overloaded by environment variable.
Cannot launch Jack server
我这边一开始就编译失败遇到了这个错误,把Ubuntu的全局sock5代\理取消后保证系统在无代\理配置下就可以解决。
如果不能解决先看下是否是相关端口被占用的问题。
sudo netstat -apn | grep 8072
sudo netstat -apn | grep 8073
是就修改端口配置,否则就只能禁用jack编译了(SERVER=false),,会导致编译速度变慢。
can not alloc memory
内存不够用,我把虚拟机内存调成了8G,也可以把SRVER_NB_COMPILE值调小。