Clion+Cmake+Ndk交叉编译安卓Native源码

最近在研究安卓脱壳技术,从github上找到各种工具测试结果。其中一个工具是DrizzleDumper。大神的代码从GitHub上clone下来可以直接编译运行(因为存在makefile文件,稍微修改后可以直接用make命令编译出想要平台的代码,当然前提是提前配置好ndk环境变量),对于部分壳也有效果。抱着学习的态度,我打算仔细阅读并尝试修改源码,以便让自己对脱壳的过程有更加深入的了解。

为了方便修改过程,我打算使用Clion。新建C语言项目,将drizzleDumper.cdrizzleDumper.h文件导入项目复制到项目中并在CMakeLists.txt中添加源文件之后,我们遇到了几个问题:

1.Clion默认引入了Mac系统自带的头文件,而不是Ndk中提供的文件,导致一部分定义报红。
2.原项目中的makefile默认调用ndk-build工具编译,而Clion使用的是cmake,这使得我们无法使用Clion完成编译过程。

网上关于这些问题有比较详细的解决方案,具体可以参照这篇文章:Clion配置Android NDK通过CMake进行编译。概括而言就是在Clion中配置一下,使得IDE能够识别ndk的头文件,并且能为目标机器编译代码。

下面是整个过程中配置cmake option这一步要注意的地方:

-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a
-DCMAKE_ANDROID_NDK=/Users/flower/Documents/DevEnv/android-ndk-r12b
-DCMAKE_SYSTEM_VERSION=19
-DCMAKE_C_FLAGS=""
-DCMAKE_CXX_FLAGS=""
-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang

1.第二行表示目标系统架构,由于我是为真机编译,因此为armeabi-v7a,如果要为x86架构的模拟器编译程序,应当改为x86
2.第三行表示当前开发环境中Ndk路径。开始我按照参考文章,用的是Android Studio默认下载的Ndk,结果应用配置后一直报错。经查找资料在官网找到了说明,大概意思是因为我们用了非Google官方定制的cmake,有时候ndk版本偏高了会有问题。这里我换成了之前下载过的一个低版本的ndk路径,完美解决了问题。

当配置完成后,我们之前遇到的报红应当已经消失,可以正常使用Clion编写安卓平台的Native代码了。

但是后续编译程序还有个问题,在adb shell运行编译好的程序会报一个如下的错误:

error: only position independent executables (PIE) are supported.

估计还是配置的问题,网上说是在安卓4.4之后添加了新的保护机制,可执行文件必须是采用PIE编译的。我在原项目中的Android.mk中看到了这部分内容:

# Allow execution on android-16+
LOCAL_CFLAGS += -fPIE
LOCAL_LDFLAGS += -fPIE -pie

但是在cmake中应当如何配置呢?经过查找资料,发现这篇文章:cmake使用独立工具链交叉编译可在android中运行的so包
。我在其中找到了要在CMakeList.txt文件中添加的关键两行:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")

之后应用一下更改,再编译项目,就可以完美运行啦。

过程中的参考链接如下:

Clion配置Android NDK通过CMake进行编译
解决 CLion 报红 NDK 相关头文件
cmake使用独立工具链交叉编译可在android中运行的so包
Android Gradle Plugin 源码解析之 externalNativeBuild
cmake 交叉编译
CMake + NDK + CLion针对CLion开发工具的配置
可能的另一种配置方案?
Stackoverflow:Integrate CLion and Android NDK
https://cmake.org/cmake/help/v3.7/manual/cmake-toolchains.7.html#cross-compiling-for-android-with-the-ndk

你可能感兴趣的:(Clion+Cmake+Ndk交叉编译安卓Native源码)