| | |
| | |
| |
|
| | import android.annotation.SuppressLint |
| | import kotlin.collections.setOf |
| | import org.jlleitschuh.gradle.ktlint.reporter.ReporterType |
| | import com.github.triplet.gradle.androidpublisher.ReleaseStatus |
| |
|
| | 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" |
| | id("com.github.triplet.play") version "3.8.6" |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | 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 { |
| | |
| | jniLibs.useLegacyPackaging = true |
| | } |
| |
|
| | androidResources { |
| | generateLocaleConfig = true |
| | } |
| |
|
| | defaultConfig { |
| | |
| | applicationId = "org.yuzu.yuzu_emu" |
| | minSdk = 30 |
| | targetSdk = 34 |
| | versionName = getGitVersion() |
| |
|
| | versionCode = if (System.getenv("AUTO_VERSIONED") == "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" |
| | } |
| | } |
| |
|
| | |
| | buildTypes { |
| |
|
| | |
| | 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" |
| | ) |
| | } |
| |
|
| | |
| | |
| | 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 |
| | } |
| |
|
| | |
| | |
| | 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", |
| | "-DENABLE_SDL2=0", |
| | "-DENABLE_WEB_SERVICE=0", |
| | "-DBUNDLE_SPEEX=ON", |
| | "-DANDROID_ARM_NEON=true", |
| | "-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) |
| | } |
| | } |
| |
|
| | play { |
| | val keyPath = System.getenv("SERVICE_ACCOUNT_KEY_PATH") |
| | if (keyPath != null) { |
| | serviceAccountCredentials.set(File(keyPath)) |
| | } |
| | track.set(System.getenv("STORE_TRACK") ?: "internal") |
| | releaseStatus.set(ReleaseStatus.COMPLETED) |
| | } |
| |
|
| | 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 gitVersion = runGitCommand( |
| | listOf( |
| | "git", |
| | "describe", |
| | "--always", |
| | "--long" |
| | ) |
| | ).replace(Regex("(-0)?-[^-]+$"), "") |
| | val versionName = if (System.getenv("GITHUB_ACTIONS") != null) { |
| | System.getenv("GIT_TAG_NAME") ?: gitVersion |
| | } else { |
| | gitVersion |
| | } |
| | 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" } |
| |
|