apply plugin: 'com.android.application' apply plugin: 'checkstyle' apply plugin: 'pmd' /* gets the version name from the latest Git tag */ def getVersionName = { -> def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'describe', '--tags', '--always' standardOutput = stdout } return stdout.toString().trim() } def isCi = "true" == System.getenv("CI") def preDexEnabled = "true" == System.getProperty("pre-dex", "true") def fullApplicationId = "org.fdroid.fdroid" def basicApplicationId = "org.fdroid.basic" // yes, this actually needs both quotes https://stackoverflow.com/a/41391841 def privilegedExtensionApplicationId = '"org.fdroid.fdroid.privileged"' android { compileSdkVersion 29 defaultConfig { versionCode 1012050 versionName getVersionName() testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' minSdkVersion 22 //noinspection ExpiredTargetSdkVersion targetSdkVersion 25 /* The Android Testing Support Library collects analytics to continuously improve the testing experience. More specifically, it uploads a hash of the package name of the application under test for each invocation. If you do not wish to upload this data, you can opt-out by passing the following argument to the test runner: disableAnalytics "true". */ testInstrumentationRunnerArguments disableAnalytics: 'true' vectorDrawables.useSupportLibrary = true } buildTypes { // use proguard on debug too since we have unknowingly broken // release builds before. all { minifyEnabled true shrinkResources true buildConfigField "String", "PRIVILEGED_EXTENSION_PACKAGE_NAME", privilegedExtensionApplicationId buildConfigField "String", "ACRA_REPORT_EMAIL", '"reports@f-droid.org"' // String needs both quotes proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'src/androidTest/proguard-rules.pro' } debug { applicationIdSuffix ".debug" resValue "string", "applicationId", fullApplicationId + applicationIdSuffix versionNameSuffix "-debug" println 'buildTypes.debug defaultConfig.versionCode ' + defaultConfig.versionCode } } flavorDimensions "base" productFlavors { full { dimension "base" applicationId fullApplicationId resValue "string", "applicationId", fullApplicationId } basic { dimension "base" applicationId basicApplicationId resValue "string", "applicationId", basicApplicationId } } compileOptions { compileOptions.encoding = "UTF-8" sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } aaptOptions { cruncherEnabled = false } dexOptions { // Improve build server performance by allowing disabling of pre-dexing // see http://tools.android.com/tech-docs/new-build-system/tips#TOC-Improving-Build-Server-performance // Skip pre-dexing when running on CI or when disabled via -Dpre-dex=false. preDexLibraries = preDexEnabled && !isCi } testOptions { unitTests { includeAndroidResources = true // prevent tests from dying on android.util.Log calls returnDefaultValues = true all { // All the usual Gradle options. testLogging { events "skipped", "failed", "standardOut", "standardError" showStandardStreams = true } systemProperty 'robolectric.dependency.repo.url', 'https://repo1.maven.org/maven2' // hack to avoid memory leak crashes forkEvery = 1 } } } sourceSets { test { java.srcDirs += "$projectDir/src/testShared/java" } androidTest { java.srcDirs += "$projectDir/src/testShared/java" } } lintOptions { checkReleaseBuilds false abortOnError true htmlReport true xmlReport false textReport false lintConfig file("lint.xml") } packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE' exclude 'META-INF/NOTICE.txt' exclude 'META-INF/INDEX.LIST' exclude '.readme' } } dependencies { implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'androidx.annotation:annotation:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.palette:palette:1.0.0' implementation 'androidx.work:work-runtime:2.4.0' implementation 'com.google.android.material:material:1.1.0' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' implementation 'com.google.zxing:core:3.3.3' implementation 'info.guardianproject.netcipher:netcipher:2.0.0-beta1' implementation 'info.guardianproject.panic:panic:1.0' implementation 'commons-io:commons-io:2.6' implementation 'commons-net:commons-net:3.6' implementation 'ch.acra:acra:4.9.1' implementation 'io.reactivex:rxjava:1.1.0' implementation 'com.hannesdorfmann:adapterdelegates3:3.0.1' implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.5' implementation 'com.fasterxml.jackson.core:jackson-core:2.11.1' implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.1' implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' implementation 'org.bouncycastle:bcprov-jdk15on:1.65' fullImplementation 'org.bouncycastle:bcpkix-jdk15on:1.65' fullImplementation 'cc.mvdan.accesspoint:library:0.2.0' fullImplementation 'org.jmdns:jmdns:3.5.5' fullImplementation 'org.nanohttpd:nanohttpd:2.3.1' testImplementation 'androidx.test:core:1.3.0' testImplementation 'junit:junit:4.13.1' testImplementation 'org.robolectric:robolectric:4.3' testImplementation 'org.mockito:mockito-core:3.3.3' testImplementation 'org.hamcrest:hamcrest:2.2' testImplementation 'org.bouncycastle:bcprov-jdk15on:1.65' androidTestImplementation 'androidx.arch.core:core-testing:2.1.0' androidTestImplementation 'androidx.test:core:1.3.0' androidTestImplementation 'androidx.test:runner:1.3.0' androidTestImplementation 'androidx.test:rules:1.3.0' androidTestImplementation 'androidx.test:monitor:1.3.0' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' androidTestImplementation 'androidx.work:work-testing:2.4.0' } checkstyle { toolVersion = '7.2' } task checkstyle(type: Checkstyle) { configFile file("${project.rootDir}/config/checkstyle/checkstyle.xml") source 'src/main/java', 'src/test/java', 'src/androidTest/java' include '**/*.java' classpath = files() } pmd { toolVersion = '6.20.0' consoleOutput = true } task pmdMain(type: Pmd) { dependsOn 'assembleDebug' ruleSetFiles = files("${project.rootDir}/config/pmd/rules.xml", "${project.rootDir}/config/pmd/rules-main.xml") ruleSets = [] // otherwise defaults clash with the list in rules.xml source 'src/main/java' include '**/*.java' } task pmdTest(type: Pmd) { dependsOn 'assembleDebug' ruleSetFiles = files("${project.rootDir}/config/pmd/rules.xml", "${project.rootDir}/config/pmd/rules-test.xml") ruleSets = [] // otherwise defaults clash with the list in rules.xml source 'src/test/java', 'src/androidTest/java' include '**/*.java' } task pmd(dependsOn: [pmdMain, pmdTest]) {}