| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- // SPDX-FileCopyrightText: 2023 yuzu Emulator Project
- // SPDX-License-Identifier: GPL-3.0-or-later
- import android.annotation.SuppressLint
- import kotlin.collections.setOf
- import org.jetbrains.kotlin.konan.properties.Properties
- import org.jlleitschuh.gradle.ktlint.reporter.ReporterType
- plugins {
- id("com.android.application")
- id("org.jetbrains.kotlin.android")
- id("kotlin-parcelize")
- kotlin("plugin.serialization") version "1.9.20"
- id("androidx.navigation.safeargs.kotlin")
- id("org.jlleitschuh.gradle.ktlint") version "11.4.0"
- }
- /**
- * Use the number of seconds/10 since Jan 1 2016 as the versionCode.
- * This lets us upload a new build at most every 10 seconds for the
- * next 680 years.
- */
- val autoVersion = (((System.currentTimeMillis() / 1000) - 1451606400) / 10).toInt()
- @Suppress("UnstableApiUsage")
- android {
- namespace = "org.yuzu.yuzu_emu"
- compileSdkVersion = "android-34"
- ndkVersion = "26.1.10909125"
- buildFeatures {
- viewBinding = true
- }
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
- kotlinOptions {
- jvmTarget = "17"
- }
- packaging {
- // This is necessary for libadrenotools custom driver loading
- jniLibs.useLegacyPackaging = true
- }
- androidResources {
- generateLocaleConfig = true
- }
- defaultConfig {
- // TODO If this is ever modified, change application_id in strings.xml
- applicationId = "org.yuzu.yuzu_emu"
- minSdk = 30
- targetSdk = 34
- versionName = getGitVersion()
- // If you want to use autoVersion for the versionCode, create a property in local.properties
- // named "autoVersioned" and set it to "true"
- val properties = Properties()
- val versionProperty = try {
- properties.load(project.rootProject.file("local.properties").inputStream())
- properties.getProperty("autoVersioned") ?: ""
- } catch (e: Exception) { "" }
- versionCode = if (versionProperty == "true") {
- autoVersion
- } else {
- 1
- }
- ndk {
- @SuppressLint("ChromeOsAbiSupport")
- abiFilters += listOf("arm64-v8a")
- }
- buildConfigField("String", "GIT_HASH", "\"${getGitHash()}\"")
- buildConfigField("String", "BRANCH", "\"${getBranch()}\"")
- }
- val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE")
- signingConfigs {
- if (keystoreFile != null) {
- create("release") {
- storeFile = file(keystoreFile)
- storePassword = System.getenv("ANDROID_KEYSTORE_PASS")
- keyAlias = System.getenv("ANDROID_KEY_ALIAS")
- keyPassword = System.getenv("ANDROID_KEYSTORE_PASS")
- }
- }
- create("default") {
- storeFile = file("$projectDir/debug.keystore")
- storePassword = "android"
- keyAlias = "androiddebugkey"
- keyPassword = "android"
- }
- }
- // Define build types, which are orthogonal to product flavors.
- buildTypes {
- // Signed by release key, allowing for upload to Play Store.
- release {
- signingConfig = if (keystoreFile != null) {
- signingConfigs.getByName("release")
- } else {
- signingConfigs.getByName("default")
- }
- resValue("string", "app_name_suffixed", "yuzu")
- isMinifyEnabled = true
- isDebuggable = false
- proguardFiles(
- getDefaultProguardFile("proguard-android.txt"),
- "proguard-rules.pro"
- )
- }
- // builds a release build that doesn't need signing
- // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
- register("relWithDebInfo") {
- isDefault = true
- resValue("string", "app_name_suffixed", "yuzu Debug Release")
- signingConfig = signingConfigs.getByName("default")
- isMinifyEnabled = true
- isDebuggable = true
- proguardFiles(
- getDefaultProguardFile("proguard-android.txt"),
- "proguard-rules.pro"
- )
- versionNameSuffix = "-relWithDebInfo"
- applicationIdSuffix = ".relWithDebInfo"
- isJniDebuggable = true
- }
- // Signed by debug key disallowing distribution on Play Store.
- // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
- debug {
- signingConfig = signingConfigs.getByName("default")
- resValue("string", "app_name_suffixed", "yuzu Debug")
- isDebuggable = true
- isJniDebuggable = true
- versionNameSuffix = "-debug"
- applicationIdSuffix = ".debug"
- }
- }
- flavorDimensions.add("version")
- productFlavors {
- create("mainline") {
- isDefault = true
- dimension = "version"
- buildConfigField("Boolean", "PREMIUM", "false")
- }
- create("ea") {
- dimension = "version"
- buildConfigField("Boolean", "PREMIUM", "true")
- applicationIdSuffix = ".ea"
- }
- }
- externalNativeBuild {
- cmake {
- version = "3.22.1"
- path = file("../../../CMakeLists.txt")
- }
- }
- defaultConfig {
- externalNativeBuild {
- cmake {
- arguments(
- "-DENABLE_QT=0", // Don't use QT
- "-DENABLE_SDL2=0", // Don't use SDL
- "-DENABLE_WEB_SERVICE=0", // Don't use telemetry
- "-DBUNDLE_SPEEX=ON",
- "-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work
- "-DYUZU_USE_BUNDLED_VCPKG=ON",
- "-DYUZU_USE_BUNDLED_FFMPEG=ON",
- "-DYUZU_ENABLE_LTO=ON",
- "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"
- )
- abiFilters("arm64-v8a", "x86_64")
- }
- }
- }
- }
- tasks.create<Delete>("ktlintReset") {
- delete(File(buildDir.path + File.separator + "intermediates/ktLint"))
- }
- val showFormatHelp = {
- logger.lifecycle(
- "If this check fails, please try running \"gradlew ktlintFormat\" for automatic " +
- "codestyle fixes"
- )
- }
- tasks.getByPath("ktlintKotlinScriptCheck").doFirst { showFormatHelp.invoke() }
- tasks.getByPath("ktlintMainSourceSetCheck").doFirst { showFormatHelp.invoke() }
- tasks.getByPath("loadKtlintReporters").dependsOn("ktlintReset")
- ktlint {
- version.set("0.47.1")
- android.set(true)
- ignoreFailures.set(false)
- disabledRules.set(
- setOf(
- "no-wildcard-imports",
- "package-name",
- "import-ordering"
- )
- )
- reporters {
- reporter(ReporterType.CHECKSTYLE)
- }
- }
- dependencies {
- implementation("androidx.core:core-ktx:1.12.0")
- implementation("androidx.appcompat:appcompat:1.6.1")
- implementation("androidx.recyclerview:recyclerview:1.3.1")
- implementation("androidx.constraintlayout:constraintlayout:2.1.4")
- implementation("androidx.fragment:fragment-ktx:1.6.1")
- implementation("androidx.documentfile:documentfile:1.0.1")
- implementation("com.google.android.material:material:1.9.0")
- implementation("androidx.preference:preference-ktx:1.2.1")
- implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
- implementation("io.coil-kt:coil:2.2.2")
- implementation("androidx.core:core-splashscreen:1.0.1")
- implementation("androidx.window:window:1.2.0-beta03")
- implementation("androidx.constraintlayout:constraintlayout:2.1.4")
- implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
- implementation("androidx.navigation:navigation-fragment-ktx:2.7.4")
- implementation("androidx.navigation:navigation-ui-ktx:2.7.4")
- implementation("info.debatty:java-string-similarity:2.0.0")
- implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0")
- }
- fun runGitCommand(command: List<String>): String {
- return try {
- ProcessBuilder(command)
- .directory(project.rootDir)
- .redirectOutput(ProcessBuilder.Redirect.PIPE)
- .redirectError(ProcessBuilder.Redirect.PIPE)
- .start().inputStream.bufferedReader().use { it.readText() }
- .trim()
- } catch (e: Exception) {
- logger.error("Cannot find git")
- ""
- }
- }
- fun getGitVersion(): String {
- val versionName = if (System.getenv("GITHUB_ACTIONS") != null) {
- val gitTag = System.getenv("GIT_TAG_NAME") ?: ""
- gitTag
- } else {
- runGitCommand(listOf("git", "describe", "--always", "--long"))
- .replace(Regex("(-0)?-[^-]+$"), "")
- }
- return versionName.ifEmpty { "0.0" }
- }
- fun getGitHash(): String =
- runGitCommand(listOf("git", "rev-parse", "--short", "HEAD")).ifEmpty { "dummy-hash" }
- fun getBranch(): String =
- runGitCommand(listOf("git", "rev-parse", "--abbrev-ref", "HEAD")).ifEmpty { "dummy-hash" }
|