diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8f2c93732..df30ca020 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,7 +46,7 @@ jobs: - name: Run unit tests id: unit_tests - run: ./gradlew testReleaseUnitTest + run: ./gradlew testDebugUnitTest - name: Verify SQLDelight migrations run: ./gradlew verifySqlDelightMigration @@ -56,7 +56,7 @@ jobs: uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: test-report-${{ github.sha }} - path: app/build/reports/tests/testReleaseUnitTest + path: app/build/reports/tests/testDebugUnitTest - name: Build app run: ./gradlew assembleRelease -Pinclude-telemetry -Penable-updater diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b2ce0ca0e..2d37cf4fc 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -89,8 +89,8 @@ android { } sourceSets { - getByName("preview").res.srcDirs("src/debug/res") - getByName("benchmark").res.srcDirs("src/debug/res") + getByName("preview").res.directories.add("src/debug/res") + getByName("benchmark").res.directories.add("src/debug/res") } splits { @@ -139,10 +139,6 @@ android { viewBinding = true buildConfig = true aidl = true - - // Disable some unused things - renderScript = false - shaders = false } lint { diff --git a/build.gradle.kts b/build.gradle.kts index 42b8a23f2..e8a18eae4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,13 @@ +buildscript { + dependencies { + classpath(libs.kotlin.gradle) + } +} + plugins { alias(libs.plugins.aboutLibraries) apply false alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.kmp.library) apply false alias(libs.plugins.android.library) apply false alias(libs.plugins.android.test) apply false alias(libs.plugins.firebase.crashlytics) apply false diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 3748d0468..e397a0b6a 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { api(libs.sqldelight.androidxPaging) + compileOnly(platform(libs.androidx.compose.bom)) compileOnly(libs.androidx.compose.runtimeAnnotation) testImplementation(libs.bundles.test) diff --git a/gradle.properties b/gradle.properties index 5826add1c..03ae0ec0a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,6 @@ android.nonTransitiveRClass=false -android.useAndroidX=true kotlin.code.style=official -kotlin.mpp.androidSourceSetLayoutVersion=2 # Configuration should be synced with [/gradle/build-logic/gradle.properties] org.gradle.caching=true diff --git a/gradle/build-logic/src/main/kotlin/PluginAndroidBase.kt b/gradle/build-logic/src/main/kotlin/PluginAndroidBase.kt index 9f2022dae..70e553ea3 100644 --- a/gradle/build-logic/src/main/kotlin/PluginAndroidBase.kt +++ b/gradle/build-logic/src/main/kotlin/PluginAndroidBase.kt @@ -1,21 +1,50 @@ -import mihon.gradle.configurations.configureAndroid +import com.android.build.api.dsl.ApplicationDefaultConfig +import com.android.build.api.dsl.CommonExtension +import com.android.build.api.dsl.CompileOptions +import com.android.build.api.dsl.DefaultConfig import mihon.gradle.configurations.configureKotlin -import mihon.gradle.extensions.alias +import mihon.gradle.extensions.android import mihon.gradle.extensions.configureTest +import mihon.gradle.extensions.coreLibraryDesugaring import mihon.gradle.extensions.libs -import mihon.gradle.extensions.plugins +import mihon.gradle.extensions.mihonx import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies @Suppress("UNUSED") class PluginAndroidBase : Plugin { override fun apply(target: Project): Unit = with(target) { - plugins { - alias(libs.plugins.kotlin.android) - } - configureKotlin() configureTest() - configureAndroid() + + android { + defaultConfig { + minSdk = mihonx.versions.android.sdk.min.get().toInt() + if (this is ApplicationDefaultConfig) { + targetSdk = mihonx.versions.android.sdk.target.get().toInt() + } + + ndkVersion = mihonx.versions.android.ndk.get() + } + + compileSdk = mihonx.versions.android.sdk.compile.get().toInt() + + compileOptions { + isCoreLibraryDesugaringEnabled = true + } + } + + dependencies { + coreLibraryDesugaring(libs.android.desugar) + } } } + +private fun CommonExtension.defaultConfig(block: DefaultConfig.() -> Unit) { + defaultConfig.apply(block) +} + +private fun CommonExtension.compileOptions(block: CompileOptions.() -> Unit) { + compileOptions.apply(block) +} diff --git a/gradle/build-logic/src/main/kotlin/PluginComposeAndroid.kt b/gradle/build-logic/src/main/kotlin/PluginComposeAndroid.kt index 24580206a..8f961e06f 100644 --- a/gradle/build-logic/src/main/kotlin/PluginComposeAndroid.kt +++ b/gradle/build-logic/src/main/kotlin/PluginComposeAndroid.kt @@ -1,3 +1,5 @@ +import com.android.build.api.dsl.BuildFeatures +import com.android.build.api.dsl.CommonExtension import mihon.gradle.extensions.alias import mihon.gradle.extensions.android import mihon.gradle.extensions.api @@ -31,3 +33,7 @@ class PluginComposeAndroid : Plugin { } } } + +private fun CommonExtension.buildFeatures(block: BuildFeatures.() -> Unit) { + buildFeatures.apply(block) +} diff --git a/gradle/build-logic/src/main/kotlin/PluginKotlinMultiplatform.kt b/gradle/build-logic/src/main/kotlin/PluginKotlinMultiplatform.kt index 7f37f863c..583915644 100644 --- a/gradle/build-logic/src/main/kotlin/PluginKotlinMultiplatform.kt +++ b/gradle/build-logic/src/main/kotlin/PluginKotlinMultiplatform.kt @@ -1,32 +1,44 @@ -import mihon.gradle.configurations.configureAndroid +import com.android.build.api.dsl.KotlinMultiplatformAndroidLibraryTarget import mihon.gradle.configurations.configureKotlin import mihon.gradle.extensions.alias import mihon.gradle.extensions.configureTest +import mihon.gradle.extensions.coreLibraryDesugaring import mihon.gradle.extensions.libs +import mihon.gradle.extensions.mihonx import mihon.gradle.extensions.plugins import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import kotlin.text.toInt @Suppress("UNUSED") class PluginKotlinMultiplatform : Plugin { override fun apply(target: Project): Unit = with(target) { plugins { - alias(libs.plugins.android.library) + alias(libs.plugins.android.kmp.library) alias(libs.plugins.kotlin.multiplatform) } configureKotlin() configureTest() - configureAndroid() kotlin { @OptIn(ExperimentalKotlinGradlePluginApi::class) applyDefaultHierarchyTemplate() - androidTarget() + android { + minSdk = mihonx.versions.android.sdk.min.get().toInt() + compileSdk = mihonx.versions.android.sdk.compile.get().toInt() + enableCoreLibraryDesugaring = true + } + } + + dependencies { + coreLibraryDesugaring(libs.android.desugar) } } } @@ -34,3 +46,7 @@ class PluginKotlinMultiplatform : Plugin { private fun Project.kotlin(block: KotlinMultiplatformExtension.() -> Unit) { extensions.configure(block) } + +private fun KotlinMultiplatformExtension.android(block: KotlinMultiplatformAndroidLibraryTarget.() -> Unit) { + targets.withType().configureEach(block) +} diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Android.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Android.kt deleted file mode 100644 index 2fb978311..000000000 --- a/gradle/build-logic/src/main/kotlin/mihon/gradle/configurations/Android.kt +++ /dev/null @@ -1,32 +0,0 @@ -package mihon.gradle.configurations - -import com.android.build.api.dsl.ApplicationDefaultConfig -import mihon.gradle.extensions.android -import mihon.gradle.extensions.coreLibraryDesugaring -import mihon.gradle.extensions.libs -import mihon.gradle.extensions.mihonx -import org.gradle.api.Project -import org.gradle.kotlin.dsl.dependencies - -fun Project.configureAndroid() { - android { - defaultConfig { - minSdk = mihonx.versions.android.sdk.min.get().toInt() - if (this is ApplicationDefaultConfig) { - targetSdk = mihonx.versions.android.sdk.target.get().toInt() - } - - ndkVersion = mihonx.versions.android.ndk.get() - } - - compileSdk = mihonx.versions.android.sdk.compile.get().toInt() - - compileOptions { - isCoreLibraryDesugaringEnabled = true - } - } - - dependencies { - coreLibraryDesugaring(libs.android.desugar) - } -} diff --git a/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/Project.kt b/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/Project.kt index 29f9a9483..3b0a0a0e2 100644 --- a/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/Project.kt +++ b/gradle/build-logic/src/main/kotlin/mihon/gradle/extensions/Project.kt @@ -1,7 +1,6 @@ package mihon.gradle.extensions import com.android.build.api.dsl.CommonExtension -import com.android.build.gradle.BaseExtension import org.gradle.accessors.dm.LibrariesForLibs import org.gradle.accessors.dm.LibrariesForMihonx import org.gradle.api.Project @@ -19,10 +18,8 @@ internal fun Project.plugins(block: PluginManager.() -> Unit) { pluginManager.apply(block) } -internal fun Project.android(block: CommonExtension<*, *, *, *, *, *>.() -> Unit) { - extensions.configure { - if (this is CommonExtension<*, *, *, *, *, *>) apply(block) - } +internal fun Project.android(block: CommonExtension.() -> Unit) { + extensions.configure(block) } fun Project.configureTest() { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bdaea52cf..3aa44b483 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] aboutLibraries = "14.0.1" android-desugar = "2.1.5" -android-gradle = "8.13.2" +android-gradle = "9.2.0" androidx-activity-compose = "1.13.0" androidx-annotation = "1.10.0" androidx-appCompat = "1.7.1" @@ -83,7 +83,7 @@ androidx-benchmark-macroJunit4 = { module = "androidx.benchmark:benchmark-macro- androidx-biometric = { module = "androidx.biometric:biometric-ktx", version.ref = "androidx-biometric" } androidx-compose-animation = { module = "androidx.compose.animation:animation" } androidx-compose-animationGraphics = { module = "androidx.compose.animation:animation-graphics" } -androidx-compose-bom = { module = "androidx.compose:compose-bom-beta", version.ref = "androidx-compose-bom" } +androidx-compose-bom = { module = "androidx.compose:compose-bom-alpha", version.ref = "androidx-compose-bom" } androidx-compose-foundation = { module = "androidx.compose.foundation:foundation" } androidx-compose-material3 = { module = "androidx.compose.material3:material3" } androidx-compose-materialIcons = { module = "androidx.compose.material:material-icons-extended" } @@ -186,11 +186,11 @@ xmlutil-serialization = { module = "io.github.pdvrieze.xmlutil:serialization", v [plugins] aboutLibraries = { id = "com.mikepenz.aboutlibraries.plugin.android", version.ref = "aboutLibraries" } android-application = { id = "com.android.application", version.ref = "android-gradle" } -android-library = { id = "com.android.library", version.ref = "android-gradle" } android-test = { id = "com.android.test", version.ref = "android-gradle" } +android-kmp-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "android-gradle" } +android-library = { id = "com.android.library", version.ref = "android-gradle" } firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "firebase-crashlytics" } google-services = { id = "com.google.gms.google-services", version.ref = "google-services" } -kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin-gradle" } kotlin-compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin-gradle" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin-gradle" } kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin-gradle" } diff --git a/i18n/build.gradle.kts b/i18n/build.gradle.kts index aba2cab73..808068734 100644 --- a/i18n/build.gradle.kts +++ b/i18n/build.gradle.kts @@ -11,10 +11,12 @@ plugins { kotlin { android { namespace = "tachiyomi.i18n" + + // TODO(antsy): Remove when https://youtrack.jetbrains.com/issue/KT-83319 is resolved + withHostTest { } } @OptIn(ExperimentalKotlinGradlePluginApi::class) - @Suppress("UnstableApiUsage") dependencies { api(libs.moko.resources) } diff --git a/source-api/build.gradle.kts b/source-api/build.gradle.kts index 3d156f3e8..0c56e0344 100644 --- a/source-api/build.gradle.kts +++ b/source-api/build.gradle.kts @@ -8,16 +8,21 @@ plugins { } kotlin { + @Suppress("UnstableApiUsage") android { namespace = "eu.kanade.tachiyomi.source" - - defaultConfig { - consumerProguardFile("consumer-proguard.pro") + optimization { + consumerKeepRules.apply { + publish = true + file("consumer-proguard.pro") + } } + + // TODO(antsy): Remove when https://youtrack.jetbrains.com/issue/KT-83319 is resolved + withHostTest { } } @OptIn(ExperimentalKotlinGradlePluginApi::class) - @Suppress("UnstableApiUsage") dependencies { api(libs.kotlinx.serialization.json) api(libs.injekt) diff --git a/source-local/build.gradle.kts b/source-local/build.gradle.kts index 410dee176..65b10d014 100644 --- a/source-local/build.gradle.kts +++ b/source-local/build.gradle.kts @@ -8,10 +8,12 @@ plugins { kotlin { android { namespace = "tachiyomi.source.local" + + // TODO(antsy): Remove when https://youtrack.jetbrains.com/issue/KT-83319 is resolved + withHostTest { } } @OptIn(ExperimentalKotlinGradlePluginApi::class) - @Suppress("UnstableApiUsage") dependencies { implementation(projects.sourceApi) api(projects.i18n) diff --git a/telemetry/build.gradle.kts b/telemetry/build.gradle.kts index 7a7455e0e..4c2f77e4c 100644 --- a/telemetry/build.gradle.kts +++ b/telemetry/build.gradle.kts @@ -11,9 +11,9 @@ android { sourceSets { getByName("main") { if (Config.includeTelemetry) { - kotlin.srcDirs("src/firebase/kotlin") + kotlin.directories.add("src/firebase/kotlin") } else { - kotlin.srcDirs("src/noop/kotlin") + kotlin.directories.add("src/noop/kotlin") manifest.srcFile("src/noop/AndroidManifext.xml") } }