mirror of
https://github.com/ankidroid/Anki-Android.git
synced 2024-09-20 03:52:15 +02:00
6b65c45386
See https://docs.gradle.org/current/userguide/plugins.html#sec:plugins_block The plugins that are to be used in different modules are added in the top level build file with apply "false"(doesn't make sense to apply them on the root project). Then the project modules, from the plugins already available on the classpath, actually apply the ones they need. Ktlint plugin was applied directly to all subprojects(initially it was added through allprojects {} but it doesn't make sense to add it to the root project as it doesn't contain source code, so subprojects{} was used instead). The amazonappstorepublisher plugin also required some custom configuration as we need the latest versions which are not available in mavenCentral() but can be fetched from jitpack.io.
150 lines
7.3 KiB
Groovy
150 lines
7.3 KiB
Groovy
import org.gradle.internal.jvm.Jvm
|
|
|
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
|
buildscript {
|
|
// The version for the Kotlin plugin and dependencies
|
|
// If changing this, make sure to update org.jetbrains.kotlin.plugin.serialization version too
|
|
ext.kotlin_version = '1.9.10'
|
|
ext.lint_version = '31.1.1'
|
|
ext.acra_version = '5.11.1'
|
|
ext.ankidroid_backend_version = '0.1.25-anki2.1.66'
|
|
ext.hamcrest_version = '2.2'
|
|
ext.junit_version = '5.10.0'
|
|
ext.coroutines_version = '1.7.3'
|
|
ext.fragments_version = "1.6.1"
|
|
ext.espresso_version = '3.5.1'
|
|
ext.androidx_test_version = '1.5.0'
|
|
ext.androidx_test_junit_version = '1.1.5'
|
|
ext.robolectric_version = '4.10.3'
|
|
ext.android_gradle_plugin = "8.0.2"
|
|
|
|
configurations.all {
|
|
resolutionStrategy.eachDependency { details ->
|
|
if (details.requested.group == 'org.jetbrains.kotlinx'
|
|
&& details.requested.name.contains('kotlinx-serialization-runtime')
|
|
&& details.requested.version.contains('0.11.0')) {
|
|
details.useVersion "0.14.0"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
plugins {
|
|
id 'com.android.application' version "$android_gradle_plugin" apply false
|
|
id 'com.android.library' version "$android_gradle_plugin" apply false
|
|
id 'org.jetbrains.kotlin.jvm' version "$kotlin_version" apply false
|
|
id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false
|
|
id 'org.jetbrains.kotlin.plugin.parcelize' version "$kotlin_version" apply false
|
|
id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version" apply false
|
|
id 'org.jlleitschuh.gradle.ktlint' version '11.5.1' apply false
|
|
}
|
|
|
|
Properties localProperties = new Properties()
|
|
if (project.rootProject.file('local.properties').exists()) {
|
|
localProperties.load(project.rootProject.file('local.properties').newDataInputStream())
|
|
}
|
|
Boolean fatalWarnings = !(localProperties['fatal_warnings'] == "false")
|
|
|
|
// Here we extract per-module "best practices" settings to a single top-level evaluation
|
|
subprojects {
|
|
apply plugin: "org.jlleitschuh.gradle.ktlint"
|
|
|
|
afterEvaluate { project ->
|
|
if (project.hasProperty('android')) {
|
|
project.android.testOptions.unitTests {
|
|
includeAndroidResources = true
|
|
}
|
|
project.android.testOptions.unitTests.all {
|
|
// tell backend to avoid rollover time, and disable interval fuzzing
|
|
environment "ANKI_TEST_MODE", "1"
|
|
|
|
useJUnitPlatform()
|
|
testLogging {
|
|
events "failed", "skipped"
|
|
showStackTraces = true
|
|
exceptionFormat = "full"
|
|
}
|
|
|
|
maxParallelForks = gradleTestMaxParallelForks
|
|
forkEvery = 40
|
|
systemProperties['junit.jupiter.execution.parallel.enabled'] = true
|
|
systemProperties['junit.jupiter.execution.parallel.mode.default'] = "concurrent"
|
|
}
|
|
}
|
|
|
|
/**
|
|
Kotlin allows concrete function implementations inside interfaces.
|
|
For those to work when Kotlin compilation targets the JVM backend, you have to enable the interoperability via
|
|
'freeCompilerArgs' in your gradle file, and you have to choose one of the appropriate '-Xjvm-default' modes.
|
|
|
|
https://kotlinlang.org/docs/java-to-kotlin-interop.html#default-methods-in-interfaces
|
|
|
|
and we used "all" because we don't have downstream consumers
|
|
https://docs.gradle.org/current/userguide/task_configuration_avoidance.html
|
|
|
|
Related to ExperimentalCoroutinesApi: this opt-in is added to enable usage of experimental
|
|
coroutines API, this targets all project modules with the exception of the "api" module,
|
|
which doesn't use coroutines so the annotation isn't not available. This would normally
|
|
result in a warning but we treat warnings as errors.
|
|
(see https://youtrack.jetbrains.com/issue/KT-28777/Using-experimental-coroutines-api-causes-unresolved-dependency)
|
|
*/
|
|
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
|
|
kotlinOptions {
|
|
allWarningsAsErrors = fatalWarnings
|
|
def compilerArgs = ['-Xjvm-default=all']
|
|
if (project.name != "api") {
|
|
compilerArgs += ['-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi']
|
|
}
|
|
freeCompilerArgs = compilerArgs
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ext {
|
|
|
|
jvmVersion = Jvm.current().javaVersion.majorVersion
|
|
if (jvmVersion != "17" && jvmVersion != "18") {
|
|
println "\n\n\n"
|
|
println "**************************************************************************************************************"
|
|
println "\n\n\n"
|
|
println "ERROR: AnkiDroid builds with JVM version 17 or 18."
|
|
println " Incompatible major version detected: '" + jvmVersion + "'"
|
|
println "\n\n\n"
|
|
println " If you receive this error because you want to use a newer JDK, we may accept PRs to support new versions."
|
|
println " Edit the main build.gradle file, find this message in the file, and add support for the new version."
|
|
println " Please make sure the `jacocoTestReport` target works on an emulator with our minSdkVersion (currently 21)."
|
|
println "\n\n\n"
|
|
println "**************************************************************************************************************"
|
|
println "\n\n\n"
|
|
System.exit(1)
|
|
}
|
|
ciBuild = System.getenv("CI") == "true" // works for Travis CI or Github Actions
|
|
// allows for -Dpre-dex=false to be set
|
|
preDexEnabled = "true" == System.getProperty("pre-dex", "true")
|
|
// allows for universal APKs to be generated
|
|
universalApkEnabled = "true" == System.getProperty("universal-apk", "false")
|
|
|
|
if (System.getProperty("os.name") == "Mac OS X") {
|
|
// macOS reports hardware cores. This is accurate for CI, Intel (halved due to SMT) and Apple Silicon
|
|
gradleTestMaxParallelForks = "sysctl -n hw.physicalcpu".execute().text.toInteger()
|
|
} else if (ciBuild) {
|
|
// GitHub Actions (Standard_DS2_v2) are 1:1 on Linux/Windows with two vCPU cores
|
|
// Sources:
|
|
// Standard_DS2_v2 https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#cloud-hosts-for-github-hosted-runners
|
|
// Which is 1:1 https://docs.microsoft.com/en-gb/azure/virtual-machines/acu : DS1_v2 - DS15_v2 | 1:1
|
|
gradleTestMaxParallelForks = 2
|
|
|
|
// separate gradle compile process is a major speed improvement, but consumes 2x RAM
|
|
// the CI machines don't have enough RAM to do that without going in to swap quite a bit
|
|
// so for CI machines only - to improve reliability despite compilation speed hit, compile kotlin in process
|
|
println "CI build detected: setting compiler execution strategy to IN_PROCESS"
|
|
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
|
|
compilerExecutionStrategy.set(org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy.IN_PROCESS)
|
|
}
|
|
} else {
|
|
// Use 50% of cores to account for SMT which doesn't help this workload
|
|
gradleTestMaxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
|
|
}
|
|
}
|