![unidbg逆向工程:原理与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/74/51906074/b_51906074.jpg)
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所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-54.jpg?sign=1738880911-0zYgI51Zw6Eymduz1UG5lnpLYNQl5GKK-0-ffce2cb0445a9c5c6d62045c5dafcba2)
图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文件,将示例复制到文件中,并修改如下路径:
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-55.jpg?sign=1738880911-31bh18TC39L0U7vGCxE5x65yZMmoDHCV-0-aca47587121068fc673ba4ae4abcb1bf)
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-56.jpg?sign=1738880911-b6zcaimCUUm3oK1jm2KYmLMGRuCgWjJY-0-ff3d7562145306b1a78e0172085a2fe3)
还需修改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所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-57.jpg?sign=1738880911-dxR6jD1feDGbvZfiIYC7IynXGI91ZnvD-0-425c6a826381a3f02b082b098dec2729)
图3-15 so编译相关配置
运行build.sh脚本,如果在build的同级目录下生成libnative-lib.so,则命令行编译成功,如图3-16所示。
![](https://epubservercos.yuewen.com/DA59E4/30664290007344406/epubprivate/OEBPS/Images/978-7-111-74182-4-Part01-58.jpg?sign=1738880911-HMAREYhOO84Frt6zHRgyRwEhdH7KnTdK-0-3f755e9c5b03352add6e627fea14103d)
图3-16 命令行编译成功