Arch Linux 下Android 源码的下载以及编译

时间:2023-02-01 16:33:40

之前把公司的开发环境由Ubuntu Kylin 换成了Arch Linux,而Arch 下因为种种问题公司的代码一直编不过去,搞定了之后也一直忘了写下来,希望能给同样在Arch 下做Android 开发的另类一点帮助吧。这里所编译的Android 版本基于Google 的Android 5.1。

安装基本依赖

首先在文件/etc/pacman.conf中打开你的multilib repo

[multilib]
Include = /etc/pacman.d/mirrorlist

然后强制更新一下本地repo

sudo pacman -Syy

然后安装编译所需要的依赖

sudo pacman -S base-devel bc curl git gnupg gperf jdk7-openjdk lib32-expat lib32-gcc-libs lib32-glib2 lib32-glibc lib32-glibc lib32-libdbus lib32-libffi lib32-libpng lib32-ncurses lib32-pcre lib32-readline lib32-zlib libpng libxml2 libxslt ncurses perl-switch readline schedtool sdl squashfs-tools unzip wxgtk zip zlib

另外你还需要手动设置几个软连接

/usr/lib/libtinfo.so -> /usr/lib/libncursesw.so
/usr/lib/libtinfo.so.5 -> /usr/lib/libncursesw.so
/usr/lib/libtinfo.so.6 -> /usr/lib/libncursesw.so
/usr/lib/libncurses.so.5 -> /usr/lib/libncursesw.so
/usr/lib/libncurses.so.6 -> /usr/lib/libncursesw.so

Python2 虚拟环境

因为Google 的repo脚本需要Python2 环境,而Arch Linux 中默认使用Python3,所以需要能够非全局地切换到Python2 环境。这个可以通过包python-virtualenvwrapper搞定。
首先安装这个包

sudo pacman -S python-virtualenvwrapper

因为Google 的envsetup.sh脚本必须由bash 解释,所以需要事先切换到bash,当然如果你默认使用bash 就不需要切换,后续会测试一下使用zsh 的效果

bash

然后创建一个python2 虚拟环境,前两行的环境变量设置最好写入你的shell 配置文件

export WORKON_HOME=~/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=$(which python3)
source /usr/bin/virtualenvwrapper.sh
mkvirtualenv -p $(which python2) python2

之后我们就进入了python2 虚拟环境。值得注意的是python-virtualenvwrapper可以创建python2 虚拟环境,但是必须依赖于python3 才能运行。如果你以后再想切换到python2 环境,只需要在确保环境变量正确的情况下执行source内建指令和workon函数就可以了。
最后不要忘记清空LC_ALL环境变量以让LC*变量生效,否则repo会毫不留情的崩掉

export LC_ALL=''

在创建的python2 虚拟环境中,现在Google 的repo脚本应该可以正确运行,可以同步代码到本地了。
如果你的repo仍然崩溃,多半是你在把开发环境迁移到Arch 之前是用过repo,如果是这样那么执行下面的语句然后再次开始你的sync 操作

rm ~/.repopickle_.gitconfig

一条错误规则

一个非常坑人的地方就是,Google 很久之前就写错了一条Makefile 规则。8 月下旬提前拿到了Android M 预览版的源码,然而发现这条错误规则仍然存在。在低版本的GNU Make 上,这条规则被其他规则所覆盖,代码可以顺利编译,然而由于Arch Linux 的滚动升级特性,高版本的GNU Make 已经可以正确使用这条错误的规则,导致编译中断。你需要修改chipram/Makefile,修改方法如下

diff --git a/Makefile b/Makefile
index 3017572..59a32df 100644
--- a/Makefile
+++ b/Makefile
@@ -230,7 +230,7 @@ $(SPLOBJDIR)%.o: $(SRCTREE)/nand_spl/%.c
$(CC) $(CFLAGS) -mlittle-endian -DCONFIG_NAND_SPL -c -o $@ $<

$(SPLOBJDIR)%.o: $(SRCTREE)/nand_spl/board/$(VENDOR)/$(SOC)/%.S
- $(CC) $(CFLAGS) -mlittle-endian -DCONFIG_NAND_SPL -c -o $@ $<
+ $(CC) $(AFLAGS) -mlittle-endian -DCONFIG_NAND_SPL -c -o $@ $<

$(SPLOBJDIR)%.o: $(SRCTREE)/arch/$(ARCH)/lib/%.S
$(CC) $(AFLAGS) -mlittle-endian -DCONFIG_NAND_SPL -c -o $@ $<

代码的编译

在执行编译之前,需要再次设置LC_ALL以覆盖LC*变量,否则编译开始不了多久你就会栽一个跟头

export LC_ALL=C

然后就是编译Android 代码的标准步骤了

source ./build/envsetup.sh
lunch
make update-api droid otapackage -j8

快速设置函数

最后提供一个快速切换到Android 编译环境的函数android_env,与之相配的还有一个repo函数。将这个两个函数写入你的shell 配置文件(例如~/.zshrc) 中即可,之后你可以使用指令

android_env

快速切换到编译环境,适合默认shell 为zsh 的用户。这两个函数可以在这里得到。

另外一些杂七杂八的问题是公司自研部分的问题,包括Makefile 写错FLAG(编译参数)等各种毛病,就不在这里写了。
顺便用Arch 作为开发环境其实并没有什么不方便,滚动升级意味着工具链可以保持最新,高度可制定性也决定了系统做成一个轻量级的开发环境,同时优秀的包管理机制也非常省心,和Ubuntu 相比也算是一个优势吧。
Arch Linux 下Android 源码的下载以及编译