老版本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 | lrwxrwxrwx 1 root root 22 2月 11 2016 java-1.5.0-gcj -> java-1.5.0-gcj-5-amd64 |
放到这里只是为了方便将来寻找,在"source build/envsetup.sh"前,设置环境变量。
1 | export ANDROID_JAVA_TOOLCHAIN=/usr/lib/jvm/java-6-openjdk-amd64/bin; |
这几个值是与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 | : 1509597548:0;sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 |
同样,需要将~/.bin添加到$PATH里,使用老版本的make和gcc,编译过程会提醒的。
android-22以上
5.1.1以上基本已经比较新了,修改一下JDK即可,其他的一些通用的问题就是很常见的"unsupported reloc 42/43",我一般修改3个地方。
分别是art/build/Android.common_build.mk
,build/core/clang/HOST_x86_common.mk
,cp /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 | SERVER_PORT_SERVICE=AAAA |
常用的alias
1 | 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" |