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
- name: Decrypt secrets
run: release/signing-setup.sh "$ENCRYPT_KEY"
run: scripts/signing-setup.sh "$ENCRYPT_KEY"
env:
ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }}
@ -28,10 +28,10 @@ jobs:
arguments: :app:assembleFreeRelease :app:assembleNonFreeRelease
- name: Clean secrets
run: release/signing-cleanup.sh
run: scripts/signing-cleanup.sh
- name: Deploy snapshot
run: release/deploy-snapshot.sh
run: scripts/deploy-snapshot.sh
env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
SSH_USERNAME: ${{ secrets.SSH_USERNAME }}

View file

@ -13,7 +13,7 @@ jobs:
uses: actions/checkout@v2
- name: Decrypt secrets
run: release/signing-setup.sh "$ENCRYPT_KEY"
run: scripts/signing-setup.sh "$ENCRYPT_KEY"
env:
ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }}
@ -45,7 +45,7 @@ jobs:
- name: Clean secrets
if: always()
run: release/signing-cleanup.sh
run: scripts/signing-cleanup.sh
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
# Edit at https://www.gitignore.io/?templates=androidstudio,gradle
@ -44,7 +43,7 @@ out/
# Signing files
.signing/
keystore.*
/keystore.*
# Local configuration file (sdk path, etc)
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
- Allow configuring an app-wide HTTP(S) proxy
- Add option to automatically sync repository on app launch
## [1.12.1] - 2020-10-13

View file

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

View file

@ -4,6 +4,7 @@
-->
<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"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -22,7 +23,7 @@
android:adjustViewBounds="true"
android:maxWidth="20dp"
android:maxHeight="20dp"
android:tint="@color/secondary_color"
app:tint="@color/secondary_color"
tools:src="@mipmap/ic_launcher" />
<LinearLayout

View file

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

View file

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

View file

@ -2,11 +2,9 @@
* Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
* 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 {
apply(from = "buildSrc/buildDependencies.gradle")
val build: Map<Any, Any> by extra
repositories {
google()
jcenter()
@ -14,64 +12,14 @@ buildscript {
maven { url = uri("https://kotlin.bintray.com/kotlinx") }
}
dependencies {
classpath(Plugins.agp)
classpath(Plugins.binaryCompatibilityValidator)
classpath(Plugins.kotlin)
classpath(build.getValue("androidGradlePlugin"))
classpath(build.getValue("binaryCompatibilityValidator"))
classpath(build.getValue("kotlinGradlePlugin"))
}
}
plugins {
id("com.github.ben-manes.versions") version "0.33.0"
}
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"
`binary-compatibility-validator`
`aps-plugin`
}

View file

@ -1,11 +1,30 @@
apply(from = "buildDependencies.gradle")
val build: Map<Any, Any> by extra
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
google()
gradlePluginPortal()
}
kotlinDslPluginOptions {
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"
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 Kotlin {
object Coroutines {
@ -28,7 +21,7 @@ object Dependencies {
const val activity_ktx = "androidx.activity:activity-ktx:1.2.0-beta01"
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 biometric = "androidx.biometric:biometric:1.1.0-beta01"
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_livedata_ktx = "androidx.lifecycle:lifecycle-livedata-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 recycler_view = "androidx.recyclerview:recyclerview:1.2.0-alpha06"
const val recycler_view_selection = "androidx.recyclerview:recyclerview-selection:1.1.0-rc03"
@ -72,12 +65,12 @@ object Dependencies {
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 {
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"
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
org.gradle.vfs.watch=true
org.gradle.unsafe.watch-fs=true
# Enable Kotlin incremental compilation
kotlin.incremental=true
@ -49,3 +48,6 @@ android.defaults.buildfeatures.aidl=false
android.defaults.buildfeatures.renderscript=false
android.defaults.buildfeatures.resvalues=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
distributionPath=wrapper/dists
distributionSha256Sum=11657af6356b7587bfb37287b5992e94a9686d5c8a0a1b60b87b9928a2decde5
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
distributionSha256Sum=0080de8491f0918e4f529a6db6820fa0b9e818ee2386117f4394f95feb1d5583
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View file

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