能否在Android Studio创建纯CMake项目?如何替换ndk-build优化MyLib.aar构建耗时
能否在Android Studio中创建仅使用CMake的项目?
当然可以啦!Android Studio完全支持纯CMake构建的原生项目,而且针对你提到的「原生代码极少改动、不想拖慢MyLib.aar构建速度」的痛点,还有专门的优化方案,我给你一步步梳理清楚:
一、把ndk-build迁移到CMake
首先得把原来用ndk-build构建的原生代码转成CMake配置,步骤很简单:
- 修改MyLib模块的
build.gradle,替换掉ndk-build的配置,改成CMake:android { ... externalNativeBuild { cmake { path "CMakeLists.txt" // 指向你要写的CMake配置文件 version "3.22.1" // 选一个和你的Android Studio兼容的版本就行 } } // 把原来ndk-build相关的配置删掉哦 } - 编写
CMakeLists.txt,把原来ndk-build里的编译逻辑转过来,比如添加源文件、链接系统库这些:cmake_minimum_required(VERSION 3.22.1) project("mynative") # 把你所有需要编译的原生C++文件加进来,替换成实际路径 add_library(mynative SHARED src/main/cpp/native-lib.cpp # 其他你的C++源文件... ) # 链接Android的log库,要是你还有其他依赖库也在这里加 find_library(log-lib log) target_link_libraries(mynative ${log-lib})
二、优化构建速度,不让原生代码拖aar的后腿
既然你的原生代码很少改动,咱就没必要每次构建aar都重新编译原生代码,这里有两个实用方案:
方案1:分离原生模块,预编译so文件
把原生代码单独拿出来构建成libMyNative.so,然后直接放到MyLib的目录里引用:
- 先单独编译原生代码生成各个架构的so(比如armeabi-v7a、arm64-v8a),放到MyLib的
src/main/jniLibs/${abi}/目录下。 - 修改MyLib的
build.gradle,去掉externalNativeBuild配置,改成直接打包jniLibs里的so:android { ... sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } }
这样平时构建aar的时候,完全不会碰原生代码,只有当你手动更新预编译的so时才会有变化,速度直接拉满!
方案2:利用CMake的缓存机制
如果不想分离模块,也可以依赖CMake的增量缓存:
- Android Studio默认已经开启了CMake的增量构建,只要你不随便改
CMakeLists.txt里的全局配置(比如项目名、全局编译选项),CMake只会在原生源文件改动时才重新编译,后续构建都会复用之前的缓存结果,不会重复耗时。
三、验证配置是否生效
改完之后可以做两个验证:
- 执行
./gradlew :mylib:assembleRelease构建aar,看控制台输出,确认原生代码只在第一次或者源文件改动时才编译。 - 解压生成的aar文件,检查
jni目录下有没有正确的libMyNative.so,确保打包没问题。
内容的提问来源于stack exchange,提问作者Bungles




