You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否在Android Studio创建纯CMake项目?如何替换ndk-build优化MyLib.aar构建耗时

能否在Android Studio中创建仅使用CMake的项目?

当然可以啦!Android Studio完全支持纯CMake构建的原生项目,而且针对你提到的「原生代码极少改动、不想拖慢MyLib.aar构建速度」的痛点,还有专门的优化方案,我给你一步步梳理清楚:

一、把ndk-build迁移到CMake

首先得把原来用ndk-build构建的原生代码转成CMake配置,步骤很简单:

  1. 修改MyLib模块的build.gradle,替换掉ndk-build的配置,改成CMake:
    android {
        ...
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt" // 指向你要写的CMake配置文件
                version "3.22.1" // 选一个和你的Android Studio兼容的版本就行
            }
        }
        // 把原来ndk-build相关的配置删掉哦
    }
    
  2. 编写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只会在原生源文件改动时才重新编译,后续构建都会复用之前的缓存结果,不会重复耗时。

三、验证配置是否生效

改完之后可以做两个验证:

  1. 执行./gradlew :mylib:assembleRelease构建aar,看控制台输出,确认原生代码只在第一次或者源文件改动时才编译。
  2. 解压生成的aar文件,检查jni目录下有没有正确的libMyNative.so,确保打包没问题。

内容的提问来源于stack exchange,提问作者Bungles

火山引擎 最新活动