老版本aosp常见编译问题

最近看0ctf2016的那道题,需要用到指定版本的oatdump工具,但各个API的oat magic是不一样的,导致oatdump无法使用,于是编译了从古至今所有的oatdump,方便自己和后人使用,记录一下遇到的坑,以及自己的一些常用alias。

android-19, android-4.4.4_r2

这个版本主要问题是缺少JDK-1.6,安装正确、配置正确即可,而oracle已经不提供JDK-1.6了,只能找一些前人保留下来的JDK。这里推荐这个网站http://mirrors.linuxeye.com/jdk。 下载后运行jdk-6u45-linux-x64.bin文件,会释放一个文件夹。将其移动到/usr/lib/jvm里,按照其他几个文件一样命名即可,并且创建软链接。比如像这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lrwxrwxrwx   1 root root   22 2月  11  2016 java-1.5.0-gcj -> java-1.5.0-gcj-5-amd64
drwxr-xr-x 7 root root 4.0K 9月 1 17:30 java-1.5.0-gcj-5-amd64
lrwxrwxrwx 1 root root 21 11月 2 21:09 java-1.6.0-openjdk-amd64 -> java-6-openjdk-amd64/
lrwxrwxrwx 1 root root 20 3月 28 2016 java-1.7.0-openjdk-amd64 -> java-7-openjdk-amd64
-rw-r--r-- 1 root root 2.4K 3月 28 2016 .java-1.7.0-openjdk-amd64.jinfo
lrwxrwxrwx 1 root root 20 7月 28 10:31 java-1.8.0-openjdk-amd64 -> java-8-openjdk-amd64
-rw-r--r-- 1 root root 2.6K 7月 28 10:31 .java-1.8.0-openjdk-amd64.jinfo
lrwxrwxrwx 1 root root 20 4月 15 2016 java-1.9.0-openjdk-amd64 -> java-9-openjdk-amd64
-rw-r--r-- 1 root root 2.6K 4月 15 2016 .java-1.9.0-openjdk-amd64.jinfo
drwxr-xr-x 8 root root 4.0K 11月 2 21:08 java-6-openjdk-amd64
drwxr-xr-x 7 root root 4.0K 8月 2 13:11 java-7-openjdk-amd64
drwxr-xr-x 7 root root 4.0K 8月 1 14:12 java-8-openjdk-amd64
drwxr-xr-x 7 root root 4.0K 6月 19 17:10 java-9-openjdk-amd64
lrwxrwxrwx 1 root root 10 2月 11 2016 java-gcj -> java-gcj-5
lrwxrwxrwx 1 root root 22 11月 3 2016 java-gcj-5 -> java-1.5.0-gcj-5-amd64

放到这里只是为了方便将来寻找,在"source build/envsetup.sh"前,设置环境变量。

1
2
3
4
export ANDROID_JAVA_TOOLCHAIN=/usr/lib/jvm/java-6-openjdk-amd64/bin;
export ANDROID_PRE_BUILD_PATHS=/usr/lib/jvm/java-6-openjdk-amd64/bin:;
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64;
export PATH=/usr/lib/jvm/java-6-openjdk-amd64/bin:$PATH

这几个值是与source build/envsetup.sh有关的,提前设置即可修改编译时使用的JDK版本。 我一般写在.zshrc里,比如

1
alias jdk5, jdk6, jdk7, jdk8, jdk9

使用java -v, javac -v查看一下就可以了。 另一个问题是cmake的版本,默认的是4.1,需要使用老版本的cmake。而cmake本身只要一个二进制文件即可,不需要额外的依赖,所以到网上下载deb包。

wget http://mirrors.kernel.org/ubuntu/pool/main/m/make-dfsg/make_3.81-8.2ubuntu3_amd64.deb

解压后找到里面的可执行文件,移动到~/.bin/make,之后

export PATH=~/.bin:$PATH

安装老版本的gcc,默认的是5.0,需要使用老版本的gcc,还好apt里有。

sudo apt install gcc-4.7

gcc本身是一个软链接,是指向gcc-5的,同样可以创建一个软链接,~/.bin/gcc -> /usr/bin/gcc-4.7,将PATH中~/.bin的优先级提高即可。 之后进行正常的编译,即可成功编译android-4.4.2_r2

android-21, android-5.0.1_r1

这个主要遇到的问题是拉不到源码,切换了N个分支终于找到一个能够正确同步的,在编译过程中出现过莫名其妙的问题,可能是缺少apt install的依赖,不知道哪个有用,一次性全都给它安装了,就编译过了。具体是这些东西:

1
2
3
4
5
6
7
8
9
10
: 1509597548:0;sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
: 1509597568:0;sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
: 1509597578:0;sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
: 1509597587:0;sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
: 1509597608:0;sudo apt-get install git-core gnupg flex bison gperf build-essential
: 1509597612:0;sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
: 1509597617:0;sudo apt-get install libc6-dev-i386
: 1509597621:0;sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
: 1509597627:0;sudo apt-get install lib32z-dev ccache
: 1509597631:0;sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4

同样,需要将~/.bin添加到$PATH里,使用老版本的make和gcc,编译过程会提醒的。

android-22以上

5.1.1以上基本已经比较新了,修改一下JDK即可,其他的一些通用的问题就是很常见的"unsupported reloc 42/43",我一般修改3个地方。

分别是art/build/Android.common_build.mkbuild/core/clang/HOST_x86_common.mkcp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64_linux-glibc2.11-4.x/x86_64-linux/bin/ld

大概率就不会出问题了,其他小问题都会在 m 的时候给提醒。

android-24/25

android7使用jack进行编译,会在本地占用2个端口分别是jack-client和jack-admin,如果有2个用户同时在编译aosp,或者一个用户很久之前编译完成但是没有关掉jack-server,就会导致另一个用户没有权限重启jack-server,报错为ninja-wrapper出问题,可以简单粗暴地sudo把jack给kill掉。

同样,就算单用户操作,也可能遇到说 "Jack server failed to (re)start"和"No Jack server running"。

解决方法,修改~/.jack-server/config.properties~/.jack-settings,每个用户都不相同即可。

1
2
3
4
5
SERVER_PORT_SERVICE=AAAA
SERVER_PORT_ADMIN=BBBB

jack.server.service.port=AAAA
jack.server.admin.port=BBBB

常用的alias

1
2
3
alias jdk6="export ANDROID_JAVA_TOOLCHAIN=/usr/lib/jvm/java-6-openjdk-amd64/bin;export ANDROID_PRE_BUILD_PATHS=/usr/lib/jvm/java-6-openjdk-amd64/bin:;export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64;export PATH=/usr/lib/jvm/java-6-openjdk-amd64/bin:$PATH"
alias jdk7="export ANDROID_JAVA_TOOLCHAIN=/usr/lib/jvm/java-7-openjdk-amd64/bin;export ANDROID_PRE_BUILD_PATHS=/usr/lib/jvm/java-7-openjdk-amd64/bin:;export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64;export PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH"
alias aosp_old="export PATH=~/.bin:$PATH"

最后,分享一下各个版本的oatdump工具,过几天补上链接。

https://github.com/LeadroyaL/AOSP-Host-Bundle