diff --git a/adapter/build.gradle.kts b/adapter/build.gradle.kts index 431a81070..61582c473 100644 --- a/adapter/build.gradle.kts +++ b/adapter/build.gradle.kts @@ -1,6 +1,6 @@ import com.android.build.gradle.LibraryExtension -setupBase(Module.Adapter) +setupBase(LibModule.Adapter) dependencies { apis( diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 96767b1c4..22eae3b89 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,11 +1,11 @@ -setupApp(appPackageName, appName) +setupApp(AppModule.App) dependencies { implementations( // projects - project(Module.Login.moduleName), - project(Module.Main.moduleName), - // project(Module.Map.moduleName), - project(Module.Web.moduleName) + project(LibModule.Login.moduleName), + project(LibModule.Main.moduleName), + project(LibModule.Web.moduleName) ) + debugImplementations(Libs.leakCanary) } diff --git a/base/build.gradle.kts b/base/build.gradle.kts index dd386f78e..081913ed7 100644 --- a/base/build.gradle.kts +++ b/base/build.gradle.kts @@ -1,6 +1,6 @@ import com.android.build.gradle.LibraryExtension -setupBase() +setupBase(LibModule.Base) dependencies { apis( diff --git a/buildSrc/src/main/kotlin/Enums.kt b/buildSrc/src/main/kotlin/Enums.kt index f75b725dc..b4d5b6692 100644 --- a/buildSrc/src/main/kotlin/Enums.kt +++ b/buildSrc/src/main/kotlin/Enums.kt @@ -1,6 +1,11 @@ @file:Suppress("SpellCheckingInspection") -enum class Module(val tag: String, val runAlone: Boolean = false) { +// TODO: Make Module sealed +interface Module { + val tag: String +} + +enum class LibModule(override val tag: String) : Module { //---------------------base-------------------------------// Base("base"), Common("common"), @@ -8,32 +13,20 @@ enum class Module(val tag: String, val runAlone: Boolean = false) { //---------------------biz-------------------------------// Login("login"), Main("main"), - Map("map"), Web("web"), //---------------------func-------------------------------// - Adapter("adapter"), - - //---------------------app-------------------------------// - App("app"), - Test("test") -} - -enum class Flavor { - Daily, - Online + Adapter("adapter") } -enum class BuildConfigField(val tag: String) { - VersionCode("VERSION_CODE"), - VersionName("VERSION_NAME"), - CdnPrefix("CDN_PREFIX"), - ApiHost("API_HOST"), - DoraemonKitKey("DORAEMON_KIT_KEY") +enum class AppModule(override val tag: String, val appName: String, val appId: String) : Module { + App("app", "Demo", "io.goooler.demoapp"), + Test("app", "Test", "io.goooler.test") } -enum class ApiKey(val key: String) { - DoraemonKit("4a8c3eef29f029bc197705faad83f43d"), - AmapDebug("419ff22368500a49f0d894ac80d08725"), - AmapRelease("ab0ee784fe95f3de2af3db07e11c37ed") +enum class BuildConfigField(val key: String, val value: Any) { + VersionCode("VERSION_CODE", appVersionCode), + VersionName("VERSION_NAME", appVersionName), + CdnPrefix("CDN_PREFIX", "https://raw.githubusercontent.com/"), + ApiHost("API_HOST", "https://api.github.com/") } diff --git a/buildSrc/src/main/kotlin/Extensions.kt b/buildSrc/src/main/kotlin/Extensions.kt index 8cc138e00..600093eb5 100644 --- a/buildSrc/src/main/kotlin/Extensions.kt +++ b/buildSrc/src/main/kotlin/Extensions.kt @@ -1,5 +1,3 @@ -@file:Suppress("UnstableApiUsage") - import com.android.build.api.dsl.CommonExtension import com.android.build.api.dsl.VariantDimension import com.android.build.gradle.BaseExtension @@ -7,7 +5,6 @@ import com.android.build.gradle.LibraryExtension import com.android.build.gradle.internal.api.ApkVariantOutputImpl import com.android.build.gradle.internal.dsl.BaseAppModuleExtension import java.io.File -import java.util.Locale import java.util.Properties import kotlin.math.pow import org.gradle.api.JavaVersion @@ -23,15 +20,6 @@ import org.gradle.kotlin.dsl.get import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions import org.jetbrains.kotlin.gradle.plugin.KaptExtension -const val cdnPrefix = "https://raw.githubusercontent.com/" -val apiHosts = mapOf( - Flavor.Daily.name to "https://api.github.com/", - Flavor.Online.name to "https://api.github.com/" -) - -// app -const val appPackageName = "io.goooler.demoapp" -const val appName = "Demo" const val extraScriptPath = "gradle/extra.gradle.kts" val javaVersion = JavaVersion.VERSION_11 const val appVersionName = "1.5.0" @@ -77,12 +65,12 @@ fun PluginAware.applyPlugins(vararg names: String) { } } -fun VariantDimension.putBuildConfigStringField(name: String, value: String?) { - buildConfigField("String", name, "\"$value\"") -} - -fun VariantDimension.putBuildConfigIntField(name: String, value: Int) { - buildConfigField("Integer", name, value.toString()) +fun VariantDimension.buildConfigField(field: BuildConfigField) { + if (field.value is Int) { + buildConfigField("Integer", field.key, field.value.toString()) + } else if (field.value is String) { + buildConfigField("String", field.key, "\"${field.value}\"") + } } fun BaseExtension.kotlinOptions(block: KotlinJvmOptions.() -> Unit) { @@ -92,7 +80,7 @@ fun BaseExtension.kotlinOptions(block: KotlinJvmOptions.() -> Unit) { fun Project.kapt(block: KaptExtension.() -> Unit) = configure(block) inline fun Project.setupBase( - module: Module? = null, + module: Module, crossinline block: T.() -> Unit = {} ) { when (T::class) { @@ -103,15 +91,13 @@ inline fun Project.setupBase( applyPlugins(Plugins.kotlinAndroid, Plugins.kotlinKapt) extensions.configure("android") { + resourcePrefix = "${module.tag}_" compileSdkVersion(32) defaultConfig { minSdk = 21 vectorDrawables.useSupportLibrary = true ndk.abiFilters += setOf("arm64-v8a") - module?.let { - resourcePrefix = "${it.tag}_" - versionNameSuffix = "_${it.tag}" - } + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } sourceSets.configureEach { java.srcDirs("src/$name/kotlin") @@ -164,21 +150,20 @@ inline fun Project.setupBase( } fun Project.setupLib( - module: Module? = null, + module: LibModule, block: LibraryExtension.() -> Unit = {} ) = setupCommon(module, block) fun Project.setupApp( - appPackageName: String, - appName: String, + module: AppModule, block: BaseAppModuleExtension.() -> Unit = {} -) = setupCommon { +) = setupCommon(module) { defaultConfig { - applicationId = appPackageName + applicationId = module.appId targetSdk = 32 versionCode = appVersionCode versionName = appVersionName - manifestPlaceholders += mapOf("appName" to appName) + manifestPlaceholders += mapOf("appName" to module.appName) resourceConfigurations += setOf("en", "zh-rCN", "xxhdpi") } signingConfigs.create("release") { @@ -191,16 +176,16 @@ fun Project.setupApp( } buildTypes { release { - resValue("string", "app_name", appName) + resValue("string", "app_name", module.appName) signingConfig = signingConfigs["release"] isMinifyEnabled = true + isShrinkResources = true proguardFiles("$rootDir/gradle/proguard-rules.pro") } debug { - resValue("string", "app_name", "${appName}.debug") + resValue("string", "app_name", "${module.appName}.debug") signingConfig = signingConfigs["release"] applicationIdSuffix = ".debug" - versionNameSuffix = ".debug" isJniDebuggable = true isRenderscriptDebuggable = true isCrunchPngs = false @@ -209,22 +194,21 @@ fun Project.setupApp( dependenciesInfo.includeInApk = false applicationVariants.all { outputs.all { - (this as? ApkVariantOutputImpl)?.outputFileName = - "../../../../${appName}_${versionName}_${versionCode}_" + - "${flavorName.toLowerCase(Locale.ROOT)}_${buildType.name}.apk" + (this as? ApkVariantOutputImpl)?.outputFileName = "../../../../" + + "${module.appName}_${versionName}_${versionCode}_${flavorName}_${buildType.name}.apk" } } block() } private inline fun Project.setupCommon( - module: Module? = null, + module: Module, crossinline block: T.() -> Unit = {} ) = setupBase(module) { flavorDimensions("channel") productFlavors { - create(Flavor.Daily.name) - create(Flavor.Online.name) + create("daily") + create("online") } kapt { arguments { @@ -233,30 +217,14 @@ private inline fun Project.setupCommon( } } dependencies { - if (module != Module.Common) { - implementations(project(Module.Common.moduleName)) + if (module != LibModule.Common) { + implementations(project(LibModule.Common.moduleName)) } implementations( - project(Module.Base.moduleName), - project(Module.Adapter.moduleName), - - // router Libs.arouter, - - // UI - Libs.constraintLayout, - Libs.cardView, - Libs.material, - *Libs.smartRefreshLayout, - Libs.photoView, - - // utils *Libs.hilt, *Libs.room, - *Libs.rx, - *Libs.moshi, - Libs.collection, - Libs.utils + *Libs.moshi ) kapts(Libs.arouterCompiler, Libs.moshiCompiler, Libs.roomCompiler, Libs.hiltCompiler) } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 83a91955a..cb487161a 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,24 +1,30 @@ -setupLib(Module.Common) { +setupLib(LibModule.Common) { buildFeatures.buildConfig = true productFlavors.all { - putBuildConfigIntField(BuildConfigField.VersionCode.tag, appVersionCode) - putBuildConfigStringField(BuildConfigField.VersionName.tag, appVersionName) - putBuildConfigStringField(BuildConfigField.CdnPrefix.tag, cdnPrefix) - putBuildConfigStringField(BuildConfigField.ApiHost.tag, apiHosts[name]) - putBuildConfigStringField(BuildConfigField.DoraemonKitKey.tag, ApiKey.DoraemonKit.key) + buildConfigField(BuildConfigField.VersionCode) + buildConfigField(BuildConfigField.VersionName) + buildConfigField(BuildConfigField.CdnPrefix) + buildConfigField(BuildConfigField.ApiHost) } } dependencies { - implementations( - // network - *Libs.coil - ) - debugImplementations( - Libs.leakCanary, - Libs.chuckerDebug - ) - releaseImplementations( - Libs.chuckerRelease + apis( + // project + project(LibModule.Base.moduleName), + project(LibModule.Adapter.moduleName), + // UI + Libs.constraintLayout, + Libs.cardView, + Libs.material, + *Libs.smartRefreshLayout, + Libs.photoView, + // other + *Libs.rx, + Libs.collection, + Libs.utils ) + implementations(*Libs.coil) + debugImplementations(Libs.chuckerDebug) + releaseImplementations(Libs.chuckerRelease) } diff --git a/login/build.gradle.kts b/login/build.gradle.kts index 5e26ac968..f3a302f26 100644 --- a/login/build.gradle.kts +++ b/login/build.gradle.kts @@ -1 +1 @@ -setupLib(Module.Login) +setupLib(LibModule.Login) diff --git a/main/build.gradle.kts b/main/build.gradle.kts index 09de6c952..82ecee8a1 100644 --- a/main/build.gradle.kts +++ b/main/build.gradle.kts @@ -1,6 +1,4 @@ -setupLib(Module.Main) { - defaultConfig.testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - +setupLib(LibModule.Main) { sourceSets["main"].res.srcDirs( "src/main/res/core", "src/main/res/other" diff --git a/test/build.gradle.kts b/test/build.gradle.kts index d854476e8..f638bb4ba 100644 --- a/test/build.gradle.kts +++ b/test/build.gradle.kts @@ -1,8 +1,4 @@ -setupApp("$appPackageName.test", "test") { - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } -} +setupApp(AppModule.Test) dependencies { implementations( diff --git a/web/build.gradle.kts b/web/build.gradle.kts index 38a42acc2..7b2e0ed5d 100644 --- a/web/build.gradle.kts +++ b/web/build.gradle.kts @@ -1,4 +1,4 @@ -setupLib(Module.Web) { +setupLib(LibModule.Web) { buildFeatures.buildConfig = true }