最近看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包。
1 |
wget http://mirrors.kernel.org/ubuntu/pool/main/m/make-dfsg/make_3.81-8.2ubuntu3_amd64.deb |
解压后找到里面的可执行文件,移动到~/.bin/make,之后
1 |
export PATH=~/.bin:$PATH |
安装老版本的gcc,默认的是5.0,需要使用老版本的gcc,还好apt里有。
1 |
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.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 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" |