Revamp build configuration (#1156)

* release: move scripts to scripts directory

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>

* Move CI secrets to secrets directory

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>

* gradle: uprev to 6.7

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>

* gradle: suppress warnings about unsupported options

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>

* build: update dependencies

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>

* build: move Gradle plugins to ext

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>

* build: move configuration tasks to buildSrc

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>

* CHANGELOG: add entry for #1137

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>

* Fix lint warnings

Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
Harsh Shandilya 2020-10-16 20:48:11 +05:30 committed by GitHub
parent 92f1aab25d
commit 6c1e41ba10
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 222 additions and 97 deletions

View file

@ -13,7 +13,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Decrypt secrets - name: Decrypt secrets
run: release/signing-setup.sh "$ENCRYPT_KEY" run: scripts/signing-setup.sh "$ENCRYPT_KEY"
env: env:
ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }} ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }}
@ -28,10 +28,10 @@ jobs:
arguments: :app:assembleFreeRelease :app:assembleNonFreeRelease arguments: :app:assembleFreeRelease :app:assembleNonFreeRelease
- name: Clean secrets - name: Clean secrets
run: release/signing-cleanup.sh run: scripts/signing-cleanup.sh
- name: Deploy snapshot - name: Deploy snapshot
run: release/deploy-snapshot.sh run: scripts/deploy-snapshot.sh
env: env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }} ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
SSH_USERNAME: ${{ secrets.SSH_USERNAME }} SSH_USERNAME: ${{ secrets.SSH_USERNAME }}

View file

@ -13,7 +13,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Decrypt secrets - name: Decrypt secrets
run: release/signing-setup.sh "$ENCRYPT_KEY" run: scripts/signing-setup.sh "$ENCRYPT_KEY"
env: env:
ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }} ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }}
@ -45,7 +45,7 @@ jobs:
- name: Clean secrets - name: Clean secrets
if: always() if: always()
run: release/signing-cleanup.sh run: scripts/signing-cleanup.sh
create_github_release: create_github_release:
name: Create GitHub Release name: Create GitHub Release

3
.gitignore vendored
View file

@ -1,4 +1,3 @@
# Created by https://www.gitignore.io/api/androidstudio,gradle # Created by https://www.gitignore.io/api/androidstudio,gradle
# Edit at https://www.gitignore.io/?templates=androidstudio,gradle # Edit at https://www.gitignore.io/?templates=androidstudio,gradle
@ -44,7 +43,7 @@ out/
# Signing files # Signing files
.signing/ .signing/
keystore.* /keystore.*
# Local configuration file (sdk path, etc) # Local configuration file (sdk path, etc)
local.properties local.properties

View file

@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file.
- Add GPG key selection step to onboarding flow - Add GPG key selection step to onboarding flow
- Allow configuring an app-wide HTTP(S) proxy - Allow configuring an app-wide HTTP(S) proxy
- Add option to automatically sync repository on app launch
## [1.12.1] - 2020-10-13 ## [1.12.1] - 2020-10-13

View file

@ -6,7 +6,9 @@ import com.android.build.gradle.internal.api.BaseVariantOutputImpl
import java.util.Properties import java.util.Properties
plugins { plugins {
id("com.android.application")
kotlin("android") kotlin("android")
`aps-plugin`
} }
val keystorePropertiesFile = rootProject.file("keystore.properties") val keystorePropertiesFile = rootProject.file("keystore.properties")
@ -26,13 +28,16 @@ android {
adbOptions.installOptions("--user 0") adbOptions.installOptions("--user 0")
buildFeatures.viewBinding = true buildFeatures {
buildFeatures.buildConfig = true viewBinding = true
buildConfig = true
}
defaultConfig { defaultConfig {
applicationId = "dev.msfjarvis.aps" applicationId = "dev.msfjarvis.aps"
versionCode = 11211 versionCode = 11211
versionName = "1.13.0-SNAPSHOT" versionName = "1.13.0-SNAPSHOT"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
lintOptions { lintOptions {
@ -41,13 +46,6 @@ android {
disable("MissingTranslation", "PluralsCandidate", "ImpliedQuantity") disable("MissingTranslation", "PluralsCandidate", "ImpliedQuantity")
} }
packagingOptions {
exclude("**/*.version")
exclude("**/*.txt")
exclude("**/*.kotlin_module")
exclude("**/plugin.properties")
}
buildTypes { buildTypes {
named("release") { named("release") {
isMinifyEnabled = true isMinifyEnabled = true

View file

@ -4,6 +4,7 @@
--> -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -22,7 +23,7 @@
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:maxWidth="20dp" android:maxWidth="20dp"
android:maxHeight="20dp" android:maxHeight="20dp"
android:tint="@color/secondary_color" app:tint="@color/secondary_color"
tools:src="@mipmap/ic_launcher" /> tools:src="@mipmap/ic_launcher" />
<LinearLayout <LinearLayout

View file

@ -19,12 +19,12 @@
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:alpha="0.5" android:alpha="0.5"
android:src="@drawable/ic_person_black_24dp" android:src="@drawable/ic_person_black_24dp"
android:tint="?colorOnPrimary"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/title" app:layout_constraintEnd_toStartOf="@id/title"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent"
app:tint="?colorOnPrimary" />
<TextView <TextView
android:id="@+id/title" android:id="@+id/title"

View file

@ -1,6 +1,8 @@
plugins { plugins {
kotlin("android") id("com.android.library")
id("maven-publish") id("maven-publish")
kotlin("android")
`aps-plugin`
} }
// Type safety can sometimes suck // Type safety can sometimes suck

View file

@ -2,11 +2,9 @@
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved. * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only * SPDX-License-Identifier: GPL-3.0-only
*/ */
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import com.android.build.gradle.BaseExtension
import kotlinx.validation.ApiValidationExtension
buildscript { buildscript {
apply(from = "buildSrc/buildDependencies.gradle")
val build: Map<Any, Any> by extra
repositories { repositories {
google() google()
jcenter() jcenter()
@ -14,64 +12,14 @@ buildscript {
maven { url = uri("https://kotlin.bintray.com/kotlinx") } maven { url = uri("https://kotlin.bintray.com/kotlinx") }
} }
dependencies { dependencies {
classpath(Plugins.agp) classpath(build.getValue("androidGradlePlugin"))
classpath(Plugins.binaryCompatibilityValidator) classpath(build.getValue("binaryCompatibilityValidator"))
classpath(Plugins.kotlin) classpath(build.getValue("kotlinGradlePlugin"))
} }
} }
plugins { plugins {
id("com.github.ben-manes.versions") version "0.33.0" id("com.github.ben-manes.versions") version "0.33.0"
} `binary-compatibility-validator`
`aps-plugin`
apply(plugin = "binary-compatibility-validator")
extensions.configure<ApiValidationExtension> {
ignoredProjects = mutableSetOf(
"app"
)
}
subprojects {
repositories {
google()
jcenter()
maven {
setUrl("https://jitpack.io")
}
}
if (name == "app") {
apply(plugin = "com.android.application")
} else {
apply(plugin = "com.android.library")
}
configure<BaseExtension> {
compileSdkVersion(29)
defaultConfig {
minSdkVersion(23)
targetSdkVersion(29)
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType<JavaCompile> {
options.compilerArgs.add("-Xlint:unchecked")
options.isDeprecation = true
}
}
tasks.withType<KotlinCompile> {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = listOf("-Xopt-in=kotlin.RequiresOptIn", "-Xallow-result-return-type")
languageVersion = "1.4"
}
}
}
tasks.wrapper {
gradleVersion = "6.6.1"
distributionType = Wrapper.DistributionType.ALL
distributionSha256Sum = "11657af6356b7587bfb37287b5992e94a9686d5c8a0a1b60b87b9928a2decde5"
} }

View file

@ -1,11 +1,30 @@
apply(from = "buildDependencies.gradle")
val build: Map<Any, Any> by extra
plugins { plugins {
`kotlin-dsl` `kotlin-dsl`
} }
repositories { repositories {
jcenter() google()
gradlePluginPortal()
} }
kotlinDslPluginOptions { kotlinDslPluginOptions {
experimentalWarning.set(false) experimentalWarning.set(false)
} }
gradlePlugin {
plugins {
register("aps") {
id = "aps-plugin"
implementationClass = "PasswordStorePlugin"
}
}
}
dependencies {
implementation(build.getValue("kotlinGradlePlugin"))
implementation(build.getValue("androidGradlePlugin"))
implementation(build.getValue("binaryCompatibilityValidator"))
}

View file

@ -0,0 +1,11 @@
rootProject.ext.versions = [
agp : '4.1.0',
kotlin : '1.4.10',
binary_compatibility_validator : '0.2.3',
]
rootProject.ext.build = [
androidGradlePlugin : "com.android.tools.build:gradle:${versions.agp}",
kotlinGradlePlugin : "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}",
binaryCompatibilityValidator : "org.jetbrains.kotlinx:binary-compatibility-validator:${versions.binary_compatibility_validator}",
]

View file

@ -0,0 +1,83 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
import com.android.build.gradle.TestedExtension
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.api.tasks.Delete
import org.gradle.api.tasks.testing.Test
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.gradle.api.tasks.wrapper.Wrapper
import org.gradle.kotlin.dsl.repositories
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
/**
* Configure root project.
* Note that classpath dependencies still need to be defined in the `buildscript` block in the top-level build.gradle.kts file.
*/
internal fun Project.configureForRootProject() {
// register task for cleaning the build directory in the root project
tasks.register("clean", Delete::class.java) {
delete(rootProject.buildDir)
}
tasks.withType<Wrapper> {
gradleVersion = "6.7"
distributionType = Wrapper.DistributionType.ALL
distributionSha256Sum = "0080de8491f0918e4f529a6db6820fa0b9e818ee2386117f4394f95feb1d5583"
}
configureBinaryCompatibilityValidator()
}
/**
* Configure all projects including the root project
*/
internal fun Project.configureForAllProjects() {
repositories {
google()
jcenter()
maven { setUrl("https://jitpack.io") }
}
tasks.withType<KotlinCompile> {
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
freeCompilerArgs = freeCompilerArgs + additionalCompilerArgs
languageVersion = "1.4"
}
}
tasks.withType<Test> {
maxParallelForks = Runtime.getRuntime().availableProcessors() * 2
testLogging {
events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
}
}
}
/**
* Apply baseline configurations for all Android projects (Application and Library).
*/
@Suppress("UnstableApiUsage")
internal fun TestedExtension.configureCommonAndroidOptions() {
compileSdkVersion(29)
defaultConfig {
minSdkVersion(23)
targetSdkVersion(29)
}
packagingOptions {
exclude("**/*.version")
exclude("**/*.txt")
exclude("**/*.kotlin_module")
exclude("**/plugin.properties")
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
testOptions.animationsDisabled = true
}

View file

@ -0,0 +1,16 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
import kotlinx.validation.ApiValidationExtension
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
internal fun Project.configureBinaryCompatibilityValidator() {
extensions.configure<ApiValidationExtension> {
ignoredProjects = mutableSetOf(
"app"
)
}
}

View file

@ -5,13 +5,6 @@
private const val KOTLIN_VERSION = "1.4.10" private const val KOTLIN_VERSION = "1.4.10"
object Plugins {
const val agp = "com.android.tools.build:gradle:4.0.2"
const val binaryCompatibilityValidator = "org.jetbrains.kotlinx:binary-compatibility-validator:0.2.3"
const val kotlin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION"
}
object Dependencies { object Dependencies {
object Kotlin { object Kotlin {
object Coroutines { object Coroutines {
@ -28,7 +21,7 @@ object Dependencies {
const val activity_ktx = "androidx.activity:activity-ktx:1.2.0-beta01" const val activity_ktx = "androidx.activity:activity-ktx:1.2.0-beta01"
const val annotation = "androidx.annotation:annotation:1.1.0" const val annotation = "androidx.annotation:annotation:1.1.0"
const val autofill = "androidx.autofill:autofill:1.1.0-alpha02" const val autofill = "androidx.autofill:autofill:1.1.0-beta01"
const val appcompat = "androidx.appcompat:appcompat:1.3.0-alpha02" const val appcompat = "androidx.appcompat:appcompat:1.3.0-alpha02"
const val biometric = "androidx.biometric:biometric:1.1.0-beta01" const val biometric = "androidx.biometric:biometric:1.1.0-beta01"
const val constraint_layout = "androidx.constraintlayout:constraintlayout:2.0.2" const val constraint_layout = "androidx.constraintlayout:constraintlayout:2.0.2"
@ -38,7 +31,7 @@ object Dependencies {
const val lifecycle_common = "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion" const val lifecycle_common = "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion"
const val lifecycle_livedata_ktx = "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion" const val lifecycle_livedata_ktx = "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion"
const val lifecycle_viewmodel_ktx = "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" const val lifecycle_viewmodel_ktx = "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
const val material = "com.google.android.material:material:1.3.0-alpha02" const val material = "com.google.android.material:material:1.3.0-alpha03"
const val preference = "androidx.preference:preference:1.1.1" const val preference = "androidx.preference:preference:1.1.1"
const val recycler_view = "androidx.recyclerview:recyclerview:1.2.0-alpha06" const val recycler_view = "androidx.recyclerview:recyclerview:1.2.0-alpha06"
const val recycler_view_selection = "androidx.recyclerview:recyclerview-selection:1.1.0-rc03" const val recycler_view_selection = "androidx.recyclerview:recyclerview-selection:1.1.0-rc03"
@ -72,12 +65,12 @@ object Dependencies {
object NonFree { object NonFree {
const val google_play_auth_api_phone = "com.google.android.gms:play-services-auth-api-phone:17.4.0" const val google_play_auth_api_phone = "com.google.android.gms:play-services-auth-api-phone:17.5.0"
} }
object Testing { object Testing {
const val junit = "junit:junit:4.13" const val junit = "junit:junit:4.13.1"
const val kotlin_test_junit = "org.jetbrains.kotlin:kotlin-test-junit:$KOTLIN_VERSION" const val kotlin_test_junit = "org.jetbrains.kotlin:kotlin-test-junit:$KOTLIN_VERSION"
object AndroidX { object AndroidX {

View file

@ -0,0 +1,8 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
internal val additionalCompilerArgs = listOf(
"-Xopt-in=kotlin.RequiresOptIn"
)

View file

@ -0,0 +1,44 @@
/*
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
import com.android.build.gradle.TestedExtension
import com.android.build.gradle.internal.plugins.AppPlugin
import com.android.build.gradle.internal.plugins.LibraryPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.JavaLibraryPlugin
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.kotlin.dsl.getByType
import org.gradle.kotlin.dsl.withType
class PasswordStorePlugin : Plugin<Project> {
override fun apply(project: Project) {
project.configureForAllProjects()
if (project.isRoot) {
project.configureForRootProject()
}
project.plugins.all {
when (this) {
is JavaPlugin,
is JavaLibraryPlugin -> {
project.tasks.withType<JavaCompile> {
options.compilerArgs.add("-Xlint:unchecked")
options.isDeprecation = true
}
}
is LibraryPlugin,
is AppPlugin -> {
project.extensions.getByType<TestedExtension>().configureCommonAndroidOptions()
}
}
}
}
}
private val Project.isRoot get() = this == this.rootProject

View file

@ -8,7 +8,6 @@ org.gradle.caching=true
# Enabling filesystem watching # Enabling filesystem watching
org.gradle.vfs.watch=true org.gradle.vfs.watch=true
org.gradle.unsafe.watch-fs=true
# Enable Kotlin incremental compilation # Enable Kotlin incremental compilation
kotlin.incremental=true kotlin.incremental=true
@ -49,3 +48,6 @@ android.defaults.buildfeatures.aidl=false
android.defaults.buildfeatures.renderscript=false android.defaults.buildfeatures.renderscript=false
android.defaults.buildfeatures.resvalues=false android.defaults.buildfeatures.resvalues=false
android.defaults.buildfeatures.shaders=false android.defaults.buildfeatures.shaders=false
# Disable warnings about unsupported features, we know what we're doing
android.suppressUnsupportedOptionWarnings=android.enableR8.fullMode,android.enableResourceOptimizations,android.nonTransitiveRClass,android.suppressUnsupportedOptionWarnings

View file

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionSha256Sum=11657af6356b7587bfb37287b5992e94a9686d5c8a0a1b60b87b9928a2decde5 distributionSha256Sum=0080de8491f0918e4f529a6db6820fa0b9e818ee2386117f4394f95feb1d5583
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View file

@ -4,8 +4,8 @@ set -e
ENCRYPT_KEY=$1 ENCRYPT_KEY=$1
declare -A SECRETS declare -A SECRETS
SECRETS[release/keystore.cipher]=keystore.jks SECRETS[secrets/keystore.cipher]=keystore.jks
SECRETS[release/props.cipher]=keystore.properties SECRETS[secrets/props.cipher]=keystore.properties
if [[ -n "$ENCRYPT_KEY" ]]; then if [[ -n "$ENCRYPT_KEY" ]]; then
for src in "${!SECRETS[@]}"; do for src in "${!SECRETS[@]}"; do