【问题标题】:I want to use different library in debug and release mode In Android我想在 Android 的调试和发布模式下使用不同的库
【发布时间】:2019-12-30 09:22:33
【问题描述】:

调试:

jniLibs/armeabi/a.so

发布:

jniLibs/armeabi/b.so

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

.so 库是第三个库,位于jniLibs/armeabi/。我不知道具体的调用时机,所以不能使用System.loadLibrary()方法。

谢谢!

【问题讨论】:

  • 你使用这个 System.loadLibrary() 来加载你的 SO 文件吗?
  • 如果是,请检查我的答案。
  • @user1506104 so库是第三个库,放在jniLibs/armeabi/。不知道具体的调用时机,所以无法使用 System.loadLibrary 方法。
  • 请参阅stackoverflow.com/a/52048933/8034839 了解替代解决方案。

标签: android gradle groovy android-gradle-plugin


【解决方案1】:

这是另一种选择。添加调试 SO 文件,如下所示:

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

将您的发布 SO 文件保留在主源集中,如下所示:

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

重要的是&lt;yourdebug&gt;.so&lt;yourrelease&gt;.so 具有相同的文件名才能正常工作。

干杯!

【讨论】:

  • 这值得大家点赞!这似乎也是默认的预期路径,无需修改 build.gradle 中的路径
【解决方案2】:

如果您使用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库是第三个库,放在jniLibs/armeabi/。不知道具体的调用时机,所以无法使用 System.loadLibrary 方法。
  • 我添加了一个替代答案。我不会删除这个原始答案,因为这是根据构建类型加载不同 SO 的另一种方式。
【解决方案3】:

过去,NDK 支持 ARMv5 (armeabi) 以及 32 位和 64 位 MIPS,但在 NDK r17 中删除了对这些 ABI 的支持 .

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

从 2019 年 8 月 1 日起,您在 Google Play 上发布的应用将需要支持 64 位架构。 64 位 CPU 为您的用户提供更快、更丰富的体验。添加 64 位版本的应用可以提高性能,为未来的创新铺平道路,并为您的设备配备 64 位硬件做好准备。

因此,您应该停止在您的 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/&lt;your-usr-name&gt;/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/&lt;your-usr-name&gt;/android/jniLibs 替换为您自己的正确路径。

【讨论】:

  • 太好了!谢谢。
  • 如果您认为答案“非常好”,请投票赞成。谢谢。
猜你喜欢
  • 2011-01-05
  • 2015-03-25
  • 1970-01-01
  • 2011-06-14
  • 2019-01-10
  • 1970-01-01
  • 2011-09-19
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多