最终 APK 中未包含 NDK 模块
NDK module not included in final APK
我继承了一个非常混乱的 android 项目,它有很多 NDK 依赖项,并且在 gradle 正确 link 并包含所有 .so 和.a 文件到生成的 apk 中。
该项目由一些 java 代码组成,这些代码设置了一些活动并调用了一个大型 NDK 库,该库是从 C++ 构建的,而后者又 link 具有一定数量的第 3 方库(预构建或从源代码构建)。
我已经设法使用最新的 gradle 实验性插件构建它,但出于某种原因,我的模块未包含在 apk 中,而我的第 3 方 .so 文件包含在其中,即使我可以看到gradle 已将我的模块构建到一个 .so 文件中,并将其放置在构建目录中。
我的 build.gradle 看起来像这样:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "22.0.1"
defaultConfig.with {
applicationId = "<removed>"
minSdkVersion.apiLevel = 7
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
ndk {
moduleName = "XM"
CFlags.add("-I${file("src/main/jni")}".toString())
cppFlags.addAll(["-I${file("../../3rd_part/android/osg")}".toString()])
cppFlags.addAll(["-I${file("../../3rd_part/android/opus")}".toString()])
ldFlags.add("-L${file("src/main/jniLibs/armeabi-v7a")}".toString())
ldLibs.addAll(["osgdb_jpeg", "osgdb_freetype", "jpeg","argsub_es", "jnigraphics", "android", "log"])
stl = "gnustl_shared"
abiFilters.add("armeabi-v7a")
}
sources {
main {
jni {
source {
srcDir "../../core"
srcDir "src/main/jni"
}
}
}
}
lintOptions.abortOnError = false
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-rules.txt'))
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:23.0.0'
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:design:23.0.0'
compile 'com.wunderlist:sliding-layer:1.1.1'
}
总结一下我的问题:为什么 gradle 构建我的模块 (libXM.so),将其放入 build/libs/xM/shared/armeabi-v7a/debug,但不将其包含到我的最终 apk 文件中?
我没有得到几件事:如果你想用 gradle 构建一个共享库,那么你必须使用 apply plugin: 'com.android.model.library'
而不是 application
如果你想构建一个应用程序并使用预构建的库,那么你必须这样写:
sources {
main {
jni {
source {
srcDir "../../core"
srcDir "src/main/jni"
}
dependencies{
library "XM" linkage "shared"
}
当然,要预先设置 ldFlags。
我继承了一个非常混乱的 android 项目,它有很多 NDK 依赖项,并且在 gradle 正确 link 并包含所有 .so 和.a 文件到生成的 apk 中。
该项目由一些 java 代码组成,这些代码设置了一些活动并调用了一个大型 NDK 库,该库是从 C++ 构建的,而后者又 link 具有一定数量的第 3 方库(预构建或从源代码构建)。
我已经设法使用最新的 gradle 实验性插件构建它,但出于某种原因,我的模块未包含在 apk 中,而我的第 3 方 .so 文件包含在其中,即使我可以看到gradle 已将我的模块构建到一个 .so 文件中,并将其放置在构建目录中。
我的 build.gradle 看起来像这样:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "22.0.1"
defaultConfig.with {
applicationId = "<removed>"
minSdkVersion.apiLevel = 7
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
ndk {
moduleName = "XM"
CFlags.add("-I${file("src/main/jni")}".toString())
cppFlags.addAll(["-I${file("../../3rd_part/android/osg")}".toString()])
cppFlags.addAll(["-I${file("../../3rd_part/android/opus")}".toString()])
ldFlags.add("-L${file("src/main/jniLibs/armeabi-v7a")}".toString())
ldLibs.addAll(["osgdb_jpeg", "osgdb_freetype", "jpeg","argsub_es", "jnigraphics", "android", "log"])
stl = "gnustl_shared"
abiFilters.add("armeabi-v7a")
}
sources {
main {
jni {
source {
srcDir "../../core"
srcDir "src/main/jni"
}
}
}
}
lintOptions.abortOnError = false
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-rules.txt'))
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:23.0.0'
compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.android.support:design:23.0.0'
compile 'com.wunderlist:sliding-layer:1.1.1'
}
总结一下我的问题:为什么 gradle 构建我的模块 (libXM.so),将其放入 build/libs/xM/shared/armeabi-v7a/debug,但不将其包含到我的最终 apk 文件中?
我没有得到几件事:如果你想用 gradle 构建一个共享库,那么你必须使用 apply plugin: 'com.android.model.library'
而不是 application
如果你想构建一个应用程序并使用预构建的库,那么你必须这样写:
sources {
main {
jni {
source {
srcDir "../../core"
srcDir "src/main/jni"
}
dependencies{
library "XM" linkage "shared"
}
当然,要预先设置 ldFlags。