import kotlin.random.Random plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.serialization) alias(libs.plugins.kotlin.parcelize) alias(libs.plugins.compose.compiler) alias(libs.plugins.devtools) alias(libs.plugins.about.libraries) signing } val outputApkFileName = "${rootProject.name}-$version.apk" dependencies { // AndroidX Core implementation(libs.androidx.ktx) implementation(libs.runtime.ktx) implementation(libs.runtime.compose) implementation(libs.splash.screen) implementation(libs.activity.compose) implementation(libs.work.runtime.ktx) implementation(libs.preferences.datastore) implementation(libs.appcompat) // Compose implementation(platform(libs.compose.bom)) implementation(libs.compose.ui) implementation(libs.compose.ui.preview) implementation(libs.compose.ui.tooling) implementation(libs.compose.livedata) implementation(libs.compose.material.icons.extended) implementation(libs.compose.material3) implementation(libs.navigation.compose) // Accompanist implementation(libs.accompanist.drawablepainter) // Placeholder implementation(libs.placeholder.material3) // HTML Scraper implementation(libs.skrapeit.dsl) implementation(libs.skrapeit.parser) // Coil (async image loading, network image) implementation(libs.coil.compose) implementation(libs.coil.appiconloader) // KotlinX implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.collection.immutable) implementation(libs.kotlinx.datetime) // Room implementation(libs.room.runtime) implementation(libs.room.ktx) annotationProcessor(libs.room.compiler) ksp(libs.room.compiler) // ReVanced implementation(libs.revanced.patcher) implementation(libs.revanced.library) // Downloader plugins implementation(project(":api")) // Native processes implementation(libs.kotlin.process) // HiddenAPI compileOnly(libs.hidden.api.stub) // LibSU implementation(libs.libsu.core) implementation(libs.libsu.service) implementation(libs.libsu.nio) // Koin implementation(libs.koin.android) implementation(libs.koin.compose) implementation(libs.koin.compose.navigation) implementation(libs.koin.workmanager) // Licenses implementation(libs.about.libraries) // Ktor implementation(libs.ktor.core) implementation(libs.ktor.logging) implementation(libs.ktor.okhttp) implementation(libs.ktor.content.negotiation) implementation(libs.ktor.serialization) // Markdown implementation(libs.markdown.renderer) // Fading Edges implementation(libs.fading.edges) // Scrollbars implementation(libs.scrollbars) // EnumUtil implementation(libs.enumutil) ksp(libs.enumutil.ksp) // Reorderable lists implementation(libs.reorderable) // Compose Icons implementation(libs.compose.icons.fontawesome) } android { namespace = "app.revanced.manager" compileSdk = 35 buildToolsVersion = "35.0.1" defaultConfig { applicationId = "app.revanced.manager" minSdk = 26 targetSdk = 35 versionCode = 1 versionName = "0.0.1" vectorDrawables.useSupportLibrary = true } buildTypes { debug { applicationIdSuffix = ".debug" resValue("string", "app_name", "ReVanced Manager (Debug)") isPseudoLocalesEnabled = true buildConfigField("long", "BUILD_ID", "${Random.nextLong()}L") } release { if (!project.hasProperty("noProguard")) { isMinifyEnabled = true isShrinkResources = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } val keystoreFile = file("keystore.jks") if (project.hasProperty("signAsDebug") || !keystoreFile.exists()) { applicationIdSuffix = ".debug_signed" resValue("string", "app_name", "ReVanced Manager (Debug signed)") signingConfig = signingConfigs.getByName("debug") isPseudoLocalesEnabled = true } else { signingConfig = signingConfigs.create("release") { storeFile = keystoreFile storePassword = System.getenv("KEYSTORE_PASSWORD") keyAlias = System.getenv("KEYSTORE_ENTRY_ALIAS") keyPassword = System.getenv("KEYSTORE_ENTRY_PASSWORD") } } buildConfigField("long", "BUILD_ID", "0L") } } applicationVariants.all { outputs.all { this as com.android.build.gradle.internal.api.ApkVariantOutputImpl outputFileName = outputApkFileName } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } dependenciesInfo { includeInApk = false includeInBundle = false } packaging { resources.excludes.addAll( listOf( "/prebuilt/**", "META-INF/DEPENDENCIES", "META-INF/**.version", "DebugProbesKt.bin", "kotlin-tooling-metadata.json", "org/bouncycastle/pqc/**.properties", "org/bouncycastle/x509/**.properties", ) ) jniLibs { useLegacyPackaging = true } } ksp { arg("room.schemaLocation", "$projectDir/schemas") } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true aidl = true buildConfig = true } android { androidResources { generateLocaleConfig = true } } externalNativeBuild { cmake { path = file("src/main/cpp/CMakeLists.txt") version = "3.22.1" } } } kotlin { jvmToolchain(17) } tasks { // Needed by gradle-semantic-release-plugin. // Tracking: https://github.com/KengoTODA/gradle-semantic-release-plugin/issues/435. val publish by registering { group = "publishing" description = "Build the release APK" dependsOn("assembleRelease") val apk = project.layout.buildDirectory.file("outputs/apk/release/${outputApkFileName}") val ascFile = apk.map { it.asFile.resolveSibling("${it.asFile.name}.asc") } inputs.file(apk).withPropertyName("inputApk") outputs.file(ascFile).withPropertyName("outputAsc") doLast { signing { useGpgCmd() sign(apk.get().asFile) } } } }