您的位置:首页 > 运维架构 > Linux

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

2015-08-23 19:09 344 查看
之前把公司的开发环境由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 相比也算是一个优势吧。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: