From d577f449bcb347c9428a1200b6a6043fb773fcc4 Mon Sep 17 00:00:00 2001 From: Evgeny Dubravin Date: Sat, 23 Mar 2024 00:16:48 +0700 Subject: [PATCH] =?UTF-8?q?feature=20TI-188:=20[Android]=20=D0=9D=D0=B0?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=20flavor,=20buildTyp?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 50 ++------------- buildSrc/src/main/kotlin/AndroidConfig.kt | 17 +---- buildSrc/src/main/kotlin/BuildType.kt | 62 ++++++++++++++++--- buildSrc/src/main/kotlin/Module.kt | 35 ----------- buildSrc/src/main/kotlin/Plugins.kt | 11 +--- .../main/kotlin/VersionCatalogLibraries.kt | 4 -- .../src/main/kotlin/VersionCatalogVersions.kt | 12 ++++ .../main/kotlin/flavours/SSLPinningFlavour.kt | 2 +- .../main/kotlin/plugins/AndroidLibPlugin.kt | 2 +- .../main/kotlin/plugins/BaseAndroidPlugin.kt | 32 ++++++---- data/build.gradle.kts | 52 +++++++++------- domain/build.gradle.kts | 41 +++++------- mobile_services/build.gradle.kts | 33 +++------- 13 files changed, 150 insertions(+), 203 deletions(-) delete mode 100644 buildSrc/src/main/kotlin/Module.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b2ded5e..0f8a4af 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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 { diff --git a/buildSrc/src/main/kotlin/AndroidConfig.kt b/buildSrc/src/main/kotlin/AndroidConfig.kt index 03ece4d..bbb757d 100644 --- a/buildSrc/src/main/kotlin/AndroidConfig.kt +++ b/buildSrc/src/main/kotlin/AndroidConfig.kt @@ -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 - } } + diff --git a/buildSrc/src/main/kotlin/BuildType.kt b/buildSrc/src/main/kotlin/BuildType.kt index d8268f6..0777af2 100644 --- a/buildSrc/src/main/kotlin/BuildType.kt +++ b/buildSrc/src/main/kotlin/BuildType.kt @@ -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" ) diff --git a/buildSrc/src/main/kotlin/Module.kt b/buildSrc/src/main/kotlin/Module.kt deleted file mode 100644 index cc856e0..0000000 --- a/buildSrc/src/main/kotlin/Module.kt +++ /dev/null @@ -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" - } - -} diff --git a/buildSrc/src/main/kotlin/Plugins.kt b/buildSrc/src/main/kotlin/Plugins.kt index dc1d6e0..5fe4bab 100644 --- a/buildSrc/src/main/kotlin/Plugins.kt +++ b/buildSrc/src/main/kotlin/Plugins.kt @@ -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" } diff --git a/buildSrc/src/main/kotlin/VersionCatalogLibraries.kt b/buildSrc/src/main/kotlin/VersionCatalogLibraries.kt index 28aea6c..faaf8dd 100644 --- a/buildSrc/src/main/kotlin/VersionCatalogLibraries.kt +++ b/buildSrc/src/main/kotlin/VersionCatalogLibraries.kt @@ -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 - get() = getLibrary("stdLib") - - private fun VersionCatalog.getLibrary(library: String) = findLibrary(library).get() diff --git a/buildSrc/src/main/kotlin/VersionCatalogVersions.kt b/buildSrc/src/main/kotlin/VersionCatalogVersions.kt index 10b179f..e556827 100644 --- a/buildSrc/src/main/kotlin/VersionCatalogVersions.kt +++ b/buildSrc/src/main/kotlin/VersionCatalogVersions.kt @@ -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 diff --git a/buildSrc/src/main/kotlin/flavours/SSLPinningFlavour.kt b/buildSrc/src/main/kotlin/flavours/SSLPinningFlavour.kt index 99fd78f..f43cd68 100644 --- a/buildSrc/src/main/kotlin/flavours/SSLPinningFlavour.kt +++ b/buildSrc/src/main/kotlin/flavours/SSLPinningFlavour.kt @@ -11,7 +11,7 @@ sealed class SSLPinningFlavour( object OFF : SSLPinningFlavour( name = "withoutSSLPinning", - withSslPinning = true + withSslPinning = false ) object ON : SSLPinningFlavour( diff --git a/buildSrc/src/main/kotlin/plugins/AndroidLibPlugin.kt b/buildSrc/src/main/kotlin/plugins/AndroidLibPlugin.kt index 923bf88..ca976ba 100644 --- a/buildSrc/src/main/kotlin/plugins/AndroidLibPlugin.kt +++ b/buildSrc/src/main/kotlin/plugins/AndroidLibPlugin.kt @@ -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) } diff --git a/buildSrc/src/main/kotlin/plugins/BaseAndroidPlugin.kt b/buildSrc/src/main/kotlin/plugins/BaseAndroidPlugin.kt index 6d7fc50..c658367 100644 --- a/buildSrc/src/main/kotlin/plugins/BaseAndroidPlugin.kt +++ b/buildSrc/src/main/kotlin/plugins/BaseAndroidPlugin.kt @@ -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 { override fun apply(target: Project) { @@ -25,33 +30,34 @@ abstract class BaseAndroidPlugin : Plugin { } 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().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 } } } diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 9a618d4..d08ce66 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -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().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) -} \ No newline at end of file +} + +val Project.buildScriptDir: String + get() = rootProject.ext["buildScriptsDir"] as String \ No newline at end of file diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 120aac1..a1ad7cc 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -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().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")) } \ No newline at end of file diff --git a/mobile_services/build.gradle.kts b/mobile_services/build.gradle.kts index 4df2a29..8c49402 100644 --- a/mobile_services/build.gradle.kts +++ b/mobile_services/build.gradle.kts @@ -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().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)