feature TI-188: [Android] Настройка flavor, buildType

This commit is contained in:
Evgeny Dubravin 2024-03-23 00:16:48 +07:00
parent 601fbceb2b
commit d577f449bc
13 changed files with 150 additions and 203 deletions

View File

@ -13,53 +13,13 @@ val customEndpoint: String? = Environment.ENDPOINT.getenv()?.takeIf(String::isNo
android {
namespace = "ru.touchin.template"
compileSdk = AndroidConfig.COMPILE_SDK_VERSION
// defaultConfig {
// applicationId = Environment.APP_ID.getenv() ?: AndroidConfig.TEST_APP_ID
// versionCode = libs.versions.versionCode.get().toInt()
// versionName = libs.versions.versionName.get()
//
// compileSdk = libs.versions.compileSdk.get().toInt()
// minSdk = libs.versions.minSdk.get().toInt()
// targetSdk = libs.versions.targetSdk.get().toInt()
// }
configureSigningConfig(this@Build_gradle::file)
// configureSigningConfig(this@Build_gradle::file)
// with(defaultConfig) {
// applicationId = Environment.APP_ID.getenv() ?: AndroidConfig.TEST_APP_ID
// signingConfig = signingConfigs.getByName("debug")
// }
buildTypes {
getByName("debug") {
isMinifyEnabled = false
isShrinkResources = false
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
testProguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguardTest-rules.pro")
}
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
testProguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguardTest-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
buildFeatures.viewBinding = true
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java) {
kotlinOptions {
jvmTarget = "17"
}
}
addBuildType(type = BuildType.Develop, project = rootProject)
addBuildType(type = BuildType.Debug, project = rootProject)
addBuildType(type = BuildType.Customer, project = rootProject)
addBuildType(type = BuildType.Release, project = rootProject)
}
dependencies {

View File

@ -1,29 +1,14 @@
import com.android.build.gradle.BaseExtension
object AndroidConfig {
const val COMPILE_SDK_VERSION = 34
const val MIN_SDK_VERSION = 23
const val TARGET_SDK_VERSION = 34
const val BUILD_TOOLS_VERSION = "30.0.3"
val VERSION_CODE: Int = Environment.BUILD_NUMBER.getenv()?.toIntOrNull() ?: 10000
const val VERSION_NAME = "1.0.0"
// TODO: change test package name
const val TEST_APP_ID = "ru.touchin.template"
// TODO: change common file folder
const val COMMON_FOLDER = "Template-common"
const val RELEASE_DEBUGGABLE = false
}
fun BaseExtension.ignoreCustomerProdFlavourIfReleaseIsDebuggable() {
variantFilter {
ignore = name.contains(ApiFlavour.CustomerProd.name, ignoreCase = true) && AndroidConfig.RELEASE_DEBUGGABLE
}
}

View File

@ -1,10 +1,29 @@
import com.android.build.gradle.BaseExtension
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.kotlin.dsl.extra
fun BaseExtension.addFlavors(dimensionName: String, vararg flavorNames: String) {
if (flavorNames.isEmpty()) return
flavorDimensions(dimensionName)
flavorNames.forEach { flavor ->
productFlavors {
create(flavor) {
dimension = dimensionName
}
}
}
}
fun BaseExtension.addMobileServicesFlavor() {
addFlavors(dimensionName = "mobileServices", flavorNames = arrayOf("huawei", "google"))
}
fun BaseExtension.addBuildType(
type: BuildType,
project: Project
project: Project,
) {
buildTypes {
maybeCreate(type.name)
@ -15,14 +34,16 @@ fun BaseExtension.addBuildType(
isShrinkResources = type.optimizeAndObfuscate
setMatchingFallbacks(type.matchingFallbacks)
if (listOf(BuildType.Develop, BuildType.Debug).contains(type)) {
applicationIdSuffix = ".${type.name}"
}
// if (listOf(BuildType.Develop, BuildType.Debug).contains(type)) {
// applicationIdSuffix = ".${type.name}"
// }
if (type.optimizeAndObfuscate) {
setProguardFiles(
project.file("proguard").listFiles().toList() +
listOf(
project.file("proguard").listFiles(),
getDefaultProguardFile("proguard-android-optimize.txt")
).filterNotNull()
)
}
@ -35,6 +56,29 @@ fun BaseExtension.addBuildType(
}
}
fun BaseExtension.addLibBuildType(
type: BuildType,
serverType: String? = null,
enableConfig: Boolean = false,
versionCatalog: VersionCatalog
) {
buildTypes {
maybeCreate(type.name)
getByName(type.name) {
isMinifyEnabled = type.optimizeAndObfuscate
setMatchingFallbacks(type.matchingFallbacks)
buildConfigField("String", "VERSION_NAME", "\"${versionCatalog.versionName}\"")
if (enableConfig) {
val server = serverType ?: type.serverType
// buildConfigField("ru.template.data.network.ServerUrl", "DEFAULT_SERVER", type.defaultServer)
buildConfigField("String", "DEFAULT_SERVER_TYPE", "\"$server\"")
buildConfigField("Boolean", "ENABLE_SSL_PINNING", type.enableSslPinning.toString())
buildConfigField("Boolean", "ENABLE_LOGS", type.enabledLogs.toString())
}
}
}
}
sealed class BuildType(
val name: String,
val optimizeAndObfuscate: Boolean,
@ -42,9 +86,9 @@ sealed class BuildType(
val enabledLogs: Boolean,
val enabledDebugPanel: Boolean,
val enableCrashlytics: Boolean = true,
val defaultServer: String = "com.redmadrobot.data.network.ServerUrl.CUSTOMER_TEST",
val defaultServer: String = "ru.template.data.network.ServerUrl.CUSTOMER_TEST",
val serverType: String,
val matchingFallbacks: String = "debug"
val matchingFallbacks: String = "debug",
) {
object Develop : BuildType(
name = "develop",
@ -71,7 +115,7 @@ sealed class BuildType(
enableSslPinning = true,
enabledLogs = false,
enabledDebugPanel = false,
defaultServer = "com.redmadrobot.data.network.ServerUrl.CUSTOMER_PROD",
defaultServer = "ru.template.data.network.ServerUrl.CUSTOMER_PROD",
serverType = "Prod",
matchingFallbacks = "release"
)
@ -82,7 +126,7 @@ sealed class BuildType(
enableSslPinning = true,
enabledLogs = false,
enabledDebugPanel = false,
defaultServer = "com.redmadrobot.data.network.ServerUrl.CUSTOMER_PROD",
defaultServer = "ru.template.data.network.ServerUrl.CUSTOMER_PROD",
serverType = "Prod",
matchingFallbacks = "release"
)

View File

@ -1,35 +0,0 @@
object Module {
object RoboSwag {
const val UTILS = "utils"
const val LOGGING = "logging"
const val MVI_ARCH = "mvi-arch"
const val NAVIGATION_BASE = "navigation-base"
const val NAVIGATION_CICERONE = "navigation-cicerone"
const val STORABLE = "storable"
const val LIFECYCLE = "lifecycle"
const val VIEWS = "views"
const val RECYCLER_VIEW_ADAPTERS = "recyclerview-adapters"
const val RECYCLER_VIEW_DECORATORS = "recyclerview-decorators"
const val KOTLIN_EXTENSIONS = "kotlin-extensions"
}
object Feature {
const val LOGIN = "feature_login"
val ALL = listOf(
LOGIN
)
}
object Core {
const val NETWORK = "core_network"
const val PREFS = "core_prefs"
const val STRINGS = "core_strings"
const val UTILS = "core_utils"
const val UI = "core_ui"
const val DATA = "core_data"
const val DOMAIN = "core_domain"
}
}

View File

@ -5,15 +5,6 @@ object Plugins {
const val ANDROID_APP_PLUGIN_WITH_DEFAULT_CONFIG = "android_app"
const val ANDROID_LIB_PLUGIN_WITH_DEFAULT_CONFIG = "android_lib"
const val KOTLIN_ANDROID = "kotlin-android"
const val KOTLIN_ANDROID = "org.jetbrains.kotlin.android"
const val KOTLIN_KAPT = "kotlin-kapt"
const val LICENCE_PLUGIN = "com.google.android.gms.oss-licenses-plugin"
const val GOOGLE_SERVICES = "com.google.gms.google-services"
const val FIREBASE_CRASH = "com.google.firebase.crashlytics"
const val DEPENDENCY_GRAPH = "com.vanniktech.dependency.graph.generator"
const val DETEKT = "io.gitlab.arturbosch.detekt"
const val CPD = "de.aaschmid.cpd"
}

View File

@ -2,9 +2,5 @@ import org.gradle.api.artifacts.MinimalExternalModuleDependency
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.provider.Provider
internal val VersionCatalog.stdlib: Provider<MinimalExternalModuleDependency>
get() = getLibrary("stdLib")
private fun VersionCatalog.getLibrary(library: String) = findLibrary(library).get()

View File

@ -5,3 +5,15 @@ val VersionCatalog.sdkCompile: String
val VersionCatalog.sdkMin: String
get() = findVersion("minSdk").get().requiredVersion
val VersionCatalog.sdkTarget: String
get() = findVersion("targetSdk").get().requiredVersion
val VersionCatalog.jvmBytecode: String
get() = findVersion("jvmBytecode").get().requiredVersion
val VersionCatalog.versionCode: String
get() = findVersion("versionCode").get().requiredVersion
val VersionCatalog.versionName: String
get() = findVersion("versionName").get().requiredVersion

View File

@ -11,7 +11,7 @@ sealed class SSLPinningFlavour(
object OFF : SSLPinningFlavour(
name = "withoutSSLPinning",
withSslPinning = true
withSslPinning = false
)
object ON : SSLPinningFlavour(

View File

@ -6,7 +6,7 @@ import org.gradle.api.Project
class AndroidLibPlugin : BaseAndroidPlugin() {
override fun apply(target: Project) {
// target.plugins.apply(Plugins.ANDROID_LIBRARY)
target.plugins.apply(Plugins.ANDROID_LIBRARY)
super.apply(target)
}

View File

@ -4,6 +4,7 @@ import AndroidConfig
import BuildType
import Plugins
import com.android.build.gradle.BaseExtension
import jvmBytecode
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
@ -15,7 +16,11 @@ import org.gradle.internal.impldep.junit.runner.Version.id
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.getByType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import sdkCompile
import sdkMin
import sdkTarget
import versionCode
import versionName
abstract class BaseAndroidPlugin : Plugin<Project> {
override fun apply(target: Project) {
@ -25,33 +30,34 @@ abstract class BaseAndroidPlugin : Plugin<Project> {
}
private fun Project.configurePlugins() {
// plugins.apply(Plugins.KOTLIN_KAPT)
// plugins.apply("com.android.library")
plugins.apply("org.jetbrains.kotlin.android")
plugins.apply(Plugins.KOTLIN_ANDROID)
plugins.apply(Plugins.KOTLIN_KAPT)
}
private fun Project.configureAndroid() = extensions.getByType<BaseExtension>().run {
compileSdkVersion(AndroidConfig.COMPILE_SDK_VERSION)
buildToolsVersion = AndroidConfig.BUILD_TOOLS_VERSION
compileSdkVersion(libs.sdkCompile.toInt())
defaultConfig {
minSdk = libs.sdkMin.toIntOrNull() ?: 24
targetSdk = AndroidConfig.TARGET_SDK_VERSION
versionCode = AndroidConfig.VERSION_CODE
versionName = AndroidConfig.VERSION_NAME
minSdk = libs.sdkMin.toInt()
targetSdk = libs.sdkTarget.toInt()
versionCode = libs.versionCode.toInt()
versionName = libs.versionName
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.toVersion(libs.jvmBytecode)
targetCompatibility = JavaVersion.toVersion(libs.jvmBytecode)
isCoreLibraryDesugaringEnabled = true
}
buildFeatures.viewBinding = true
buildFeatures.apply {
buildConfig = true
viewBinding = true
}
tasks.withType(KotlinCompile::class.java) {
kotlinOptions {
jvmTarget = "17"
jvmTarget = libs.jvmBytecode
}
}
}

View File

@ -1,38 +1,48 @@
plugins {
id(Plugins.ANDROID_APP_PLUGIN_WITH_DEFAULT_CONFIG)
id(Plugins.ANDROID_LIB_PLUGIN_WITH_DEFAULT_CONFIG)
}
private val serverType = Environment.SERVER_ENVIRONMENT.getenv()?.takeIf(String::isNotBlank)
private val versionCatalog: VersionCatalog
get() = extensions.getByType<VersionCatalogsExtension>().named("libs")
android {
namespace = "ru.template.data"
compileSdk = 34
defaultConfig {
minSdk = 24
addLibBuildType(type = BuildType.Develop, enableConfig = true, versionCatalog = versionCatalog)
addLibBuildType(type = BuildType.Debug, enableConfig = true, versionCatalog = versionCatalog)
addLibBuildType(type = BuildType.Customer, enableConfig = true, versionCatalog = versionCatalog)
addLibBuildType(type = BuildType.Release, enableConfig = true, versionCatalog = versionCatalog)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
sourceSets {
getByName("main") {
java.srcDirs("src/main/kotlin")
}
getByName("androidTest") {
java.srcDirs("src/androidTest/kotlin")
}
getByName("test") {
java.srcDirs("src/test/kotlin")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
addMobileServicesFlavor()
testOptions {
unitTests {
isReturnDefaultValues = true
}
}
}
dependencies {
implementation(project(":domain"))
implementation(project(":mobile_services"))
implementation(libs.androidx.core)
implementation(libs.androidx.compat)
implementation(libs.material)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
}
}
val Project.buildScriptDir: String
get() = rootProject.ext["buildScriptsDir"] as String

View File

@ -1,38 +1,29 @@
plugins {
id(Plugins.ANDROID_APP_PLUGIN_WITH_DEFAULT_CONFIG)
id(Plugins.ANDROID_LIB_PLUGIN_WITH_DEFAULT_CONFIG)
}
private val versionCatalog: VersionCatalog
get() = extensions.getByType<VersionCatalogsExtension>().named("libs")
android {
namespace = "ru.template.domain"
compileSdk = 34
defaultConfig {
minSdk = 24
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
addLibBuildType(BuildType.Develop, versionCatalog = versionCatalog)
addLibBuildType(BuildType.Debug, versionCatalog = versionCatalog)
addLibBuildType(BuildType.Customer, versionCatalog = versionCatalog)
addLibBuildType(BuildType.Release, versionCatalog = versionCatalog)
}
addMobileServicesFlavor()
sourceSets {
getByName("main") {
java.srcDirs("src/main/kotlin")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation(libs.androidx.core)
implementation(libs.androidx.compat)
implementation(libs.material)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
implementation(project(":mobile_services"))
}

View File

@ -1,37 +1,24 @@
plugins {
id(Plugins.ANDROID_APP_PLUGIN_WITH_DEFAULT_CONFIG)
id(Plugins.ANDROID_LIB_PLUGIN_WITH_DEFAULT_CONFIG)
}
private val versionCatalog: VersionCatalog
get() = extensions.getByType<VersionCatalogsExtension>().named("libs")
android {
namespace = "ru.template.mobile.services"
compileSdk = 34
defaultConfig {
minSdk = 24
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
addLibBuildType(BuildType.Develop, versionCatalog = versionCatalog)
addLibBuildType(BuildType.Debug, versionCatalog = versionCatalog)
addLibBuildType(BuildType.Customer, versionCatalog = versionCatalog)
addLibBuildType(BuildType.Release, versionCatalog = versionCatalog)
}
addMobileServicesFlavor()
}
dependencies {
implementation(libs.androidx.core)
implementation(libs.androidx.compat)
implementation(libs.material)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)