
3.3 脱离编译器,使用命令行编译so
由于在unidbg的学习过程中,我们会频繁地编译so文件来进行测试。如果每次都使用Android Studio来编译,那么需要编译器做一些除编译so以外的编译与打包APK的操作,也需要我们手动提取出APK中的so文件。为了提高效率,我们学习一下使用命令行编译so文件的方法。
首先打开IDEA,在lesson2包的同级目录中创建lesson5包,并将MainActivity.java代码复制进去。在lesson5下创建build文件夹,用于存放编译so的源代码和配置文件。
打开Android Studio,将src/main/cpp目录下的native-lib.cpp与CMakeLists.txt文件放到lesson5/build目录下,如图3-14所示。

图3-14 lesson5项目结构
由于使用cmake进行编译,因此我们还需要将Android Studio中的cmake添加到环境变量中。Android Studio SDK中的cmake路径为/root/Android/Sdk/cmake/3.10.2.4988404/bin,其中的版本号需要根据实际情况进行修改。在~/.bashrc文件末尾添加如下路径:
PATH=$PATH:/root/Android/Sdk/cmake/3.10.2.4988404/bin;export PATH;
重启终端,如果发现cmake命令已经可以在任意目录中使用,则配置成功。
对于编译脚本的配置,Google官方已在文档中编写了示例,地址为https://developer.android.com/studio/projects/configure-cmake#call-cmake-cli,读者可自行参考。
在build目录下创建build.sh文件,将示例复制到文件中,并修改如下路径:


还需修改CMakeLists.txt文件,添加如下配置:
# 配置生成so文件目标目录为项目根目录的上一层(即build目录的上级目录)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY${PROJECT_SOURCE_DIR}/../)
# 配置构建类型为Release
set(CMAKE_BUILD_TYPE"Release")
# 指定C和C++不输出调试信息
set(CMAKE_C_FLAGS_RELEASE"${CMAKE_C_FLAGS_RELEASE}-s")
set(CMAKE_CXX_FLAGS_RELEASE"${CMAKE_CXX_FLAGS_RELEASE}-s")
个性化修改并删除所有注释后,so编译相关配置如图3-15所示。

图3-15 so编译相关配置
运行build.sh脚本,如果在build的同级目录下生成libnative-lib.so,则命令行编译成功,如图3-16所示。

图3-16 命令行编译成功