Я пытаюсь реализовать два варианта сборки:
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». часть. Как мне это сделать в Котлине?
Спасибо, Чарльз
Мне нужно параметризовать «.myapp1». часть. Как мне это сделать в Котлине?
Это не вариант, извините. Вы можете попытаться свести к минимуму объем кода, который ссылается на сгенерированные кодом элементы, которые попадают в подпакеты com.mycompany.myapp1
или com.mycompany.myapp2
(например, классы R
), а затем изолировать этот код в наборах или модулях исходного кода, специфичных для конкретного варианта.
@CharlesMartin В Kotlin или Java нет эквивалента препроцессора. Есть несколько инструментов, которые могут сделать что-то подобное, но вам придется самостоятельно встроить их в систему сборки. Это не рекомендуется.
Имя вашего пакета для кода не обязательно должно совпадать с именем пакета для вашего APK. На самом деле вы будете использовать много кода в библиотеках, имя пакета которых не похоже на имя вашего приложения. Просто назовите их независимо.
Такое впечатление у меня сложилось, когда я пытался придумать, как создать ароматическое измерение «типы приложений». Однако я не знаю, как назвать «их» (кто бы они ни были, кстати) независимо. Я унаследовал код от предыдущего разработчика приложений, а разработка приложений для Android все еще для меня новичок. Это меня совершенно озадачило.
Имя пакета взято из команды package в верхней части файла. Просто измените это на то, что вы хотите. Или выберите один из этих двух и придерживайтесь его, поскольку это может быть буквально что угодно. По соглашению вы обычно помещаете его в структуру папок с тем же именем, что и пакет (поэтому com.example.foo становится com/example/foo), но я верю, что в Kotlin это не применяется. В любом случае инструмент рефакторинга в Android Studio может сделать это за вас.
Итак, я решил попробовать объединить свой общий код в библиотеку 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/*
Это сработало для меня очень хорошо! Спасибо за совет!
Итак, защита от этих операторов импорта с помощью определения buildconfig (аналогично тому, что делается с блоком #ifdef / #endif препроцессора C/C++) также невозможна?