mirror of
https://github.com/nextcloud/android.git
synced 2024-11-25 22:55:46 +03:00
21ed337184
Use `./gradlew installGplayDebug -P "leakCanary"`, for example, to activate it. LeakCanary dramatically slows down normal development work due to app freezes for memory dumps. This way we can avoid that, but still use it when we want to check for leaks. I don't think leaks should be a primary focus right now, since we have other stuff to work on first. Signed-off-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>
442 lines
17 KiB
Groovy
442 lines
17 KiB
Groovy
import com.github.spotbugs.snom.SpotBugsTask
|
|
import org.gradle.internal.jvm.Jvm
|
|
|
|
buildscript {
|
|
dependencies {
|
|
classpath 'com.android.tools.build:gradle:7.1.3'
|
|
classpath 'com.hiya:jacoco-android:0.2'
|
|
classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.0.6'
|
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.20.0"
|
|
classpath "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2
|
|
classpath 'com.karumi:shot:5.14.0'
|
|
classpath "org.jacoco:org.jacoco.core:$jacoco_version"
|
|
classpath "org.jacoco:org.jacoco.report:$jacoco_version"
|
|
classpath "org.jacoco:org.jacoco.agent:$jacoco_version"
|
|
classpath "org.jlleitschuh.gradle:ktlint-gradle:10.2.1"
|
|
}
|
|
}
|
|
|
|
apply plugin: 'com.android.application'
|
|
|
|
apply plugin: 'kotlin-android'
|
|
apply plugin: 'kotlin-kapt'
|
|
apply plugin: 'kotlin-parcelize'
|
|
apply plugin: 'checkstyle'
|
|
apply plugin: 'pmd'
|
|
apply plugin: 'com.hiya.jacoco-android'
|
|
apply plugin: 'com.github.spotbugs'
|
|
apply plugin: 'io.gitlab.arturbosch.detekt'
|
|
apply plugin: 'shot'
|
|
apply plugin: "org.jlleitschuh.gradle.ktlint"
|
|
|
|
println "Gradle uses Java ${Jvm.current()}"
|
|
|
|
configurations {
|
|
all {
|
|
exclude group: 'org.jetbrains', module: 'annotations-java5' // via prism4j, already using annotations explicitly
|
|
|
|
// check for updates every build
|
|
resolutionStrategy {
|
|
cacheChangingModulesFor 0, 'seconds'
|
|
exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-debug"
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
configurations.configureEach {
|
|
resolutionStrategy.eachDependency {
|
|
if (requested.group == "org.checkerframework" && requested.name != "checker-compat-qual") {
|
|
useVersion(checkerVersion)
|
|
because("https://github.com/google/ExoPlayer/issues/10007")
|
|
}
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
google()
|
|
maven { url "https://jitpack.io" }
|
|
mavenCentral()
|
|
maven {
|
|
url 'https://plugins.gradle.org/m2/'
|
|
}
|
|
}
|
|
|
|
// semantic versioning for version code
|
|
def versionMajor = 3
|
|
def versionMinor = 20
|
|
def versionPatch = 0
|
|
def versionBuild = 0 // 0-50=Alpha / 51-98=RC / 90-99=stable
|
|
|
|
|
|
def ndkEnv = new HashMap<String, String>()
|
|
file("$project.rootDir/ndk.env").readLines().each() {
|
|
def (key, value) = it.tokenize('=')
|
|
ndkEnv.put(key, value)
|
|
}
|
|
|
|
android {
|
|
|
|
compileSdkVersion 31
|
|
// install this NDK version and Cmake to produce smaller APKs. Build will still work if not installed
|
|
ndkVersion "${ndkEnv.get("NDK_VERSION")}"
|
|
|
|
defaultConfig {
|
|
minSdkVersion 23
|
|
targetSdkVersion 30
|
|
|
|
buildConfigField 'boolean', 'CI', ciBuild.toString()
|
|
|
|
// arguments to be passed to functional tests
|
|
testInstrumentationRunner "com.nextcloud.client.ScreenshotTestRunner"
|
|
testInstrumentationRunnerArgument "TEST_SERVER_URL", "${NC_TEST_SERVER_BASEURL}"
|
|
testInstrumentationRunnerArgument "TEST_SERVER_USERNAME", "${NC_TEST_SERVER_USERNAME}"
|
|
testInstrumentationRunnerArgument "TEST_SERVER_PASSWORD", "${NC_TEST_SERVER_PASSWORD}"
|
|
testInstrumentationRunnerArguments disableAnalytics: 'true'
|
|
|
|
multiDexEnabled true
|
|
|
|
versionCode versionMajor * 10000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild
|
|
|
|
if (versionBuild > 89) {
|
|
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
|
|
} else if (versionBuild > 50) {
|
|
versionName "${versionMajor}.${versionMinor}.${versionPatch} RC" + (versionBuild - 50)
|
|
} else {
|
|
versionName "${versionMajor}.${versionMinor}.${versionPatch} Alpha" + (versionBuild + 1)
|
|
}
|
|
|
|
// adapt structure from Eclipse to Gradle/Android Studio expectations;
|
|
// see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure
|
|
|
|
flavorDimensions "default"
|
|
|
|
buildTypes {
|
|
debug {
|
|
testCoverageEnabled (project.hasProperty('coverage'))
|
|
}
|
|
}
|
|
|
|
productFlavors {
|
|
// used for f-droid
|
|
generic {
|
|
applicationId 'com.nextcloud.client'
|
|
dimension "default"
|
|
}
|
|
|
|
gplay {
|
|
applicationId 'com.nextcloud.client'
|
|
dimension "default"
|
|
}
|
|
|
|
huawei {
|
|
applicationId 'com.nextcloud.client'
|
|
dimension "default"
|
|
}
|
|
|
|
versionDev {
|
|
applicationId "com.nextcloud.android.beta"
|
|
dimension "default"
|
|
versionCode 20220322
|
|
versionName "20220322"
|
|
}
|
|
|
|
qa {
|
|
applicationId "com.nextcloud.android.qa"
|
|
dimension "default"
|
|
versionCode 1
|
|
versionName "1"
|
|
}
|
|
}
|
|
|
|
testOptions {
|
|
unitTests.returnDefaultValues = true
|
|
animationsDisabled true
|
|
}
|
|
}
|
|
|
|
// adapt structure from Eclipse to Gradle/Android Studio expectations;
|
|
// see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure
|
|
packagingOptions {
|
|
resources {
|
|
excludes += ['META-INF/LICENSE.txt', 'META-INF/LICENSE']
|
|
}
|
|
}
|
|
|
|
tasks.register("checkstyle", Checkstyle) {
|
|
configFile = file("${rootProject.projectDir}/checkstyle.xml")
|
|
configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath
|
|
source 'src'
|
|
include '**/*.java'
|
|
exclude '**/gen/**'
|
|
classpath = files()
|
|
}
|
|
|
|
tasks.register("pmd", Pmd) {
|
|
ruleSetFiles = files("${project.rootDir}/ruleset.xml")
|
|
ignoreFailures = true // should continue checking
|
|
ruleSets = []
|
|
|
|
source 'src'
|
|
include '**/*.java'
|
|
exclude '**/gen/**'
|
|
|
|
reports {
|
|
xml.enabled = false
|
|
html.enabled = true
|
|
xml {
|
|
destination = file("$project.buildDir/reports/pmd/pmd.xml")
|
|
}
|
|
html {
|
|
destination = file("$project.buildDir/reports/pmd/pmd.html")
|
|
}
|
|
}
|
|
}
|
|
|
|
check.dependsOn 'checkstyle', 'spotbugsGplayDebug', 'pmd', 'lint', 'ktlintCheck', 'detekt'
|
|
|
|
buildFeatures {
|
|
dataBinding true
|
|
viewBinding true
|
|
}
|
|
|
|
kotlinOptions {
|
|
jvmTarget = "1.8"
|
|
}
|
|
|
|
lint {
|
|
abortOnError false
|
|
checkGeneratedSources true
|
|
disable 'MissingTranslation', 'GradleDependency', 'VectorPath', 'IconMissingDensityFolder', 'IconDensities', 'GoogleAppIndexingWarning', 'MissingDefaultResource', 'InvalidPeriodicWorkRequestInterval', 'StringFormatInvalid', 'MissingQuantity'
|
|
htmlOutput file("$project.buildDir/reports/lint/lint.html")
|
|
htmlReport true
|
|
}
|
|
|
|
}
|
|
|
|
dependencies {
|
|
// dependencies for app building
|
|
implementation 'androidx.multidex:multidex:2.0.1'
|
|
// implementation project('nextcloud-android-library')
|
|
implementation ("com.github.nextcloud:android-library:$androidLibraryVersion") {
|
|
exclude group: 'org.ogce', module: 'xpp3' // unused in Android and brings wrong Junit version
|
|
}
|
|
|
|
compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2' // remove after entire switch to lib v2
|
|
implementation "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2
|
|
implementation 'org.apache.jackrabbit:jackrabbit-webdav:2.13.5' // remove after entire switch to lib v2
|
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
|
|
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
|
implementation 'com.google.android.material:material:1.5.0'
|
|
implementation 'com.jakewharton:disklrucache:2.0.2'
|
|
implementation 'androidx.appcompat:appcompat:1.4.1'
|
|
implementation 'androidx.webkit:webkit:1.4.0'
|
|
implementation 'androidx.cardview:cardview:1.0.0'
|
|
implementation 'androidx.exifinterface:exifinterface:1.3.3'
|
|
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1"
|
|
implementation "androidx.work:work-runtime:$workRuntime"
|
|
implementation "androidx.work:work-runtime-ktx:$workRuntime"
|
|
implementation "androidx.fragment:fragment-ktx:1.4.1"
|
|
implementation 'com.github.albfernandez:juniversalchardet:2.0.3' // need this version for Android <7
|
|
compileOnly 'com.google.code.findbugs:annotations:3.0.1u2'
|
|
implementation 'commons-io:commons-io:2.11.0'
|
|
implementation 'org.greenrobot:eventbus:3.3.1'
|
|
implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.3'
|
|
implementation 'org.lukhnos:nnio:0.2'
|
|
implementation 'org.bouncycastle:bcpkix-jdk15to18:1.70'
|
|
implementation 'com.google.code.gson:gson:2.9.0'
|
|
implementation 'com.afollestad:sectioned-recyclerview:0.5.0'
|
|
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
|
|
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.24'
|
|
implementation 'com.github.tobiaskaminsky:qrcodescanner:0.1.2.4' // 'com.github.blikoon:QRCodeScanner:0.1.2'
|
|
implementation 'com.google.android:flexbox:2.0.1'
|
|
implementation('com.github.bumptech.glide:glide:3.8.0') {
|
|
exclude group: "com.android.support"
|
|
}
|
|
implementation 'com.caverock:androidsvg:1.4'
|
|
implementation 'androidx.annotation:annotation:1.3.0'
|
|
implementation 'com.vanniktech:emoji-google:0.9.0'
|
|
|
|
implementation "com.github.cotechde.hwsecurity:hwsecurity-fido:$fidoVersion"
|
|
implementation "com.github.cotechde.hwsecurity:hwsecurity-fido2:$fidoVersion"
|
|
|
|
// document scanner not available on FDroid (generic) due to OpenCV binaries
|
|
gplayImplementation "com.github.zynkware:Document-Scanning-Android-SDK:$documentScannerVersion"
|
|
huaweiImplementation "com.github.zynkware:Document-Scanning-Android-SDK:$documentScannerVersion"
|
|
qaImplementation "com.github.zynkware:Document-Scanning-Android-SDK:$documentScannerVersion"
|
|
versionDevImplementation "com.github.zynkware:Document-Scanning-Android-SDK:$documentScannerVersion"
|
|
|
|
spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.12.0'
|
|
spotbugsPlugins 'com.mebigfatguy.fb-contrib:fb-contrib:7.4.7'
|
|
|
|
implementation "com.google.dagger:dagger:$daggerVersion"
|
|
implementation "com.google.dagger:dagger-android:$daggerVersion"
|
|
implementation "com.google.dagger:dagger-android-support:$daggerVersion"
|
|
kapt "com.google.dagger:dagger-compiler:$daggerVersion"
|
|
kapt "com.google.dagger:dagger-android-processor:$daggerVersion"
|
|
|
|
implementation 'org.conscrypt:conscrypt-android:2.5.2'
|
|
|
|
implementation "com.google.android.exoplayer:exoplayer:$exoplayerVersion"
|
|
implementation "com.google.android.exoplayer:extension-okhttp:$exoplayerVersion"
|
|
|
|
implementation 'com.simplecityapps:recyclerview-fastscroll:2.0.1'
|
|
|
|
// Shimmer animation
|
|
implementation 'com.elyeproj.libraries:loaderviewlibrary:2.0.0'
|
|
|
|
// dependencies for markdown rendering
|
|
implementation "io.noties.markwon:core:$markwonVersion"
|
|
implementation "io.noties.markwon:ext-strikethrough:$markwonVersion"
|
|
implementation "io.noties.markwon:ext-tables:$markwonVersion"
|
|
implementation "io.noties.markwon:ext-tasklist:$markwonVersion"
|
|
implementation "io.noties.markwon:html:$markwonVersion"
|
|
|
|
implementation "io.noties.markwon:syntax-highlight:$markwonVersion"
|
|
implementation "io.noties:prism4j:$prismVersion"
|
|
kapt "io.noties:prism4j-bundler:$prismVersion"
|
|
|
|
implementation ('org.mnode.ical4j:ical4j:1.0.8') {
|
|
['org.apache.commons','commons-logging'].each {
|
|
exclude group: "$it"
|
|
}
|
|
}
|
|
|
|
if (project.hasProperty("leakCanary")) {
|
|
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
|
|
}
|
|
|
|
// dependencies for local unit tests
|
|
testImplementation 'junit:junit:4.13.2'
|
|
testImplementation "org.mockito:mockito-core:$mockitoVersion"
|
|
testImplementation "androidx.test:core:$androidxTestVersion"
|
|
testImplementation "org.powermock:powermock-core:$powermockVersion"
|
|
testImplementation "org.powermock:powermock-module-junit4:$powermockVersion"
|
|
testImplementation "org.powermock:powermock-api-mockito2:$powermockVersion"
|
|
testImplementation 'org.json:json:20220320'
|
|
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
|
testImplementation 'androidx.arch.core:core-testing:2.1.0'
|
|
testImplementation "io.mockk:mockk:$mockkVersion"
|
|
testImplementation "io.mockk:mockk-android:$mockkVersion"
|
|
|
|
// dependencies for instrumented tests
|
|
// JUnit4 Rules
|
|
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
|
androidTestImplementation "androidx.test:rules:$androidxTestVersion"
|
|
// Android JUnit Runner
|
|
androidTestImplementation "androidx.test:runner:$androidxTestVersion"
|
|
androidTestUtil "androidx.test:orchestrator:$androidxTestVersion"
|
|
|
|
// Espresso
|
|
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
|
|
androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion"
|
|
androidTestImplementation "androidx.test.espresso:espresso-web:$espressoVersion"
|
|
androidTestImplementation "androidx.test.espresso:espresso-accessibility:$espressoVersion"
|
|
androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion"
|
|
|
|
// Mocking support
|
|
androidTestImplementation 'com.github.tmurakami:dexopener:2.0.5' // required to allow mocking on API 27 and older
|
|
androidTestImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
|
|
androidTestImplementation "org.mockito:mockito-core:$mockitoVersion"
|
|
androidTestImplementation("org.mockito:mockito-android:$mockitoVersion") {
|
|
exclude group: "net.bytebuddy", module: "byte-buddy-android"
|
|
}
|
|
androidTestImplementation "net.bytebuddy:byte-buddy:$byteBuddyVersion"
|
|
androidTestImplementation "net.bytebuddy:byte-buddy-android:$byteBuddyVersion"
|
|
androidTestImplementation "io.mockk:mockk-android:$mockkVersion"
|
|
androidTestImplementation 'androidx.arch.core:core-testing:2.0.1'
|
|
androidTestImplementation "com.facebook.testing.screenshot:core:0.15.0"
|
|
|
|
// UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests
|
|
// androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
|
|
// fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details
|
|
//androidTestImplementation "com.android.support:support-annotations:${supportLibraryVersion}"
|
|
androidTestImplementation 'tools.fastlane:screengrab:2.1.1'
|
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
|
|
implementation "com.github.stateless4j:stateless4j:2.6.0"
|
|
|
|
// upon each update first test: new registration, receive push
|
|
gplayImplementation "com.google.firebase:firebase-messaging:23.0.3"
|
|
}
|
|
|
|
configurations.all {
|
|
resolutionStrategy{
|
|
cacheChangingModulesFor 0, 'seconds'
|
|
force 'org.objenesis:objenesis:2.6'
|
|
eachDependency { details ->
|
|
if ('org.jacoco' == details.requested.group) {
|
|
details.useVersion "$jacoco_version"
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
tasks.withType(Test) {
|
|
// increased logging for tests
|
|
testLogging {
|
|
events "passed", "skipped", "failed"
|
|
}
|
|
}
|
|
|
|
android.applicationVariants.all { variant ->
|
|
variant.outputs.all { output ->
|
|
outputFileName = "${output.baseName}-${variant.versionCode}.apk"
|
|
}
|
|
}
|
|
|
|
task installGitHooks(type: Copy, group: "development") {
|
|
description = "Install git hooks"
|
|
from("${project.rootDir}/scripts/hooks") {
|
|
include '*'
|
|
}
|
|
into "${project.rootDir}/.git/hooks"
|
|
}
|
|
|
|
detekt {
|
|
reports {
|
|
xml {
|
|
enabled = false
|
|
}
|
|
}
|
|
config = files("detekt.yml")
|
|
}
|
|
|
|
shot {
|
|
showOnlyFailingTestsInReports = ciBuild
|
|
// CI environment renders some shadows slightly different from local VMs
|
|
// Add a 0.5% tolerance to account for that
|
|
tolerance = ciBuild ? 0.5: 0
|
|
}
|
|
|
|
jacoco {
|
|
toolVersion = "$jacoco_version"
|
|
}
|
|
|
|
spotbugs {
|
|
ignoreFailures = true // should continue checking
|
|
effort = "max"
|
|
reportLevel = "medium"
|
|
}
|
|
|
|
tasks.withType(SpotBugsTask){task ->
|
|
String variantNameCap = task.name.replace("spotbugs", "")
|
|
String variantName = variantNameCap.substring(0, 1).toLowerCase() + variantNameCap.substring(1)
|
|
|
|
dependsOn "compile${variantNameCap}Sources"
|
|
|
|
excludeFilter = file("${project.rootDir}/spotbugs-filter.xml")
|
|
classes = fileTree("$project.buildDir/intermediates/javac/${variantName}/classes/")
|
|
reports {
|
|
xml {
|
|
required = true
|
|
}
|
|
html {
|
|
required = true
|
|
outputLocation = file("$project.buildDir/reports/spotbugs/spotbugs.html")
|
|
stylesheet = 'fancy.xsl'
|
|
}
|
|
}
|
|
}
|