gpt4 book ai didi

android - 根据当前的 Android 构建类型将 CMake 配置为 add_library

转载 作者:行者123 更新时间:2023-11-29 02:20:19 26 4
gpt4 key购买 nike

我将我的凭据 key 存储在一个 cpp 原生文件中并使用 CMake 构建然后将其链接到我的应用程序:

当前代码:

我的 src/main/cpp/credentials-provider-dev.cpp 文件:

JNIEXPORT jobject JNICALL
Java_com_{package}_CredentialsProvider_extractApiCredentials(JNIEnv *env, jobject instance) {
jclass cls = env -> FindClass("com/{path}/models/ApiCredentials");
jmethodID methodId = env -> GetMethodID(cls, "<init>",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");

return env -> NewObject(cls, methodId,
env->NewStringUTF("key"),
env->NewStringUTF("other key"),
env->NewStringUTF("another key"),
env->NewStringUTF("key again"),
NULL, NULL
);
}

我的 build.gradle 定义了到 CMakeLists.txt 文件的链接:

externalNativeBuild {
cmake {
path 'src/main/cpp/CMakeLists.txt'
}
}

我的 src/main/cpp/CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.4.1)

add_library(
credentials-provider-dev
SHARED
credentials-provider-dev.cpp)

credentials-provider-dev 文件只定义了我的开发环境凭据,当我在调试类型中构建时,这段代码工作正常。

问题:

我还有暂存和发布构建,我想为每种构建类型使用不同的 credentials-provider-{dev/staging/production}.cpp 文件:

debug {
ext.alwaysUpdateBuildId = false
applicationIdSuffix ".debug"
}

staging {
initWith debug
debuggable true
}

release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-app.pro'
signingConfig signingConfigs.release
}

尝试:

因为更好的 key 保护,我使用 native 代码来存储这些 key 。由于 repo 安全,我不想将所有构建 key 合并到 1 个文件中。只有负责访问生产构建的人才能拥有 credentials-provider-production.cpp 文件并能够构建发布。所以我的队友只能有 dev 文件和构建 Debug模式。

我尝试使用 find_library 在像这样调用 add_library 之前检查暂存 cpp 文件是否存在,但它没有用,lib 是仍未添加:

find_file(
STAGING_KEY_LIB
PATHS main/cpp/credentials-provider-staging.cpp)
if (STAGING_KEY_LIB)
add_library(
credentials-provider-staging
SHARED
main/cpp/credentials-provider-staging.cpp)
endif()

我还尝试了发送到 CMakeLists.txtCMAKE_BUILD_TYPE 参数,如下所示。但基于 document : 有效值为 Release 和 Debug。我也想进行 Staging 构建,所以这个方法不起作用

add_library(
credentials-provider-${CMAKE_BUILD_TYPE}
SHARED
credentials-provider-${CMAKE_BUILD_TYPE}.cpp)

总结:

使用 native 代码:如何将我的 key 文件分成不同的基于构建类型的文件?任何有这方面经验的人请帮助。谢谢

最佳答案

这是我目前的解决方案:

项目结构:

src
| - CMakeLists.txt
|
| - debug/cpp
| - CMakeLists.txt
| - credentials-debug.cpp
|
| - main/cpp
| - CMakeLists.txt
| - credentials-release.cpp
|
| - staging/cpp
| - CMakeLists.txt
| - credentials-staging.cpp

src/CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)

add_subdirectory(debug/cpp)

add_subdirectory(staging/cpp)

add_subdirectory(main/cpp)

src/debug/cpp/CMakeLists.txt:

add_library(
credentials-debug
SHARED
credentials-debug.cpp)

src/main/cpp/CMakeLists.txt:(在 .gitignore 中忽略,在其他机器上为空)

add_library(
credentials-release
SHARED
credentials-release.cpp)

src/staging/cpp/CMakeLists.txt:(在 .gitignore 中被忽略,在其他机器上将是空的)

add_library(
credentials-staging
SHARED
credentials-staging.cpp)

因此每个子 CMakeLists.txt 文件加载不同的 cpp 文件。

  • 在我的本地机器上,我将拥有所有 3 个 (CMakeLists + cpp) 文件。

  • 在其他无权构建暂存或发布权限的队友上。他们没有 staging + release cpp 文件,只有一个占位符空的 CMakeList 文件

  • 在 Kotlin 代码中:我可以提取调试/暂存/发布构建类型来决定加载正确的库

优点:

  • 更改构建类型是一个 1 步过程,只需从 Android Studio 更改构建变体,代码会自动选择正确的 native 库进行导入
  • repo 中忽略重要的凭据文件

缺点:

  • 在我的机器上,3 种构建类型的所有可用 cpp 文件都是从头开始构建的,但只使用了其中一种
  • 当有人拉取项目时,他们必须在 main/cpp 和 staging/cpp 文件夹中手动创建空的 CMakeLists,这样 add_subdirectory 就不会抛出错误<

关于android - 根据当前的 Android 构建类型将 CMake 配置为 add_library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56470828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com