Настройте CMake для добавления_библиотеки на основе текущего типа сборки Android - PullRequest
2 голосов
/ 06 июня 2019

Я храню свои учетные ключи в cpp собственном файле и использую CMake для сборки, затем связываю его с моим приложением:

Текущий код:

My 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 определяет только мои учетные данные среды разработки, и этот код отлично работает, когда я собираю в Debug Type.

Проблема:

У меня также есть подготовка и выпуск сборкии я хочу использовать разные 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
}

Попытки:

Я использую собственный код для хранения этих ключей из-за лучшего ключазащита.И я не хочу объединять все ключи сборки в один файл из-за безопасности репо.Только тот, кто отвечает за доступ к производственной сборке, имеет файл credentials-provider-production.cpp и может выпускать сборку.Таким образом, мои товарищи по команде могут иметь только файл dev и режим отладки сборки.

Я пытался с помощью find_library проверить на наличие cpp существование файла перед тем, как вызвать add_library, как это, но это не такработа, библиотека все еще не добавлена:

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()

Я также попробовал параметр CMAKE_BUILD_TYPE, отправленный на CMakeLists.txt, как показано ниже.Но основываясь на документе : The valid values are Release and Debug.Я тоже хочу иметь Staging build, чтобы этот метод не работал

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

В итоге:

Использование собственного кода: как отделить мой секретный ключфайлы в различные файлы на основе типа сборки?Любой, кто имеет опыт работы с этим, пожалуйста, помогите.Спасибо

1 Ответ

0 голосов
/ 12 июня 2019

Это мое текущее решение:

Структура проекта:

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) файла.

  • На других товарищах по команде, у которых нет разрешения на сборку или выпуск.У них нет cpp-файлов staging + release и только пустой заполнитель CMakeList files

  • В коде Kotlin: я могу извлечь тип сборки debug / staging / release для принятия решениячтобы загрузить нужную библиотеку

Плюсы:

  • Изменение типа сборки - это 1-шаговый процесс, просто измените вариант сборки сAndroid Studio и код автоматически выбирают правильную собственную библиотеку для импорта
  • Важные файлы учетных данных игнорируются из репозитория

Минусы:

  • На моем компьютере все доступные cpp-файлы для 3 типов сборок создаются с самого начала, но используется только 1 из них
  • Когда кто-то тянет проект, он должен вручную создать пустой CMakeLists в main /папки cpp и staging / cpp, поэтому add_subdirectory не выдаст ошибку
...