前言
交叉编译是指在一种计算机体系结构上编译和构建应用程序,但是生成的可执行文件和库是针对另一种不同的体系结构,比如ARM、MIPS、PowerPC、x86
等。
常见的交叉编译工具集:
- GNU 工具链:比如编译ARM64架构可以使用
gcc-aarch64-linux-gnu
工具,并可以使用gdb-multiarch
工具来进行调试,一般用qemu
来运行多架构的可执行文件然后使用gdb-multiarch
进来远程调试 - Clang/LLVM 工具链:Clang/LLVM 工具链支持许多不同的架构和操作系统
- Android NDK:专门为 Android 平台提供的交叉编译工具集。使用的编译工具链为
Clang/LLVM
- Microsoft Visual Studio 工具集:Microsoft Visual Studio 提供了一些用于 Windows 平台的交叉编译工具,包括 Visual C++ 工具集、Windows SDK 和 WDK。
- Intel C++ 编译器:Intel C++ 编译器支持多种架构和操作系统,包括 IA-32、Intel 64、ARM 等。
Android-NDK使用
为了进行交叉编译,需要为每种目标 CPU 架构配置相应的编译工具链和系统头文件,那么就需要下载NDK工具包里面包含了:
Clang/LLVM
交叉编译的工具集和GNU
工具集(现在一般都是用Clang/LLVM)库文件
libc、libm、libz、liblog 等JNI
Android 平台的所有系统头文件和 API,比如- OpenGL ES
- OpenSL ES
- Vulkan
- MediaCodec
- 调试工具比如
gdb\lldb
,NDK还提供了一个ndk-gdb
这个文件是一个python脚本文件通过封装adb+gdb
的方式来远程调试
NDK目录结构
$ wget https://dl.google.com/android/repository/android-ndk-r21e-darwin-x86_64.zip
#我是OSX系统则下载darwin版本
$ ls
CHANGELOG.md/ ndk-gdb* shader-tools/
NOTICE ndk-stack* simpleperf/
NOTICE.toolchain ndk-which* source.properties
README.md/ package.xml sources/
build/ platforms/ sysroot/
meta/ prebuilt/ toolchains/
ndk-build* python-packages/ wrap.sh/
工具(外层是一个链接壳):
ndk-build
:bash
编译脚本,用于构建编译 C/C++ 命令,内部通过调用Clang/llvm
工具集、Cmake工具最终生成可用于 Android 应用程序的共享库。ndk-gdb
:python
脚本。用于调试 Android 应用程序的 GDB 调试器。ndk-stack
:用于解析崩溃日志的工具,可以将崩溃堆栈转换为可读的形式,以方便分析和修复错误。ndk-depends
:python
脚本。用于检查 C/C++ 代码的依赖关系。ndk-which
:bash
脚本。用于查找 NDK 工具链中的特定工具的路径。
目录:
-
toolchains
: 包含各种支持的 CPU 架构的编译器和工具链。 -
platforms
: 包含可用于构建本地库的 Android 平台版本。 -
sysroot
:包含头文件和库,这些库可以在特定平台版本上构建本地库时使用,里面包含vulkan
框架的共享库、头文件。 -
sources
:包含 Android 系统源代码,可以在构建本地库时使用。 -
build
:ndk-build工具的工作目录,内包含build-shader-tools.py
是一个用于将使用 OpenGL Shading Language (GLSL) 编写的着色器代码编译成可被 Android 应用程序使用的格式的 Python 脚本,该应用程序使用 Android NDK (Native Development Kit) 进行开发.build-shader-tools.py
是一个用于将使用 OpenGL Shading Language (GLSL) 编写的着色器代码编译成可被 Android 应用程序使用的格式的 Python 脚本,该应用程序使用 Android NDK (Native Development Kit) 进行开发。该脚本通常作为使用 OpenGL ES 进行图形渲染的 Android 应用程序构建过程的一部分使用。它以一个或多个 GLSL 文件作为输入,并生成可在应用程序中加载和使用的二进制文件
-
simpleperf
: simpleperf工具的 C++ 代码和相关的构建脚本,用于编译 simpleperf工具可执行文件simpleperf
是一个用于在 Android 系统上进行性能分析的工具。它是一个命令行工具,可帮助开发人员分析应用程序在运行时的 CPU 使用情况、函数调用频率、线程活动等方面的性能数据。可以通过ndk-build
脚本来编译simpleperf
工具的源代码,并生成simpleperf
可执行文件
-
shader-tools
包含了 GLSL 编译器等其他工具,用于生成、调试 GLSL 代码,并构建 OpenGL ES 应用程序
Toolchains目录:
$ ls
aarch64-linux-android-4.9/ renderscript/
arm-linux-androideabi-4.9/ x86-4.9/
llvm/ x86_64-4.9/
renderscript
:于构建 RenderScript 应用程序的工具集合(包含llvm-rs-cc
编译器)。RenderScript 是一种高性能计算框架,可以在 Android 应用程序中使用,用于处理图像、音频、视频等大数据集合aarch64/arm/x86/x86_64 -4.9
:用于构建各个架构的工具链目录,其中4.9
表示使用GCC 4.9
作为交叉编译工具集编译文件llvm
:里面存放着clang/llvm
工具集以及和上面GCC
一样各个架构的库文件
主流的Android NDK交叉编译
Clang/llvm
作为编译工具集,clang编译速度,以及代码优化比GCC强,并且clang本身就是一个可用于多架构编译前端编译器aarch64-linux-android
作为编译架构,目前的绝大部分Android真机都是armv8-a架构,小部分老手机使用armv7架构,x86\x64
在移动端市场上基本都是手机模拟器在使用