我想在调试和发布模式下使用不同的库 Android

I want to use different library in debug and release mode In Android

调试:

jniLibs/armeabi/a.so

发布:

jniLibs/armeabi/b.so

我想在调试模式下使用a.so,在发布模式下使用b.so,我该如何在build.gradle或其他模式下使用?

.so图书馆是第三个图书馆,放在jniLibs/armeabi/。我不知道具体的调用时间,所以不能用System.loadLibrary()方法。

谢谢!

如果您使用 System.loadLibrary() 加载 SO 文件,请执行以下操作:

public final static boolean IS_DEBUG = BuildConfig.BUILD_TYPE.equalsIgnoreCase("debug");

static {
    if(IS_DEBUG) {
        System.loadLibrary("yourdebugso");
    }
    else {
        System.loadLibrary("yourreleaseso");
    }
}

这是另一种选择。像这样添加调试 SO 文件:

app/src/debug/jniLibs/armeabi/<yourdebug>.so

像这样在主源集中保留您的发布 SO 文件:

app/src/main/jniLibs/armeabi/<yourrelease>.so

重要的是 <yourdebug>.so<yourrelease>.so 具有相同的文件名才能正常工作。

干杯!

历史上 NDK 支持 ARMv5 (armeabi),以及 32 位和 64 位 MIPS,但是 对这些 ABI 的支持在NDK r17.

此外,请注意以下来自 Google 的公告:

Starting August 1, 2019, your apps published on Google Play will need to support 64-bit architectures. 64-bit CPUs deliver faster, richer experiences for your users. Adding a 64-bit version of your app provides performance improvements, makes way for future innovation, and sets you up for devices with 64-bit-only hardware.

因此,您应该停止为您的 Android 应用程序使用旧版 armeabi。并且,开始使用 64 位 ABI。 参见 https://developer.android.com/distribute/best-practices/develop/64-bithttps://developer.android.com/ndk/guides/abis 了解更多详情。

如何组织debugrelease构建类型,理论上,你可以把mynative-lib.so放在任何你喜欢的地方,例如他们在 /Users/<your-usr-name>/android/jniLibs 之下。但是,我想建议您安排 debugrelease 构建类型如下( 每个支持 ABI):

jniLibs
├── debug
│    ├── arm64-v8a
│    │   └── mynative-lib.so
│    ├── armeabi-v7a
│    │   └── mynative-lib.so
│    ├── x86
│    │   └── mynative-lib.so
│    └── x86_64
│        └── mynative-lib.so
└── release
     ├── arm64-v8a
     │   └── mynative-lib.so
     ├── armeabi-v7a
     │   └── mynative-lib.so
     ├── x86
     │   └── mynative-lib.so
     └── x86_64
         └── mynative-lib.so

然后配置您的 app/build.gradle 文件,使其指向正确的构建类型,即

android {
    ...
    sourceSets {
        main {
            // put your jni libs that do not distinguish debug and release.
            jniLibs.srcDirs += "/Users/<your-usr-name>/android/jniLibs"]
        }
        debug {
            // put your debug version jni libs.
            jniLibs.srcDirs += "/Users/<your-usr-name>/android/jniLibs/debug"]
        }
        release {
            // put your release version jni libs.
            jniLibs.srcDirs += "/Users/<your-usr-name>/android/jniLibs/release"]
        }
    }
    ...
}

注意:将/Users/<your-usr-name>/android/jniLibs替换为您自己的正确路径。