import com.android.build.api.dsl.ApplicationExtension import java.io.ByteArrayOutputStream plugins { id("com.android.application") id("org.jetbrains.kotlin.android") kotlin("plugin.serialization") version "1.9.21" } android { namespace = "moe.fuqiuluo.shamrock" ndkVersion = "25.1.8937393" compileSdk = 34 defaultConfig { applicationId = "moe.fuqiuluo.shamrock" minSdk = 27 targetSdk = 34 versionCode = getVersionCode() versionName = "1.0.8" + ".r${getGitCommitCount()}." + getVersionName() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } @Suppress("UnstableApiUsage") externalNativeBuild { cmake { cppFlags += "" } } } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } android.applicationVariants.all { outputs.map { it as com.android.build.gradle.internal.api.BaseVariantOutputImpl } .forEach { val abiName = when (val abi = it.outputFileName.split("-")[1].split(".apk")[0]) { "app" -> "all" "x64" -> "x86_64" else -> abi } it.outputFileName = "Shamrock-v${versionName}-${abiName}.apk" } } flavorDimensions.add("mode") productFlavors { create("app") { dimension = "mode" ndk { println("Full architecture and full compilation.") abiFilters.add("arm64-v8a") abiFilters.add("x86_64") abiFilters.add("x86") } } create("arm64") { dimension = "mode" ndk { println("Full compilation of arm64 architecture") abiFilters.add("arm64-v8a") } } create("x64") { dimension = "mode" ndk { println("Full compilation of x64 architecture") abiFilters.add("x86_64") } } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.4" } packaging { jniLibs { useLegacyPackaging = true } resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" excludes += "/META-INF/*" excludes += "/META-INF/NOTICE.txt" excludes += "/META-INF/DEPENDENCIES.txt" excludes += "/META-INF/NOTICE" excludes += "/META-INF/LICENSE" excludes += "/META-INF/DEPENDENCIES" excludes += "/META-INF/notice.txt" excludes += "/META-INF/dependencies.txt" excludes += "/META-INF/LGPL2.1" excludes += "/META-INF/ASL2.0" excludes += "/META-INF/INDEX.LIST" excludes += "/META-INF/io.netty.versions.properties" excludes += "/META-INF/INDEX.LIST" excludes += "/META-INF/LICENSE.txt" excludes += "/META-INF/license.txt" excludes += "/META-INF/*.kotlin_module" excludes += "/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration" } } externalNativeBuild { cmake { path = file("src/main/cpp/CMakeLists.txt") version = "3.22.1" } } configureAppSigningConfigsForRelease(project) packagingOptions { jniLibs { useLegacyPackaging = true } } } fun configureAppSigningConfigsForRelease(project: Project) { val keystorePath: String? = System.getenv("KEYSTORE_PATH") if (keystorePath.isNullOrBlank()) { return } project.configure { signingConfigs { create("release") { storeFile = file(System.getenv("KEYSTORE_PATH")) storePassword = System.getenv("KEYSTORE_PASSWORD") keyAlias = System.getenv("KEY_ALIAS") keyPassword = System.getenv("KEY_PASSWORD") enableV2Signing = true } } buildTypes { release { signingConfig = signingConfigs.findByName("release") } debug { signingConfig = signingConfigs.findByName("release") } } } } fun getGitCommitCount(): Int { val out = ByteArrayOutputStream() exec { commandLine("git", "rev-list", "--count", "HEAD") standardOutput = out } return out.toString().trim().toInt() } fun getGitCommitHash(): String { val out = ByteArrayOutputStream() exec { commandLine("git", "rev-parse", "--short", "HEAD") standardOutput = out } return out.toString().trim() } fun getVersionCode(): Int { return (System.currentTimeMillis() / 1000L).toInt() } fun getVersionName(): String { return getGitCommitHash() } dependencies { val composeBom = platform("androidx.compose:compose-bom:2023.10.01") implementation(composeBom) DEPENDENCY_ANDROIDX.forEach { implementation(it) } implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") //noinspection GradleDynamicVersion implementation("com.google.accompanist:accompanist-pager:0.31.5+") //noinspection GradleDynamicVersion implementation("com.google.accompanist:accompanist-systemuicontroller:0.31.5+") implementation("io.coil-kt:coil:2.4.0") implementation("io.coil-kt:coil-compose:2.4.0") implementation(kotlinx("io-jvm", "0.1.16")) implementation(ktor("server", "core")) implementation(ktor("server", "host-common")) implementation(ktor("server", "status-pages")) implementation(ktor("server", "netty")) implementation(ktor("server", "content-negotiation")) implementation(ktor("client", "core")) implementation(ktor("client", "content-negotiation")) implementation(ktor("client", "cio")) implementation(ktor("serialization", "kotlinx-json")) implementation(project(":xposed")) testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation(platform("androidx.compose:compose-bom:2023.10.01")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") }