Mic*_*ael 5 android cmake android-ndk ninja
背景
我目前正在开发一个包含大量本机代码的Android项目.本机代码是为多个ABI构建的.由于各种原因,到目前为止,本机代码是使用调用的自定义Gradle任务构建的ndk-build.cmd.
现在我正在将其更改为externalNativeBuild用于NDK集成,而CMake列表而不是旧Android.mk文件.这似乎是更好的支持/记录的做事方式.
问题
旧ndk-build方法的一个好处是它可以并行构建多个ABI - 例如ARM版本和库的x86版本可以并行构建.
这在我的情况下特别有用,因为我需要在链接阶段使用第三方工具,1)需要很长时间(分钟)才能完成,2)主要是单线程.因此,为多个ABI并行构建库有助于缩短我的构建时间.
使用CMake/Ninja构建时,我无法复制此行为.忍者应该默认并行化构建,并且它可能正在为给定的ABI做这个(即为同一个ABI并行编译多个源文件).但据我所知,在完成当前ABI的构建之前,它永远不会开始为另一个ABI构建库.
题
当使用CMake/Ninja时externalNativeBuild,有什么方法可以告诉构建系统我希望它为多个ABI并行构建我的本机代码?
例
演示这一点的最小示例就像Android Studio中的"新项目"模板一样简单,例如:
的CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)
add_library(native-lib SHARED
src/main/cpp/native-lib.cpp )
Run Code Online (Sandbox Code Playgroud)
应用程序/的build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.example.cmakemultiabis"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
ndk {
abiFilters 'armeabi-v7a', 'x86'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
Run Code Online (Sandbox Code Playgroud)
然后用eg建造gradlew assembleRelease会给你:
> Task :app:externalNativeBuildRelease
Build native-lib x86
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\x86\libnative-lib.so
Build native-lib armeabi-v7a
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\release\obj\armeabi-v7a\libnative-lib.so
Run Code Online (Sandbox Code Playgroud)
从输出中可能不明显的是两个库是按顺序构建的,但如果你有一些需要花费大量时间链接的东西,它确实很明显.
我已经尝试使用可以使用SDK Manager下载的CMake/Ninja版本以及一些较新的版本(CMake 3.12.3,Ninja 1.8.2),并且在两种情况下都看到了相同的行为.
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |