diff options
-rw-r--r-- | app/build.gradle | 712 | ||||
-rw-r--r-- | gradle.properties | 44 |
2 files changed, 378 insertions, 378 deletions
diff --git a/app/build.gradle b/app/build.gradle index 47ed102f..43391c72 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,356 +1,356 @@ -apply plugin: 'com.android.application'
-apply plugin: 'com.bugsnag.android.gradle'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-apply plugin: 'kotlin-kapt'
-apply plugin: 'com.getkeepsafe.dexcount'
-apply plugin: 'com.gladed.androidgitversion'
-
-
-buildscript {
- repositories {
- jcenter()
- maven { url "https://plugins.gradle.org/m2/" }
- }
- dependencies {
- classpath "com.github.node-gradle:gradle-node-plugin:${Versions.nodeGradle}"
- }
-}
-
-apply plugin: 'com.github.node-gradle.node'
-
-apply from: '../spotless.gradle'
-group = APP_GROUP
-
-android {
- compileSdkVersion Versions.targetSdk
-
- androidGitVersion {
- codeFormat = 'MMNNPPXX'
- format = '%tag%%-count%%-commit%'
- prefix 'v'
- }
-
- defaultConfig {
- applicationId "${project.APP_GROUP}.${project.APP_ID.toLowerCase(Locale.CANADA)}"
- minSdkVersion kau.Versions.minSdk
- targetSdkVersion Versions.targetSdk
-// versionCode 2040700
- versionCode androidGitVersion.code()
-// versionName '2.4.7'
- versionName androidGitVersion.name()
-
- if (System.getenv('TRAVIS') != 'true') {
- // Verification for F-Droid builds
- if (versionCode != androidGitVersion.code()) {
- throw new GradleException("Version code mismatch, expected ${androidGitVersion.code()}, got $versionCode")
- }
- if (versionName != androidGitVersion.name()) {
- throw new GradleException("Version name mismatch, expected ${androidGitVersion.name()}, got $versionName")
- }
- }
- multiDexEnabled true
- testInstrumentationRunner "com.pitchedapps.frost.FrostTestRunner"
- javaCompileOptions {
- annotationProcessorOptions {
- arguments = ["room.schemaLocation": "$projectDir/src/schemas".toString()]
- }
- }
- }
-
- applicationVariants.all { variant ->
- variant.outputs.all {
- outputFileName = "${project.APP_ID}-${variant.buildType.name}.apk"
- }
- }
-
- lintOptions {
- warningsAsErrors true
- disable 'TrustAllX509TrustManager',
- 'UnusedResources',
- 'ContentDescription',
- 'RtlSymmetry',
- 'MissingTranslation'
-
- xmlReport false
- textReport true
- textOutput 'stdout'
- }
-
- buildFeatures {
- viewBinding = true
- }
-
- def testKeystoreFile = file('../files/test.keystore')
- def testPropFile = file('../files/test.properties')
- def withTestSigning = testKeystoreFile.exists() && testPropFile.exists()
-
- def releaseKeystoreFile = file('../files/release.keystore')
- def releasePropFile = file('../files/release.properties')
- def withReleaseSigning = releaseKeystoreFile.exists() && releasePropFile.exists()
-
- signingConfigs {
-
- debug {
- storeFile file("../files/debug.keystore")
- storePassword "debugKey"
- keyAlias "debugKey"
- keyPassword "debugKey"
- }
-
- if (withTestSigning) {
- def testProps = new Properties()
- testPropFile.withInputStream { testProps.load(it) }
-
- test {
- storeFile testKeystoreFile
- storePassword testProps.getProperty('storePassword')
- keyAlias testProps.getProperty('keyAlias')
- keyPassword testProps.getProperty('keyPassword')
- }
- }
-
- if (withReleaseSigning) {
- def releaseProps = new Properties()
- releasePropFile.withInputStream { releaseProps.load(it) }
-
- release {
- storeFile releaseKeystoreFile
- storePassword releaseProps.getProperty('storePassword')
- keyAlias releaseProps.getProperty('keyAlias')
- keyPassword releaseProps.getProperty('keyPassword')
- }
- }
-
- }
-
- def compilerArgs = [
- "-Xuse-experimental=kotlin.Experimental",
- // "-XXLanguage:+InlineClasses",
- "-Xopt-in=kotlin.RequiresOptIn",
- ]
-
- buildTypes {
- debug {
- minifyEnabled false
- shrinkResources false
- applicationIdSuffix ".debug"
- versionNameSuffix "-debug"
- signingConfig signingConfigs.debug
- resValue "string", "frost_name", "Frost Debug"
- resValue "string", "frost_web", "Frost Web Debug"
- ext.enableBugsnag = false
-
- kotlinOptions.freeCompilerArgs += compilerArgs
- }
- releaseTest {
- minifyEnabled true
- shrinkResources true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- applicationIdSuffix ".test"
- versionNameSuffix "-test"
- if (withTestSigning) signingConfig signingConfigs.test
- resValue "string", "frost_name", "Frost Test"
- resValue "string", "frost_web", "Frost Web Test"
- }
- release {
- minifyEnabled true
- shrinkResources true
- if (withReleaseSigning) signingConfig signingConfigs.release
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- resValue "string", "frost_name", "Frost"
- resValue "string", "frost_web", "Frost Web"
- }
- }
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- test.java.srcDirs += 'src/test/kotlin'
- androidTest.java.srcDirs += 'src/androidTest/kotlin'
- main.assets.srcDirs += ['src/web/assets']
- }
-
- packagingOptions {
- pickFirst 'META-INF/core_release.kotlin_module'
- pickFirst 'META-INF/library_release.kotlin_module'
- }
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- kotlinOptions {
- jvmTarget = JavaVersion.VERSION_1_8.toString()
- }
-
- testOptions.unitTests {
- includeAndroidResources = true
- // Don't throw runtime exceptions for android calls that are not mocked
- returnDefaultValues = true
-
- // Always show the result of every unit test, even if it passes.
- all {
- testLogging {
- events 'skipped', 'failed', 'standardError'
- }
- }
- }
-
- androidExtensions {
- experimental = true
- features = ["parcelize"]
- }
-
-}
-
-node {
- version = '13.8.0'
- npmVersion = '6.13.7'
- download = true
- nodeModulesDir = file("${project.projectDir}/src/web")
-}
-
-task npmCi(type: NpmTask) {
- dependsOn npmSetup
- npmCommand = ["ci"]
-}
-
-task frostWebGen(type: NpmTask) {
- dependsOn npmCi
- group 'build'
- description 'Generate Frost web assets'
- args = ['run', 'compile']
-}
-
-preBuild.dependsOn(frostWebGen)
-
-repositories {
- google()
- jcenter()
- maven { url "https://jitpack.io" }
-}
-
-dependencies {
- androidTestImplementation kau.Dependencies.kotlinTest
- androidTestImplementation kau.Dependencies.espresso
- androidTestImplementation kau.Dependencies.testRules
- androidTestImplementation kau.Dependencies.testRunner
- androidTestImplementation kau.Dependencies.kotlinReflect
-
- testImplementation kau.Dependencies.kotlinTest
- testImplementation kau.Dependencies.kotlinReflect
- testImplementation kau.Dependencies.junit
-
- implementation kau.Dependencies.kotlin
-
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('core', KAU)
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('core-ui', KAU)
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('adapter', KAU)
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('fastadapter', KAU)
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('about', KAU)
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('colorpicker', KAU)
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('mediapicker', KAU)
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('kpref-activity', KAU)
- //noinspection GradleDependency
- implementation kau.Dependencies.kau('searchview', KAU)
-
- implementation kau.Dependencies.coreKtx
- implementation kau.Dependencies.swipeRefreshLayout
-
- implementation "androidx.biometric:biometric:${Versions.andxBiometric}"
-
- implementation kau.Dependencies.koin
- testImplementation kau.Dependencies.koinTest
- androidTestImplementation kau.Dependencies.koinTest
-
- implementation kau.Dependencies.coroutines
-
- implementation "org.apache.commons:commons-text:${Versions.apacheCommonsText}"
-
- implementation "com.devbrackets.android:exomedia:${Versions.exoMedia}"
-
- implementation kau.Dependencies.fastAdapter("diff")
- implementation kau.Dependencies.fastAdapter("drag")
- implementation kau.Dependencies.fastAdapter("expandable")
-
- //noinspection GradleDependency
- implementation kau.Dependencies.glide
- //noinspection GradleDependency
- kapt kau.Dependencies.glideKapt
-
- debugImplementation kau.Dependencies.leakCanary
-
- //Icons
- implementation kau.Dependencies.iconicsMaterial
- implementation kau.Dependencies.iconicsCommunity
-
- implementation kau.Dependencies.materialDialog("input")
-
- implementation "org.jsoup:jsoup:${Versions.jsoup}"
-
- implementation "com.squareup.okhttp3:okhttp:${Versions.okhttp}"
- implementation "com.squareup.okhttp3:logging-interceptor:${Versions.okhttp}"
- testImplementation "com.squareup.okhttp3:mockwebserver:${Versions.okhttp}"
- androidTestImplementation "com.squareup.okhttp3:mockwebserver:${Versions.okhttp}"
-
- implementation kau.Dependencies.bugsnag
-
- implementation "com.davemorrissey.labs:subsampling-scale-image-view:${Versions.scaleImageView}"
-
- implementation "androidx.room:room-ktx:${Versions.room}"
- implementation "androidx.room:room-runtime:${Versions.room}"
- kapt "androidx.room:room-compiler:${Versions.room}"
- testImplementation "androidx.room:room-testing:${Versions.room}"
-
-}
-
-def kotlinResolutions = ['kotlin-reflect',
- 'kotlin-stdlib',
- 'kotlin-stdlib-jdk7',
- 'kotlin-stdlib-jdk8',
- 'kotlin-test',
- 'kotlin-test-junit4',
- 'kotlin-test-junit5']
-
-configurations.all {
- resolutionStrategy.eachDependency { DependencyResolveDetails details ->
- def requested = details.requested
- if (requested.group == 'org.jetbrains.kotlin' && requested.name in kotlinResolutions) {
- details.useVersion kau.Versions.kotlin
- }
- }
-}
-
-task lintGithubReleaseApk {
- dependsOn 'spotlessCheck'
- dependsOn 'lintRelease'
-}
-
-task testGithubReleaseApk {
- dependsOn 'testReleaseUnitTest'
- dependsOn 'connectedAndroidTest'
-}
-
-task assembleGithubReleaseApk {
- dependsOn 'assembleRelease'
-}
-
-// Validates code and generates apk
-// TODO order tasks; though technically it doesn't matter
-task createGithubReleaseApk {
- dependsOn 'lintGithubReleaseApk'
- dependsOn 'testGithubReleaseApk'
- dependsOn 'assembleGithubReleaseApk'
-
- tasks.findByName('testGithubReleaseApk').mustRunAfter 'lintGithubReleaseApk'
- tasks.findByName('assembleGithubReleaseApk').mustRunAfter 'testGithubReleaseApk'
-}
+apply plugin: 'com.android.application' +apply plugin: 'com.bugsnag.android.gradle' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' +apply plugin: 'com.getkeepsafe.dexcount' +apply plugin: 'com.gladed.androidgitversion' + + +buildscript { + repositories { + jcenter() + maven { url "https://plugins.gradle.org/m2/" } + } + dependencies { + classpath "com.github.node-gradle:gradle-node-plugin:${Versions.nodeGradle}" + } +} + +apply plugin: 'com.github.node-gradle.node' + +apply from: '../spotless.gradle' +group = APP_GROUP + +android { + compileSdkVersion Versions.targetSdk + + androidGitVersion { + codeFormat = 'MMNNPPXX' + format = '%tag%%-count%%-commit%' + prefix 'v' + } + + defaultConfig { + applicationId "${project.APP_GROUP}.${project.APP_ID.toLowerCase(Locale.CANADA)}" + minSdkVersion kau.Versions.minSdk + targetSdkVersion Versions.targetSdk +// versionCode 2040700 + versionCode androidGitVersion.code() +// versionName '2.4.7' + versionName androidGitVersion.name() + + if (System.getenv('TRAVIS') != 'true') { + // Verification for F-Droid builds + if (versionCode != androidGitVersion.code()) { + throw new GradleException("Version code mismatch, expected ${androidGitVersion.code()}, got $versionCode") + } + if (versionName != androidGitVersion.name()) { + throw new GradleException("Version name mismatch, expected ${androidGitVersion.name()}, got $versionName") + } + } + multiDexEnabled true + testInstrumentationRunner "com.pitchedapps.frost.FrostTestRunner" + javaCompileOptions { + annotationProcessorOptions { + arguments = ["room.schemaLocation": "$projectDir/src/schemas".toString()] + } + } + } + + applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "${project.APP_ID}-${variant.buildType.name}.apk" + } + } + + lintOptions { + warningsAsErrors true + disable 'TrustAllX509TrustManager', + 'UnusedResources', + 'ContentDescription', + 'RtlSymmetry', + 'MissingTranslation' + + xmlReport false + textReport true + textOutput 'stdout' + } + + buildFeatures { + viewBinding = true + } + + def testKeystoreFile = file('../files/test.keystore') + def testPropFile = file('../files/test.properties') + def withTestSigning = testKeystoreFile.exists() && testPropFile.exists() + + def releaseKeystoreFile = file('../files/release.keystore') + def releasePropFile = file('../files/release.properties') + def withReleaseSigning = releaseKeystoreFile.exists() && releasePropFile.exists() + + signingConfigs { + + debug { + storeFile file("../files/debug.keystore") + storePassword "debugKey" + keyAlias "debugKey" + keyPassword "debugKey" + } + + if (withTestSigning) { + def testProps = new Properties() + testPropFile.withInputStream { testProps.load(it) } + + test { + storeFile testKeystoreFile + storePassword testProps.getProperty('storePassword') + keyAlias testProps.getProperty('keyAlias') + keyPassword testProps.getProperty('keyPassword') + } + } + + if (withReleaseSigning) { + def releaseProps = new Properties() + releasePropFile.withInputStream { releaseProps.load(it) } + + release { + storeFile releaseKeystoreFile + storePassword releaseProps.getProperty('storePassword') + keyAlias releaseProps.getProperty('keyAlias') + keyPassword releaseProps.getProperty('keyPassword') + } + } + + } + + def compilerArgs = [ + "-Xuse-experimental=kotlin.Experimental", + // "-XXLanguage:+InlineClasses", + "-Xopt-in=kotlin.RequiresOptIn", + ] + + buildTypes { + debug { + minifyEnabled false + shrinkResources false + applicationIdSuffix ".debug" + versionNameSuffix "-debug" + signingConfig signingConfigs.debug + resValue "string", "frost_name", "Frost Debug" + resValue "string", "frost_web", "Frost Web Debug" + ext.enableBugsnag = false + + kotlinOptions.freeCompilerArgs += compilerArgs + } + releaseTest { + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + applicationIdSuffix ".test" + versionNameSuffix "-test" + if (withTestSigning) signingConfig signingConfigs.test + resValue "string", "frost_name", "Frost Test" + resValue "string", "frost_web", "Frost Web Test" + } + release { + minifyEnabled true + shrinkResources true + if (withReleaseSigning) signingConfig signingConfigs.release + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + resValue "string", "frost_name", "Frost" + resValue "string", "frost_web", "Frost Web" + } + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + test.java.srcDirs += 'src/test/kotlin' + androidTest.java.srcDirs += 'src/androidTest/kotlin' + main.assets.srcDirs += ['src/web/assets'] + } + + packagingOptions { + pickFirst 'META-INF/core_release.kotlin_module' + pickFirst 'META-INF/library_release.kotlin_module' + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + testOptions.unitTests { + includeAndroidResources = true + // Don't throw runtime exceptions for android calls that are not mocked + returnDefaultValues = true + + // Always show the result of every unit test, even if it passes. + all { + testLogging { + events 'skipped', 'failed', 'standardError' + } + } + } + + androidExtensions { + experimental = true + features = ["parcelize"] + } + +} + +node { + version = '13.8.0' + npmVersion = '6.13.7' + download = true + nodeModulesDir = file("${project.projectDir}/src/web") +} + +task npmCi(type: NpmTask) { + dependsOn npmSetup + npmCommand = ["ci"] +} + +task frostWebGen(type: NpmTask) { + dependsOn npmCi + group 'build' + description 'Generate Frost web assets' + args = ['run', 'compile'] +} + +preBuild.dependsOn(frostWebGen) + +repositories { + google() + jcenter() + maven { url "https://jitpack.io" } +} + +dependencies { + androidTestImplementation kau.Dependencies.kotlinTest + androidTestImplementation kau.Dependencies.espresso + androidTestImplementation kau.Dependencies.testRules + androidTestImplementation kau.Dependencies.testRunner + androidTestImplementation kau.Dependencies.kotlinReflect + + testImplementation kau.Dependencies.kotlinTest + testImplementation kau.Dependencies.kotlinReflect + testImplementation kau.Dependencies.junit + + implementation kau.Dependencies.kotlin + + //noinspection GradleDependency + implementation kau.Dependencies.kau('core', KAU) + //noinspection GradleDependency + implementation kau.Dependencies.kau('core-ui', KAU) + //noinspection GradleDependency + implementation kau.Dependencies.kau('adapter', KAU) + //noinspection GradleDependency + implementation kau.Dependencies.kau('fastadapter', KAU) + //noinspection GradleDependency + implementation kau.Dependencies.kau('about', KAU) + //noinspection GradleDependency + implementation kau.Dependencies.kau('colorpicker', KAU) + //noinspection GradleDependency + implementation kau.Dependencies.kau('mediapicker', KAU) + //noinspection GradleDependency + implementation kau.Dependencies.kau('kpref-activity', KAU) + //noinspection GradleDependency + implementation kau.Dependencies.kau('searchview', KAU) + + implementation kau.Dependencies.coreKtx + implementation kau.Dependencies.swipeRefreshLayout + + implementation "androidx.biometric:biometric:${Versions.andxBiometric}" + + implementation kau.Dependencies.koin + testImplementation kau.Dependencies.koinTest + androidTestImplementation kau.Dependencies.koinTest + + implementation kau.Dependencies.coroutines + + implementation "org.apache.commons:commons-text:${Versions.apacheCommonsText}" + + implementation "com.devbrackets.android:exomedia:${Versions.exoMedia}" + + implementation kau.Dependencies.fastAdapter("diff") + implementation kau.Dependencies.fastAdapter("drag") + implementation kau.Dependencies.fastAdapter("expandable") + + //noinspection GradleDependency + implementation kau.Dependencies.glide + //noinspection GradleDependency + kapt kau.Dependencies.glideKapt + + debugImplementation kau.Dependencies.leakCanary + + //Icons + implementation kau.Dependencies.iconicsMaterial + implementation kau.Dependencies.iconicsCommunity + + implementation kau.Dependencies.materialDialog("input") + + implementation "org.jsoup:jsoup:${Versions.jsoup}" + + implementation "com.squareup.okhttp3:okhttp:${Versions.okhttp}" + implementation "com.squareup.okhttp3:logging-interceptor:${Versions.okhttp}" + testImplementation "com.squareup.okhttp3:mockwebserver:${Versions.okhttp}" + androidTestImplementation "com.squareup.okhttp3:mockwebserver:${Versions.okhttp}" + + implementation kau.Dependencies.bugsnag + + implementation "com.davemorrissey.labs:subsampling-scale-image-view:${Versions.scaleImageView}" + + implementation "androidx.room:room-ktx:${Versions.room}" + implementation "androidx.room:room-runtime:${Versions.room}" + kapt "androidx.room:room-compiler:${Versions.room}" + testImplementation "androidx.room:room-testing:${Versions.room}" + +} + +def kotlinResolutions = ['kotlin-reflect', + 'kotlin-stdlib', + 'kotlin-stdlib-jdk7', + 'kotlin-stdlib-jdk8', + 'kotlin-test', + 'kotlin-test-junit4', + 'kotlin-test-junit5'] + +configurations.all { + resolutionStrategy.eachDependency { DependencyResolveDetails details -> + def requested = details.requested + if (requested.group == 'org.jetbrains.kotlin' && requested.name in kotlinResolutions) { + details.useVersion kau.Versions.kotlin + } + } +} + +task lintGithubReleaseApk { + dependsOn 'spotlessCheck' + dependsOn 'lintRelease' +} + +task testGithubReleaseApk { + dependsOn 'testReleaseUnitTest' + dependsOn 'connectedAndroidTest' +} + +task assembleGithubReleaseApk { + dependsOn 'assembleRelease' +} + +// Validates code and generates apk +// TODO order tasks; though technically it doesn't matter +task createGithubReleaseApk { + dependsOn 'lintGithubReleaseApk' + dependsOn 'testGithubReleaseApk' + dependsOn 'assembleGithubReleaseApk' + + tasks.findByName('testGithubReleaseApk').mustRunAfter 'lintGithubReleaseApk' + tasks.findByName('assembleGithubReleaseApk').mustRunAfter 'testGithubReleaseApk' +}
\ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 6b46ab89..0f07376d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,22 +1,22 @@ -# Project-wide Gradle settings.
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
-org.gradle.daemon = true
-
-APP_ID=Frost
-APP_GROUP=com.pitchedapps
-
-KAU=67825d6
-
-android.useAndroidX=true
-android.enableJetifier=true
+# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +org.gradle.daemon = true + +APP_ID=Frost +APP_GROUP=com.pitchedapps + +KAU=67825d6 + +android.useAndroidX=true +android.enableJetifier=true |