Параметризировать операторы импорта Kotlin?

Я пытаюсь реализовать два варианта сборки:

    productFlavors {
    myApp1 {
        dimension "app-types"
        applicationId "com.mycompany.myapp1"
    }
    myApp2 {
        dimension "app-types"
        applicationId "com.mycompany.myapp2"
    }

У меня есть много операторов Kotlin в этой общей форме в моих модулях Kotlin:

import com.mycompany.myapp1.mymodule.SomeModule

Итак, если я использую вариант сборки «myApp1», мой оператор импорта работает. Если я переключусь на вариант «myApp2», он больше не будет работать.

Очевидно, мне нужно параметризовать «.myapp1». часть. Как мне это сделать в Котлине?

Спасибо, Чарльз

0
0
51
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Мне нужно параметризовать «.myapp1». часть. Как мне это сделать в Котлине?

Это не вариант, извините. Вы можете попытаться свести к минимуму объем кода, который ссылается на сгенерированные кодом элементы, которые попадают в подпакеты com.mycompany.myapp1 или com.mycompany.myapp2 (например, классы R), а затем изолировать этот код в наборах или модулях исходного кода, специфичных для конкретного варианта.

Итак, защита от этих операторов импорта с помощью определения buildconfig (аналогично тому, что делается с блоком #ifdef / #endif препроцессора C/C++) также невозможна?

Charles Martin 19.08.2024 22:21

@CharlesMartin В Kotlin или Java нет эквивалента препроцессора. Есть несколько инструментов, которые могут сделать что-то подобное, но вам придется самостоятельно встроить их в систему сборки. Это не рекомендуется.

Gabe Sechan 20.08.2024 03:02

Имя вашего пакета для кода не обязательно должно совпадать с именем пакета для вашего APK. На самом деле вы будете использовать много кода в библиотеках, имя пакета которых не похоже на имя вашего приложения. Просто назовите их независимо.

Такое впечатление у меня сложилось, когда я пытался придумать, как создать ароматическое измерение «типы приложений». Однако я не знаю, как назвать «их» (кто бы они ни были, кстати) независимо. Я унаследовал код от предыдущего разработчика приложений, а разработка приложений для Android все еще для меня новичок. Это меня совершенно озадачило.

Charles Martin 19.08.2024 23:08

Имя пакета взято из команды package в верхней части файла. Просто измените это на то, что вы хотите. Или выберите один из этих двух и придерживайтесь его, поскольку это может быть буквально что угодно. По соглашению вы обычно помещаете его в структуру папок с тем же именем, что и пакет (поэтому com.example.foo становится com/example/foo), но я верю, что в Kotlin это не применяется. В любом случае инструмент рефакторинга в Android Studio может сделать это за вас.

Gabe Sechan 20.08.2024 03:00

Итак, я решил попробовать объединить свой общий код в библиотеку Android, как я читал в S/O и из приведенных выше ответов.

Еще раз спасибо за ваш вклад!

Ответ принят как подходящий

Когда вы работаете с разными вариантами сборки в Android, вам следует сохранять пространство имен постоянным, используя разные идентификаторы приложения для разных вариантов.

android {
    compileSdk 34
    namespace 'mycompany.myapp'

    defaultConfig {
        applicationId "mycompany.myapp" //it could be different than namespace
        minSdk 21
        targetSdk 34
        vectorDrawables.useSupportLibrary = true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    productFlavors {
        prod {
            dimension "app-types"
            applicationId "com.mycompany.myapp1"
        }
        stag {
            dimension "app-types"
            applicationId "com.mycompany.myapp2"
        }
    }
}

namespace определяет структуру вашего пакета. Например, если пространство имен — mycompany.myapp, то весь ваш импорт должен быть изменен следующим образом:

import com.mycompany.myapp.mymodule.SomeModule

Интересный. Итак, означает ли это, что разные идентификаторы приложения будут гарантировать, что APK будет установлен в разные каталоги целевой системы Android? Что-то вроде /data/user/0/com.mycompany.myapp1/* или /data/user/0/com.mycompany.myapp2/*

Charles Martin 20.08.2024 22:05

Это сработало для меня очень хорошо! Спасибо за совет!

Charles Martin 21.08.2024 00:34

Другие вопросы по теме