本文介绍了在mac上编译全平台的aapt全流程。
《芙蓉楼送辛渐 》
寒雨连江夜入吴,平明送客楚山孤。
洛阳亲友如相问,一片冰心在玉壶。
-王昌龄
下载源码
参考链接:https://github.com/lizhangqu/aapt-cmake-buildscript ,下载源码大约3个G。
以下为笔者在mac上的实操流程:
创建大小写敏感磁盘1
hdiutil create -volname "aapt" -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 10g aapt.dmg
挂载磁盘1
2
3
4hdiutil attach aapt.dmg.sparseimage -mountpoint /Volumes/aapt
//最后使用完成后卸载磁盘
//hdiutil detach /Volumes/aapt
安装repo1
2
3
4mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
初始化repo项目1
2
3
4
5
6
7#进入工作目录
cd /Volumes/aapt
#如果存在repo bundle下载不下来的情况,请使用下面的命令进行手动clone
#git clone http://mirrors.ustc.edu.cn/aosp/git-repo.git/ .repo/repo
#初始化并同步源码树,约3G
repo init -u https://github.com/lizhangqu/aapt-repo-manifest.git -b android-9.0.0_r10
repo sync -j8
编译mac版本
1 | #进入工作目录 |
至此我们就编译出了可在mac上运行的aapt2工具。
编译linux版本
由于笔者在mac上交叉编译linux版本有问题,所以使用Docker容器安装ubuntu 16.0.4版本,通过ubuntu编译linux版本。1
2
3
4
5
6
7
8
9
10
11
12
13//安装docker
brew cask install docker
//启动docker服务后使用docker命令安装ubuntu指定版本
docker pull ubuntu:16.0.4
//使用bash命令启动名为mineubunt的容器,-i: 表示交互式操作,-t: 表示终端,-v参数将mac上目录挂载到ubuntu系统上,只需挂载一次,后面启动后自动挂载
docker run -itv /Volumes/aapt:/aapt --name mineubuntu ubuntu:16.0.4 bash
//退出
//exit
//启动已停止的容器
//docker start -i mineubuntu
在ubuntu中安装必要软件,如果提示sudo找不到去掉即可:1
2
3
4
5
6
7
8
9sudo apt-get update
sudo apt-get upgrade
sudo apt-get install openjdk-8-jdk
sudo apt-get install cmake
sudo apt-get install clang
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
//ubuntu安装vim
apt-get install vim
开始编译:1
2
3
4
5
6
7
8
9
10
11
12
13
14#进入工作目录
cd aapt
#使用cmake生成构建文件,并最小化编译产物,这一步的生成主要是为了生成protobuffer相关文件
cmake -H"./" -B"./build-cmake-linux" -DCMAKE_BUILD_TYPE=MinSizeRel
#生成aapt2所需的protobuffer头文件和cpp文件
cmake --build "./build-cmake-linux" --target protobuffer_h -- -j 8
#重新生成构建文件,因为之前生成的时候,protobuffer相关文件不存在,需要重新生成,如果可以直接编译通过,这一步可省略
cmake -H"./" -B"./build-cmake-linux" -DCMAKE_BUILD_TYPE=MinSizeRel
#编译aapt
cmake --build "./build-cmake-linux" --target aapt -- -j 8
#编译aapt2
cmake --build "./build-cmake-linux" --target aapt2 -- -j 8
#编译aapt2_jni
cmake --build "./build-cmake-linux" --target aapt2_jni -- -j 8
至此我们就编译出了可在linux运行的aapt2工具,windows版本需要在ubuntu16.0.4版本上交叉编译获取。
编译windows版本
当前windows可执行文件和动态库的版本只能在linux(Ubuntu 16.0.4)上进行交叉编译产生,需要安装MinGw1
sudo apt-get install mingw-w64
安装完成后,mingw-gcc和mingw-g++默认使用的线程模型是win32的,但是我们需要使用posix的线程模型,因此分别执行以下命令,将工具链指向带-posix后缀的工具链1
2
3
4
5
6
7
8
9sudo update-alternatives --config x86_64-w64-mingw32-gcc
sudo update-alternatives --config x86_64-w64-mingw32-g++
sudo update-alternatives --config x86_64-w64-mingw32-gfortran
sudo update-alternatives --config x86_64-w64-mingw32-gnat
sudo update-alternatives --config i686-w64-mingw32-gcc
sudo update-alternatives --config i686-w64-mingw32-g++
sudo update-alternatives --config i686-w64-mingw32-gfortran
sudo update-alternatives --config i686-w64-mingw32-gnat
windows可执行文件需要在Ubuntu 16.0.4下进行交叉编译,进行交叉编译前,需要将system/core/libcutils/include/cutils/atomic.h头文件中的#include 1
2
3
4
5
6
7
8
9
10#if defined(_WIN32)
#ifdef __cplusplus
#include <atomic>
using namespace std;
#else
#include <stdatomic.h>
#endif
#else
#include <stdatomic.h>
#endif
原因是引用的头文件stdatomic.h不是标准的c++部分,而clang可以支持兼容掉这部分,但是交叉编译工具链MinGW g++不支持,因此需要引用标准的C++中的atomic头文件。
并且交叉编译工具链不支持在linux下执行windows的可执行文件,因此aapt2需要的protobuffer头文件需要在linux用linux可执行文件生成,具体的完整流程如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#进入工作目录
cd /Volumes/aapt
#使用cmake生成linux构建文件,并最小化编译产物
cmake -H"./" -B"./build-cmake-linux" -DCMAKE_BUILD_TYPE=MinSizeRel
#使用linux环境生成aapt2所需的头文件
cmake --build "./build-cmake-linux" --target protobuffer_h -- -j 8
#使用cmake生成windows交叉编译构建文件,并最小化编译产物
cmake -H"./" -B"./build-cmake-windows" -DCMAKE_BUILD_TYPE=MinSizeRel -DCMAKE_TOOLCHAIN_FILE=windows.toolchain.cmake
#编译aapt
cmake --build "./build-cmake-windows" --target aapt -- -j 8
#编译aapt2
cmake --build "./build-cmake-windows" --target aapt2 -- -j 8
#编译aapt2_jni
cmake --build "./build-cmake-windows" --target aapt2_jni -- -j 8
#最终windows下的可执行文件和动态库生成都位于build-cmake-windows目录下