From 73719f2f1b6a2c0f6729c279c1e99a45b31ac351 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Wed, 26 Feb 2025 00:17:36 +0600 Subject: [PATCH] Rework build variants and add FOSS variant (mihonapp/mihon#1775) (cherry picked from commit fe22f5aa37d3613d4464e18153f183994fa45b7a) --- .github/workflows/build_benchmark.yml | 10 +- .github/workflows/build_dispatch_preview.yml | 2 +- .github/workflows/build_preview.yml | 20 +- .github/workflows/build_pull_request.yml | 36 +++- .../{build_check.yml => build_push.yml} | 15 +- .github/workflows/build_release.yml | 24 ++- app/build.gradle.kts | 204 ++++++++---------- .../kotlin}/exh/log/CrashlyticsPrinter.kt | 0 .../mihon/core/firebase/FirebaseConfig.kt | 0 .../AndroidManifest.xml | 0 .../kotlin}/exh/log/CrashlyticsPrinter.kt | 0 .../mihon/core/firebase/FirebaseConfig.kt | 0 .../eu/kanade/domain/ui/model/AppTheme.kt | 5 +- .../library/LibrarySettingsDialog.kt | 8 +- .../manga/components/MangaDialogs.kt | 5 +- .../manga/components/MangaToolbar.kt | 4 +- .../more/onboarding/PermissionStep.kt | 3 + .../settings/screen/SettingsAdvancedScreen.kt | 9 +- .../settings/screen/SettingsSecurityScreen.kt | 10 +- .../more/settings/screen/about/AboutScreen.kt | 4 +- app/src/main/java/eu/kanade/tachiyomi/App.kt | 15 +- .../kanade/tachiyomi/di/PreferenceModule.kt | 4 +- .../eu/kanade/tachiyomi/util/CrashLogUtil.kt | 2 +- .../tachiyomi/util/system/BuildConfig.kt | 13 +- .../util/system/ContextExtensions.kt | 2 +- 25 files changed, 206 insertions(+), 189 deletions(-) rename .github/workflows/{build_check.yml => build_push.yml} (86%) rename app/src/{dev/java => analytics-firebase-noop/kotlin}/exh/log/CrashlyticsPrinter.kt (100%) rename app/src/{dev/java => analytics-firebase-noop/kotlin}/mihon/core/firebase/FirebaseConfig.kt (100%) rename app/src/{standard => analytics-firebase}/AndroidManifest.xml (100%) rename app/src/{standard/java => analytics-firebase/kotlin}/exh/log/CrashlyticsPrinter.kt (100%) rename app/src/{standard/java => analytics-firebase/kotlin}/mihon/core/firebase/FirebaseConfig.kt (100%) diff --git a/.github/workflows/build_benchmark.yml b/.github/workflows/build_benchmark.yml index 03077b471..a13926a6e 100644 --- a/.github/workflows/build_benchmark.yml +++ b/.github/workflows/build_benchmark.yml @@ -1,5 +1,5 @@ name: Benchmark Builder -# Manually build a dev benchmark on a tag +# Manually build a benchmark on a tag on: # Dispatch or Manual triggers @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest outputs: VERSION_TAG: ${{ steps.get_tag.outputs.VERSION_TAG }} - ARTIFACTS_PREFIX: dev/benchmark/app-dev + ARTIFACTS_PREFIX: benchmark/app TAG_NAME: benchmark-${{ steps.tag_name.outputs.TAG_NAME }} steps: - name: Get tag name (${{ github.ref }}) @@ -83,15 +83,15 @@ jobs: run: ./gradlew spotlessCheck - name: Build app - run: ./gradlew assembleDevBenchmark -Pandroid.signingConfig=debug + run: ./gradlew assembleBenchmark - name: Run unit tests - run: ./gradlew testReleaseUnitTest testDevBenchmarkUnitTest + run: ./gradlew testReleaseUnitTest - name: Sign APK uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # v1 with: - releaseDirectory: app/build/outputs/apk/dev/benchmark + releaseDirectory: app/build/outputs/apk/benchmark signingKeyBase64: ${{ secrets.SIGNING_KEY }} alias: ${{ secrets.ALIAS }} keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} diff --git a/.github/workflows/build_dispatch_preview.yml b/.github/workflows/build_dispatch_preview.yml index b44fffa83..705a20ed2 100644 --- a/.github/workflows/build_dispatch_preview.yml +++ b/.github/workflows/build_dispatch_preview.yml @@ -1,5 +1,5 @@ name: Remote Dispatch Preview Build -# Manually send a dispatch to build standard preview (master) or dev preview (other refs) +# Manually send a dispatch to build preview on: # Dispatch or Manual triggers diff --git a/.github/workflows/build_preview.yml b/.github/workflows/build_preview.yml index d073498fd..4e9e9420e 100644 --- a/.github/workflows/build_preview.yml +++ b/.github/workflows/build_preview.yml @@ -1,5 +1,5 @@ name: Preview Builder -# Manually build a standard preview on master +# Manually build a preview on master on: # Dispatch or Manual triggers @@ -89,7 +89,7 @@ jobs: set -e tag_prefix=r - artifacts_prefix=standard/preview/app-standard + artifacts_prefix=preview/app build_type_name=Preview echo "TAG_NAME=${tag_prefix}${{ steps.current_commit.outputs.COMMIT_COUNT }}" @@ -152,10 +152,10 @@ jobs: run: ./gradlew spotlessCheck - name: Build app - run: ./gradlew assembleStandardPreview + run: ./gradlew assemblePreview - name: Run unit tests - run: ./gradlew testReleaseUnitTest testStandardPreviewUnitTest + run: ./gradlew testReleaseUnitTest - name: Upload artifacts uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 @@ -181,7 +181,7 @@ jobs: - name: Sign APK uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # v1 with: - releaseDirectory: app/build/outputs/apk/standard/preview + releaseDirectory: app/build/outputs/apk/preview signingKeyBase64: ${{ secrets.SIGNING_KEY }} alias: ${{ secrets.ALIAS }} keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} @@ -192,23 +192,23 @@ jobs: run: | set -e - mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-universal-preview-unsigned-signed.apk Komikku-${{ needs.prepare-build.outputs.TAG_NAME }}.apk + mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-universal-preview-signed.apk Komikku-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_UNIVERSAL_SHA=$sha" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-arm64-v8a-preview-unsigned-signed.apk Komikku-arm64-v8a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk + mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-arm64-v8a-preview-signed.apk Komikku-arm64-v8a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-arm64-v8a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_ARM64_V8A_SHA=$sha" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-armeabi-v7a-preview-unsigned-signed.apk Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk + mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-armeabi-v7a-preview-signed.apk Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_ARMEABI_V7A_SHA=$sha" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-x86-preview-unsigned-signed.apk Komikku-x86-${{ needs.prepare-build.outputs.TAG_NAME }}.apk + mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-x86-preview-signed.apk Komikku-x86-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-x86-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_X86_SHA=$sha" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-x86_64-preview-unsigned-signed.apk Komikku-x86_64-${{ needs.prepare-build.outputs.TAG_NAME }}.apk + mv app/build/outputs/apk/${{ needs.prepare-build.outputs.ARTIFACTS_PREFIX }}-x86_64-preview-signed.apk Komikku-x86_64-${{ needs.prepare-build.outputs.TAG_NAME }}.apk sha=`sha256sum Komikku-x86_64-${{ needs.prepare-build.outputs.TAG_NAME }}.apk | awk '{ print $1 }'` echo "APK_X86_64_SHA=$sha" >> $GITHUB_OUTPUT diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index 984308223..d658dc088 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -50,6 +50,20 @@ jobs: java-version: 17 distribution: temurin + - name: Write google-services.json + uses: DamianReeves/write-file-action@6929a9a6d1807689191dcc8bbe62b54d70a32b42 # v1.3 + with: + path: app/google-services.json + contents: ${{ secrets.GOOGLE_SERVICES_JSON }} + write-mode: overwrite + + - name: Write client_secrets.json + uses: DamianReeves/write-file-action@6929a9a6d1807689191dcc8bbe62b54d70a32b42 # v1.3 + with: + path: app/src/main/assets/client_secrets.json + contents: ${{ secrets.GOOGLE_CLIENT_SECRETS_JSON }} + write-mode: overwrite + - name: Set up gradle uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4 @@ -57,10 +71,19 @@ jobs: run: ./gradlew spotlessCheck - name: Build app - run: ./gradlew assembleDevRelease + run: ./gradlew assembleRelease - name: Run unit tests - run: ./gradlew testReleaseUnitTest testDevReleaseUnitTest + run: ./gradlew testReleaseUnitTest + + - name: Sign APK + uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # v1 + with: + releaseDirectory: app/build/outputs/apk/release + signingKeyBase64: ${{ secrets.SIGNING_KEY }} + alias: ${{ secrets.ALIAS }} + keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} + keyPassword: ${{ secrets.KEY_PASSWORD }} - name: Rename apk id: current_commit @@ -73,11 +96,16 @@ jobs: echo "VERSION_TAG=$version_tag" >> $GITHUB_OUTPUT echo "COMMIT_COUNT=$commit_count" echo "COMMIT_COUNT=$commit_count" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/dev/release/app-dev-universal-release-unsigned.apk Komikku-$version_tag-r$commit_count.apk + mv app/build/outputs/apk/release/app-universal-release-unsigned-signed.apk Komikku-$version_tag-r$commit_count.apk - name: Upload APK uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: Komikku-${{ steps.current_commit.outputs.VERSION_TAG }}-r${{ steps.current_commit.outputs.COMMIT_COUNT }}.apk path: ./*.apk - retention-days: 1 + + - name: Upload mapping + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: mapping-${{ github.sha }} + path: app/build/outputs/mapping/release diff --git a/.github/workflows/build_check.yml b/.github/workflows/build_push.yml similarity index 86% rename from .github/workflows/build_check.yml rename to .github/workflows/build_push.yml index d1c454629..a838e5fdb 100644 --- a/.github/workflows/build_check.yml +++ b/.github/workflows/build_push.yml @@ -69,15 +69,15 @@ jobs: run: ./gradlew spotlessCheck - name: Build app - run: ./gradlew assembleStandardRelease + run: ./gradlew assembleRelease -Pwith-analytics -Pwith-updater - name: Run unit tests - run: ./gradlew testReleaseUnitTest testStandardReleaseUnitTest + run: ./gradlew testReleaseUnitTest - name: Sign APK uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # v1 with: - releaseDirectory: app/build/outputs/apk/standard/release + releaseDirectory: app/build/outputs/apk/release signingKeyBase64: ${{ secrets.SIGNING_KEY }} alias: ${{ secrets.ALIAS }} keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} @@ -93,11 +93,16 @@ jobs: echo "VERSION_TAG=$version_tag" >> $GITHUB_OUTPUT echo "COMMIT_COUNT=$commit_count" echo "COMMIT_COUNT=$commit_count" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/standard/release/app-standard-universal-release-unsigned-signed.apk Komikku-$version_tag-r$commit_count.apk + mv app/build/outputs/apk/release/app-universal-release-unsigned-signed.apk Komikku-$version_tag-r$commit_count.apk - name: Upload APK uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: Komikku-${{ steps.current_commit.outputs.VERSION_TAG }}-r${{ steps.current_commit.outputs.COMMIT_COUNT }}.apk path: ./*.apk - retention-days: 1 + + - name: Upload mapping + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: mapping-${{ github.sha }} + path: app/build/outputs/mapping/release diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml index aaf804f0e..f14acad21 100644 --- a/.github/workflows/build_release.yml +++ b/.github/workflows/build_release.yml @@ -125,10 +125,10 @@ jobs: run: ./gradlew spotlessCheck - name: Build app - run: ./gradlew assembleStandardRelease + run: ./gradlew assembleRelease -Pwith-analytics -Pwith-updater - name: Run unit tests - run: ./gradlew testReleaseUnitTest testStandardReleaseUnitTest + run: ./gradlew testReleaseUnitTest - name: Upload artifacts uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 @@ -136,6 +136,12 @@ jobs: path: "**/*.apk" retention-days: 1 + - name: Upload mapping + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: mapping-${{ github.sha }} + path: app/build/outputs/mapping/release + release-app: runs-on: ubuntu-latest needs: @@ -154,7 +160,7 @@ jobs: - name: Sign APK uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # v1 with: - releaseDirectory: app/build/outputs/apk/standard/release + releaseDirectory: app/build/outputs/apk/release signingKeyBase64: ${{ secrets.SIGNING_KEY }} alias: ${{ secrets.ALIAS }} keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} @@ -165,23 +171,23 @@ jobs: run: | set -e - mv app/build/outputs/apk/standard/release/app-standard-universal-release-unsigned-signed.apk Komikku-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk + mv app/build/outputs/apk/release/app-universal-release-unsigned-signed.apk Komikku-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk sha=`sha256sum Komikku-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_UNIVERSAL_SHA=$sha" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/standard/release/app-standard-arm64-v8a-release-unsigned-signed.apk Komikku-arm64-v8a-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk + mv app/build/outputs/apk/release/app-arm64-v8a-release-unsigned-signed.apk Komikku-arm64-v8a-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk sha=`sha256sum Komikku-arm64-v8a-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_ARM64_V8A_SHA=$sha" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/standard/release/app-standard-armeabi-v7a-release-unsigned-signed.apk Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk + mv app/build/outputs/apk/release/app-armeabi-v7a-release-unsigned-signed.apk Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk sha=`sha256sum Komikku-armeabi-v7a-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_ARMEABI_V7A_SHA=$sha" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/standard/release/app-standard-x86-release-unsigned-signed.apk Komikku-x86-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk + mv app/build/outputs/apk/release/app-x86-release-unsigned-signed.apk Komikku-x86-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk sha=`sha256sum Komikku-x86-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_X86_SHA=$sha" >> $GITHUB_OUTPUT - mv app/build/outputs/apk/standard/release/app-standard-x86_64-release-unsigned-signed.apk Komikku-x86_64-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk + mv app/build/outputs/apk/release/app-x86_64-release-unsigned-signed.apk Komikku-x86_64-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk sha=`sha256sum Komikku-x86_64-${{ needs.prepare-build.outputs.VERSION_TAG }}.apk | awk '{ print $1 }'` echo "APK_X86_64_SHA=$sha" >> $GITHUB_OUTPUT @@ -201,7 +207,7 @@ jobs: ${{ needs.prepare-build.outputs.COMMIT_LOGS }} ##### Based on - + **Full Changelog**: [komikku-app/komikku@${{ needs.prepare-build.outputs.PREV_TAG_NAME }}...${{ needs.prepare-build.outputs.VERSION_TAG }}](https://github.com/komikku-app/komikku/compare/${{ needs.prepare-build.outputs.PREV_TAG_NAME }}...${{ needs.prepare-build.outputs.VERSION_TAG }}) --- diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 12250b93a..da682f64f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,10 +1,6 @@ -@file:Suppress("ChromeOsAbiSupport") - import mihon.buildlogic.getBuildTime import mihon.buildlogic.getCommitCount import mihon.buildlogic.getGitSha -import java.io.FileInputStream -import java.util.Properties plugins { id("mihon.android.application") @@ -15,15 +11,16 @@ plugins { id("com.github.ben-manes.versions") } -if (gradle.startParameter.taskRequests.toString().contains("Standard")) { +val includeAnalytics = project.hasProperty("with-analytics") +val includeUpdater = project.hasProperty("with-updater") + +if (includeAnalytics) { pluginManager.apply { apply(libs.plugins.google.services.get().pluginId) apply(libs.plugins.firebase.crashlytics.get().pluginId) } } -val supportedAbis = setOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") - android { namespace = "eu.kanade.tachiyomi" @@ -36,110 +33,110 @@ android { buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"") buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"") buildConfigField("String", "BUILD_TIME", "\"${getBuildTime()}\"") - buildConfigField("boolean", "INCLUDE_UPDATER", "false") + buildConfigField("boolean", "INCLUDE_ANALYTICS", "$includeAnalytics") + buildConfigField("boolean", "INCLUDE_UPDATER", "$includeUpdater") buildConfigField("boolean", "PREVIEW", "false") - ndk { - abiFilters += supportedAbis - } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + buildTypes { + val debug by getting { + applicationIdSuffix = ".dev" + versionNameSuffix = "-${getCommitCount()}" + isPseudoLocalesEnabled = true + } + val release by getting { + isMinifyEnabled = true + isShrinkResources = true + + proguardFiles("proguard-android-optimize.txt", "proguard-rules.pro") + } + create("releaseTest") { + initWith(release) + + applicationIdSuffix = ".rt" + isMinifyEnabled = false + isShrinkResources = false + + matchingFallbacks.add(release.name) + } + create("foss") { + initWith(release) + + applicationIdSuffix = ".t-foss" + + matchingFallbacks.add(release.name) + } + create("preview") { + initWith(release) + + applicationIdSuffix = ".beta" + + versionNameSuffix = debug.versionNameSuffix + signingConfig = debug.signingConfig + + matchingFallbacks.add(release.name) + + buildConfigField("boolean", "PREVIEW", "true") + } + create("benchmark") { + initWith(release) + + isDebuggable = false + isProfileable = true + versionNameSuffix = "${debug.versionNameSuffix}-benchmark" + applicationIdSuffix = ".benchmark" + + signingConfig = debug.signingConfig + + matchingFallbacks.add(release.name) + } + } + + sourceSets { + val analyticsDir = if (includeAnalytics) "analytics-firebase" else "analytics-firebase-noop" + getByName("main").kotlin.srcDirs("src/$analyticsDir/kotlin") + getByName("preview").res.srcDirs("src/beta/res") + getByName("benchmark").res.srcDirs("src/debug/res") + } + splits { abi { isEnable = true - reset() - include(*supportedAbis.toTypedArray()) isUniversalApk = true - } - } - - signingConfigs { - create("preview") { - storeFile = rootProject.file(readPropertyFromLocalProperties("keystore") ?: "keystore.jks") - storePassword = readPropertyFromLocalProperties("storePassword") - keyAlias = readPropertyFromLocalProperties("keyAlias") - keyPassword = readPropertyFromLocalProperties("keyPassword") - } - } - - buildTypes { - named("debug") { - versionNameSuffix = "-${getCommitCount()}" - applicationIdSuffix = ".debug" - isPseudoLocalesEnabled = true - } - create("releaseTest") { - applicationIdSuffix = ".rt" - // isMinifyEnabled = true - // isShrinkResources = true - setProguardFiles(listOf(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")) - matchingFallbacks.add("release") - } - named("release") { - isShrinkResources = true - isMinifyEnabled = true - setProguardFiles(listOf(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")) - } - create("preview") { - initWith(getByName("release")) - buildConfigField("boolean", "PREVIEW", "true") - - matchingFallbacks.add("release") - versionNameSuffix = "-${getCommitCount()}" - applicationIdSuffix = ".beta" - } - // Profilers build, overwrite dev's signing configuration by 'debug' key then re-sign with GitHub's workflow - create("benchmark") { - initWith(getByName("release")) - - signingConfig = signingConfigs.getByName("debug") - matchingFallbacks.add("release") - isDebuggable = false - isProfileable = true - versionNameSuffix = "-${getCommitCount()}-benchmark" - applicationIdSuffix = ".benchmark" - } - } - - sourceSets { - getByName("preview").res.srcDirs("src/beta/res") - getByName("benchmark").res.srcDirs("src/debug/res") - } - - flavorDimensions.add("default") - - productFlavors { - // Include Google service & build unsigned, for GitHub workflow build - create("standard") { - buildConfigField("boolean", "INCLUDE_UPDATER", "true") - dimension = "default" - } - create("fdroid") { - dimension = "default" - } - // Signed, dev build with Android Studio if it's not a debug build - create("dev") { - dimension = "default" + reset() + include("armeabi-v7a", "arm64-v8a", "x86", "x86_64") } } packaging { - resources.excludes.addAll( - listOf( + jniLibs { + keepDebugSymbols += listOf( + "libandroidx.graphics.path", + "libarchive-jni", + "libconscrypt_jni", + "libimagedecoder", + "libquickjs", + "libsqlite3x", + ) + .map { "**/$it.so" } + } + resources { + excludes += setOf( "kotlin-tooling-metadata.json", - "META-INF/DEPENDENCIES", "LICENSE.txt", - "META-INF/LICENSE", + "META-INF/**/*.properties", "META-INF/**/LICENSE.txt", "META-INF/*.properties", - "META-INF/**/*.properties", - "META-INF/README.md", - "META-INF/NOTICE", - "META-INF/INDEX.LIST", "META-INF/*.version", - ), - ) + "META-INF/INDEX.LIST", + "META-INF/DEPENDENCIES", + "META-INF/LICENSE", + "META-INF/NOTICE", + "META-INF/README.md", + ) + } } dependenciesInfo { @@ -303,9 +300,11 @@ dependencies { implementation(libs.logcat) // Crash reports/analytics - "standardImplementation"(platform(libs.firebase.bom)) - "standardImplementation"(libs.firebase.analytics) - "standardImplementation"(libs.firebase.crashlytics) + if (includeAnalytics) { + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.analytics) + implementation(libs.firebase.crashlytics) + } // Shizuku implementation(libs.bundles.shizuku) @@ -355,16 +354,3 @@ buildscript { classpath(kotlinx.gradle) } } - -// Config local store's signing key -fun readPropertyFromLocalProperties(propertyName: String): String? { - val localPropertiesFile = rootProject.file("local.properties") - if (localPropertiesFile.exists()) { - val properties = Properties() - FileInputStream(localPropertiesFile).use { inputStream -> - properties.load(inputStream) - } - return properties.getProperty(propertyName) - } - return null // Property not found -} diff --git a/app/src/dev/java/exh/log/CrashlyticsPrinter.kt b/app/src/analytics-firebase-noop/kotlin/exh/log/CrashlyticsPrinter.kt similarity index 100% rename from app/src/dev/java/exh/log/CrashlyticsPrinter.kt rename to app/src/analytics-firebase-noop/kotlin/exh/log/CrashlyticsPrinter.kt diff --git a/app/src/dev/java/mihon/core/firebase/FirebaseConfig.kt b/app/src/analytics-firebase-noop/kotlin/mihon/core/firebase/FirebaseConfig.kt similarity index 100% rename from app/src/dev/java/mihon/core/firebase/FirebaseConfig.kt rename to app/src/analytics-firebase-noop/kotlin/mihon/core/firebase/FirebaseConfig.kt diff --git a/app/src/standard/AndroidManifest.xml b/app/src/analytics-firebase/AndroidManifest.xml similarity index 100% rename from app/src/standard/AndroidManifest.xml rename to app/src/analytics-firebase/AndroidManifest.xml diff --git a/app/src/standard/java/exh/log/CrashlyticsPrinter.kt b/app/src/analytics-firebase/kotlin/exh/log/CrashlyticsPrinter.kt similarity index 100% rename from app/src/standard/java/exh/log/CrashlyticsPrinter.kt rename to app/src/analytics-firebase/kotlin/exh/log/CrashlyticsPrinter.kt diff --git a/app/src/standard/java/mihon/core/firebase/FirebaseConfig.kt b/app/src/analytics-firebase/kotlin/mihon/core/firebase/FirebaseConfig.kt similarity index 100% rename from app/src/standard/java/mihon/core/firebase/FirebaseConfig.kt rename to app/src/analytics-firebase/kotlin/mihon/core/firebase/FirebaseConfig.kt diff --git a/app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt b/app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt index d8d382688..8cca4a034 100644 --- a/app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt +++ b/app/src/main/java/eu/kanade/domain/ui/model/AppTheme.kt @@ -1,8 +1,7 @@ package eu.kanade.domain.ui.model import dev.icerock.moko.resources.StringResource -import eu.kanade.tachiyomi.util.system.isDevFlavor -import eu.kanade.tachiyomi.util.system.isPreviewBuildType +import eu.kanade.tachiyomi.util.system.isReleaseBuildType import tachiyomi.i18n.MR import tachiyomi.i18n.kmk.KMR @@ -22,7 +21,7 @@ enum class AppTheme(val titleRes: StringResource?) { MIDNIGHT_DUSK(MR.strings.theme_midnightdusk), // TODO: re-enable for preview - NORD(MR.strings.theme_nord.takeIf { isDevFlavor || isPreviewBuildType }), + NORD(MR.strings.theme_nord.takeUnless { isReleaseBuildType }), STRAWBERRY_DAIQUIRI(MR.strings.theme_strawberrydaiquiri), TAKO(MR.strings.theme_tako), TEALTURQUOISE(MR.strings.theme_tealturquoise), diff --git a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt index 9feb53871..0b80e8257 100644 --- a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt @@ -24,8 +24,7 @@ import eu.kanade.presentation.components.TabbedDialog import eu.kanade.presentation.components.TabbedDialogPaddings import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.library.LibrarySettingsScreenModel -import eu.kanade.tachiyomi.util.system.isDevFlavor -import eu.kanade.tachiyomi.util.system.isPreviewBuildType +import eu.kanade.tachiyomi.util.system.isReleaseBuildType import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.map @@ -141,10 +140,7 @@ private fun ColumnScope.FilterPage( onClick = { screenModel.toggleFilter(LibraryPreferences::filterCompleted) }, ) // TODO: re-enable when custom intervals are ready for stable - if ( - (isDevFlavor || isPreviewBuildType) && - LibraryPreferences.MANGA_OUTSIDE_RELEASE_PERIOD in autoUpdateMangaRestrictions - ) { + if ((!isReleaseBuildType) && LibraryPreferences.MANGA_OUTSIDE_RELEASE_PERIOD in autoUpdateMangaRestrictions) { val filterIntervalCustom by screenModel.libraryPreferences.filterIntervalCustom().collectAsState() TriStateItem( label = stringResource(MR.strings.action_filter_interval_custom), diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt index d6ce7a5a2..3f14a7e7a 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaDialogs.kt @@ -19,8 +19,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp -import eu.kanade.tachiyomi.util.system.isDevFlavor -import eu.kanade.tachiyomi.util.system.isPreviewBuildType +import eu.kanade.tachiyomi.util.system.isReleaseBuildType import kotlinx.collections.immutable.toImmutableList import tachiyomi.domain.manga.interactor.FetchInterval import tachiyomi.i18n.MR @@ -109,7 +108,7 @@ fun SetIntervalDialog( } Spacer(Modifier.height(MaterialTheme.padding.small)) - if (onValueChanged != null && (isDevFlavor || isPreviewBuildType)) { + if (onValueChanged != null && (!isReleaseBuildType)) { Text(stringResource(MR.strings.manga_interval_custom_amount)) BoxWithConstraints( diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt index ef7f49805..73b6209c4 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt @@ -26,7 +26,7 @@ import eu.kanade.presentation.manga.DownloadAction import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen import eu.kanade.tachiyomi.ui.browse.source.feed.SourceFeedScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen -import eu.kanade.tachiyomi.util.system.isDevFlavor +import eu.kanade.tachiyomi.util.system.isDebugBuildType import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR import tachiyomi.i18n.kmk.KMR @@ -226,7 +226,7 @@ fun MangaToolbar( } // SY <-- // KMK --> - if (isDevFlavor) { + if (isDebugBuildType) { add( AppBar.OverflowAction( title = "Colors Palette", diff --git a/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt b/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt index 7de1760e4..24b248161 100644 --- a/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt +++ b/app/src/main/java/eu/kanade/presentation/more/onboarding/PermissionStep.kt @@ -37,6 +37,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.compose.LocalLifecycleOwner import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState import eu.kanade.tachiyomi.core.security.PrivacyPreferences +import eu.kanade.tachiyomi.util.system.analyticsIncluded import eu.kanade.tachiyomi.util.system.launchRequestPackageInstallsPermission import tachiyomi.i18n.MR import tachiyomi.i18n.kmk.KMR @@ -182,6 +183,8 @@ internal class PermissionStep : OnboardingStep { color = MaterialTheme.colorScheme.onPrimaryContainer, ) + if (!analyticsIncluded) return@Column + val crashlyticsPref = privacyPreferences.crashlytics() val crashlytics by crashlyticsPref.collectAsState() PermissionSwitch( diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt index 402e21038..9870a8816 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsAdvancedScreen.kt @@ -63,8 +63,7 @@ import eu.kanade.tachiyomi.ui.more.OnboardingScreen import eu.kanade.tachiyomi.util.CrashLogUtil import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.system.GLUtil -import eu.kanade.tachiyomi.util.system.isDevFlavor -import eu.kanade.tachiyomi.util.system.isPreviewBuildType +import eu.kanade.tachiyomi.util.system.isReleaseBuildType import eu.kanade.tachiyomi.util.system.isShizukuInstalled import eu.kanade.tachiyomi.util.system.powerManager import eu.kanade.tachiyomi.util.system.setDefaultSettings @@ -479,10 +478,10 @@ object SettingsAdvancedScreen : SearchableSettings { entries = extensionInstallerPref.entries .filter { // TODO: allow private option in stable versions once URL handling is more fleshed out - if (isPreviewBuildType || isDevFlavor) { - true - } else { + if (isReleaseBuildType) { it != BasePreferences.ExtensionInstaller.PRIVATE + } else { + true } } .associateWith { stringResource(it.titleRes) } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt index ab9c464ff..0cfa36bee 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt @@ -51,6 +51,7 @@ import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate import eu.kanade.tachiyomi.ui.category.biometric.BiometricTimesScreen import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported +import eu.kanade.tachiyomi.util.system.analyticsIncluded import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableMap import mihon.core.archive.CbzCrypto @@ -74,10 +75,11 @@ object SettingsSecurityScreen : SearchableSettings { override fun getPreferences(): List { val securityPreferences = remember { Injekt.get() } val privacyPreferences = remember { Injekt.get() } - return listOf( - getSecurityGroup(securityPreferences), - getFirebaseGroup(privacyPreferences), - ) + return buildList(2) { + add(getSecurityGroup(securityPreferences)) + if (!analyticsIncluded) return@buildList + add(getFirebaseGroup(privacyPreferences)) + } } @Composable diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt index 12031658b..2a68f98c5 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt @@ -36,7 +36,7 @@ import eu.kanade.tachiyomi.ui.more.WhatsNewScreen import eu.kanade.tachiyomi.util.CrashLogUtil import eu.kanade.tachiyomi.util.lang.toDateTimestampString import eu.kanade.tachiyomi.util.system.copyToClipboard -import eu.kanade.tachiyomi.util.system.isDevFlavor +import eu.kanade.tachiyomi.util.system.isDebugBuildType import eu.kanade.tachiyomi.util.system.isReleaseBuildType import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.launch @@ -185,7 +185,7 @@ object AboutScreen : Screen() { ) } - if (isReleaseBuildType || isDevFlavor) { + if (isReleaseBuildType || isDebugBuildType) { item { TextPreferenceWidget( title = stringResource(KMR.strings.whats_coming), diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index fc5a08df7..b8b397afb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -58,6 +58,7 @@ import eu.kanade.tachiyomi.di.SYPreferenceModule import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate +import eu.kanade.tachiyomi.util.CrashLogUtil import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.GLUtil import eu.kanade.tachiyomi.util.system.WebViewUtil @@ -357,19 +358,7 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor ) xLogD("Application booting...") - xLogD( - """ - App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE}) - Build version: ${BuildConfig.COMMIT_COUNT} - Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}) - Android build ID: ${Build.DISPLAY} - Device brand: ${Build.BRAND} - Device manufacturer: ${Build.MANUFACTURER} - Device name: ${Build.DEVICE} - Device model: ${Build.MODEL} - Device product name: ${Build.PRODUCT} - """.trimIndent(), - ) + xLogD(CrashLogUtil(applicationContext).getDebugInfo()) } private inner class DisableIncognitoReceiver : BroadcastReceiver() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt index bcb103f3b..483dd4131 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt @@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.core.security.PrivacyPreferences import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences -import eu.kanade.tachiyomi.util.system.isDevFlavor +import eu.kanade.tachiyomi.util.system.isDebugBuildType import tachiyomi.core.common.preference.AndroidPreferenceStore import tachiyomi.core.common.preference.PreferenceStore import tachiyomi.core.common.storage.AndroidStorageFolderProvider @@ -32,7 +32,7 @@ class PreferenceModule(val app: Application) : InjektModule { addSingletonFactory { NetworkPreferences( preferenceStore = get(), - verboseLogging = isDevFlavor, + verboseLogging = isDebugBuildType, ) } addSingletonFactory { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt index fe3534fe2..67fadc97e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/CrashLogUtil.kt @@ -40,7 +40,7 @@ class CrashLogUtil( fun getDebugInfo(): String { return """ - App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.FLAVOR}, ${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE}, ${BuildConfig.BUILD_TIME}) + App version: ${BuildConfig.VERSION_NAME} (${BuildConfig.COMMIT_SHA}, ${BuildConfig.VERSION_CODE}, ${BuildConfig.BUILD_TIME}) Build version: ${BuildConfig.COMMIT_COUNT} Android version: ${Build.VERSION.RELEASE} (SDK ${Build.VERSION.SDK_INT}; build ${Build.DISPLAY}) Device brand: ${Build.BRAND} diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/BuildConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/BuildConfig.kt index 933f44d90..d8a3dc78b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/BuildConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/BuildConfig.kt @@ -1,12 +1,17 @@ +@file:Suppress("UNUSED", "KotlinConstantConditions") + package eu.kanade.tachiyomi.util.system import eu.kanade.tachiyomi.BuildConfig -val isDevFlavor: Boolean - get() = BuildConfig.FLAVOR == "dev" +val analyticsIncluded: Boolean + inline get() = BuildConfig.INCLUDE_ANALYTICS + +val isDebugBuildType: Boolean + inline get() = BuildConfig.BUILD_TYPE == "debug" val isPreviewBuildType: Boolean - get() = BuildConfig.BUILD_TYPE == "preview" + inline get() = BuildConfig.BUILD_TYPE == "preview" val isReleaseBuildType: Boolean - get() = BuildConfig.BUILD_TYPE == "release" + inline get() = BuildConfig.BUILD_TYPE == "release" diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt index d7b365e51..ab78ee12d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt @@ -171,7 +171,7 @@ fun Context.isInstalledFromFDroid(): Boolean { return installerPackageName == "org.fdroid.fdroid" || // F-Droid builds typically disable the updater - (!BuildConfig.INCLUDE_UPDATER && !isDevFlavor) + (!BuildConfig.INCLUDE_UPDATER && !isDebugBuildType) } fun Context.launchRequestPackageInstallsPermission() {