From 001089dbf4a81febfd58c02b540e393616916283 Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Sat, 16 Sep 2023 23:49:22 -0400 Subject: [PATCH] android: Convert gradle files to kotlin gradle dsl --- Source/Android/app/build.gradle | 221 ------------------ Source/Android/app/build.gradle.kts | 216 +++++++++++++++++ Source/Android/build.gradle | 6 - Source/Android/build.gradle.kts | 12 + .../{settings.gradle => settings.gradle.kts} | 6 +- 5 files changed, 232 insertions(+), 229 deletions(-) delete mode 100644 Source/Android/app/build.gradle create mode 100644 Source/Android/app/build.gradle.kts delete mode 100644 Source/Android/build.gradle create mode 100644 Source/Android/build.gradle.kts rename Source/Android/{settings.gradle => settings.gradle.kts} (85%) diff --git a/Source/Android/app/build.gradle b/Source/Android/app/build.gradle deleted file mode 100644 index eeb7b31a95..0000000000 --- a/Source/Android/app/build.gradle +++ /dev/null @@ -1,221 +0,0 @@ -plugins { - id 'com.android.application' - id 'org.jetbrains.kotlin.android' - id 'org.jetbrains.kotlin.plugin.serialization' version "1.8.21" -} - -task copyProfile (type: Copy) { - description('Copies a generated baseline profile text file from managed device to src/main in the app module.') - from(project(':benchmark').file('build/outputs/managed_device_android_test_additional_output/pixel6Api31')) - into('src/main') - include('BaselineProfileGenerator_generate-baseline-prof.txt') - rename('BaselineProfileGenerator_generate-baseline-prof', 'baseline-prof') -} - -android { - compileSdkVersion 33 - ndkVersion "25.2.9519653" - - viewBinding.enabled = true - - compileOptions { - // Flag to enable support for the new language APIs - coreLibraryDesugaringEnabled true - - sourceCompatibility = "17" - targetCompatibility = "17" - } - - kotlinOptions { - jvmTarget = '17' - } - - lint { - // This is important as it will run lint but not abort on error - // Lint has some overly obnoxious "errors" that should really be warnings - abortOnError false - - //Uncomment disable lines for test builds... - //disable 'MissingTranslation' - //disable 'ExtraTranslation' - } - - defaultConfig { - applicationId "org.dolphinemu.dolphinemu" - minSdkVersion 21 - targetSdkVersion 33 - - versionCode(getBuildVersionCode()) - - versionName "${getVersion()}" - - buildConfigField "String", "GIT_HASH", "\"${getGitHash()}\"" - buildConfigField "String", "BRANCH", "\"${getBranch()}\"" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - signingConfigs { - release { - if (project.hasProperty('keystore')) { - storeFile file(project.property('keystore')) - storePassword project.property('storepass') - keyAlias project.property('keyalias') - keyPassword project.property('keypass') - } - } - } - - // Define build types, which are orthogonal to product flavors. - buildTypes { - // Signed by release key, allowing for upload to Play Store. - release { - if (project.hasProperty('keystore')) { - signingConfig signingConfigs.release - } - - resValue 'string', 'app_name_suffixed', 'Dolphin Emulator' - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile( - 'proguard-android-optimize.txt'), - 'proguard-rules.pro' - - preBuild.dependsOn copyProfile - } - - // Signed by debug key disallowing distribution on Play Store. - // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. - debug { - resValue 'string', 'app_name_suffixed', 'Dolphin Debug' - applicationIdSuffix ".debug" - versionNameSuffix '-debug' - jniDebuggable true - } - - benchmark { - resValue 'string', 'app_name_suffixed', 'Dolphin Benchmark' - signingConfig signingConfigs.debug - matchingFallbacks = ['release'] - debuggable false - applicationIdSuffix ".benchmark" - versionNameSuffix '-benchmark' - proguardFiles getDefaultProguardFile( - 'proguard-android-optimize.txt'), - 'proguard-rules.pro' - minifyEnabled true - shrinkResources true - } - } - - externalNativeBuild { - cmake { - path "../../../CMakeLists.txt" - version "3.22.1+" - } - } - namespace 'org.dolphinemu.dolphinemu' - - defaultConfig { - externalNativeBuild { - cmake { - arguments "-DANDROID_STL=c++_static", "-DCMAKE_BUILD_TYPE=RelWithDebInfo" - // , "-DENABLE_GENERIC=ON" - abiFilters "arm64-v8a", "x86_64" //, "armeabi-v7a", "x86" - - // Remove the line below if you want to build the C++ unit tests - //targets "main", "hook_impl", "main_hook", "gsl_alloc_hook", "file_redirect_hook" - } - } - } - - packagingOptions { - jniLibs.useLegacyPackaging = true - } -} - -dependencies { - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' - - implementation 'androidx.core:core-ktx:1.10.1' - implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'androidx.exifinterface:exifinterface:1.3.6' - implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.recyclerview:recyclerview:1.3.0' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.lifecycle:lifecycle-viewmodel:2.6.1' - implementation 'androidx.fragment:fragment:1.6.0' - implementation 'androidx.slidingpanelayout:slidingpanelayout:1.2.0' - implementation 'com.google.android.material:material:1.9.0' - implementation 'androidx.core:core-splashscreen:1.0.1' - implementation 'androidx.preference:preference:1.2.0' - implementation 'androidx.profileinstaller:profileinstaller:1.3.1' - - // Kotlin extensions for lifecycle components - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' - - // Android TV UI libraries. - implementation 'androidx.leanback:leanback:1.0.0' - implementation 'androidx.tvprovider:tvprovider:1.0.0' - - // For REST calls - implementation 'com.android.volley:volley:1.2.1' - - // For loading game covers from disk and GameTDB - implementation 'io.coil-kt:coil:2.2.2' - - // For loading custom GPU drivers - implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" - - implementation 'com.nononsenseapps:filepicker:4.2.1' -} - -def getVersion() { - def versionNumber = '0.0' - - try { - versionNumber = 'git describe --always --long'.execute([], project.rootDir).text - .trim() - .replaceAll(/(-0)?-[^-]+$/, "") - } catch (Exception e) { - logger.error(e + ': Cannot find git, defaulting to dummy version number') - } - - return versionNumber -} - -def getBuildVersionCode() { - try { - def versionNumber = 'git rev-list --first-parent --count HEAD'.execute([], project.rootDir).text - .trim() - return Integer.valueOf(versionNumber) - } catch (Exception e) { - logger.error(e + ': Cannot find git, defaulting to dummy version number') - } - - return 1 -} - -def getGitHash() { - try { - def gitHash = 'git rev-parse HEAD'.execute([], project.rootDir).text.trim() - return gitHash - } catch (Exception e) { - logger.error(e + ': Cannot find git, defaulting to dummy build hash') - } - - return 0 -} - -def getBranch() { - try { - def branch = 'git rev-parse --abbrev-ref HEAD'.execute([], project.rootDir).text.trim() - return branch - } catch (Exception e) { - logger.error(e + ': Cannot find git, defaulting to dummy build hash') - } - - return 'master' -} diff --git a/Source/Android/app/build.gradle.kts b/Source/Android/app/build.gradle.kts new file mode 100644 index 0000000000..86f2afe47d --- /dev/null +++ b/Source/Android/app/build.gradle.kts @@ -0,0 +1,216 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + kotlin("plugin.serialization") version "1.8.21" +} + +@Suppress("UnstableApiUsage") +android { + compileSdkVersion = "android-33" + ndkVersion = "25.2.9519653" + + buildFeatures { + viewBinding = true + } + + compileOptions { + // Flag to enable support for the new language APIs + isCoreLibraryDesugaringEnabled = true + + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } + + lint { + // This is important as it will run lint but not abort on error + // Lint has some overly obnoxious "errors" that should really be warnings + abortOnError = false + + //Uncomment disable lines for test builds... + //disable "MissingTranslation" + //disable "ExtraTranslation" + } + + defaultConfig { + applicationId = "org.dolphinemu.dolphinemu" + minSdk = 21 + targetSdk = 33 + + versionCode = getBuildVersionCode() + + versionName = getGitVersion() + + buildConfigField("String", "GIT_HASH", "\"${getGitHash()}\"") + buildConfigField("String", "BRANCH", "\"${getBranch()}\"") + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + create("release") { + if (project.hasProperty("keystore")) { + storeFile = file(project.property("keystore")!!) + storePassword = project.property("storepass").toString() + keyAlias = project.property("keyalias").toString() + keyPassword = project.property("keypass").toString() + } + } + } + + // Define build types, which are orthogonal to product flavors. + buildTypes { + // Signed by release key, allowing for upload to Play Store. + release { + if (project.hasProperty("keystore")) { + signingConfig = signingConfigs.getByName("release") + } + + resValue("string", "app_name_suffixed", "Dolphin Emulator") + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android.txt"), + "proguard-rules.pro" + ) + } + + // Signed by debug key disallowing distribution on Play Store. + // Attaches "debug" suffix to version and package name, allowing installation alongside the release build. + debug { + resValue("string", "app_name_suffixed", "Dolphin Debug") + applicationIdSuffix = ".debug" + versionNameSuffix = "-debug" + isJniDebuggable = true + } + } + + externalNativeBuild { + cmake { + path = file("../../../CMakeLists.txt") + version = "3.22.1+" + } + } + namespace = "org.dolphinemu.dolphinemu" + + defaultConfig { + externalNativeBuild { + cmake { + arguments("-DANDROID_STL=c++_static", "-DCMAKE_BUILD_TYPE=RelWithDebInfo") + // , "-DENABLE_GENERIC=ON" + abiFilters("arm64-v8a", "x86_64") //, "armeabi-v7a", "x86" + + // Remove the line below if you want to build the C++ unit tests + //targets "main", "hook_impl", "main_hook", "gsl_alloc_hook", "file_redirect_hook" + } + } + } + + packaging { + jniLibs.useLegacyPackaging = true + } +} + +dependencies { + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3") + + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("androidx.exifinterface:exifinterface:1.3.6") + implementation("androidx.cardview:cardview:1.0.0") + implementation("androidx.recyclerview:recyclerview:1.3.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.lifecycle:lifecycle-viewmodel:2.6.1") + implementation("androidx.fragment:fragment:1.6.0") + implementation("androidx.slidingpanelayout:slidingpanelayout:1.2.0") + implementation("com.google.android.material:material:1.9.0") + implementation("androidx.core:core-splashscreen:1.0.1") + implementation("androidx.preference:preference:1.2.0") + implementation("androidx.profileinstaller:profileinstaller:1.3.1") + + // Kotlin extensions for lifecycle components + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1") + + // Android TV UI libraries. + implementation("androidx.leanback:leanback:1.0.0") + implementation("androidx.tvprovider:tvprovider:1.0.0") + + // For REST calls + implementation("com.android.volley:volley:1.2.1") + + // For loading game covers from disk and GameTDB + implementation("io.coil-kt:coil:2.2.2") + + // For loading custom GPU drivers + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1") + + implementation("com.nononsenseapps:filepicker:4.2.1") +} + +fun getGitVersion(): String { + try { + return ProcessBuilder("git", "describe", "--always", "--long") + .directory(project.rootDir) + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .redirectError(ProcessBuilder.Redirect.PIPE) + .start().inputStream.bufferedReader().use { it.readText() } + .trim() + .replace(Regex("(-0)?-[^-]+$"), "") + } catch (e: Exception) { + logger.error("Cannot find git, defaulting to dummy version number") + } + + return "0.0" +} + +fun getBuildVersionCode(): Int { + try { + return Integer.valueOf( + ProcessBuilder("git", "rev-list", "--first-parent", "--count", "HEAD") + .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, defaulting to dummy version code") + } + + return 1 +} + +fun getGitHash(): String { + try { + return ProcessBuilder("git", "rev-parse", "HEAD") + .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, defaulting to dummy git hash") + } + + return "0" +} + +fun getBranch(): String { + try { + return ProcessBuilder("git", "rev-parse", "--abbrev-ref", "HEAD") + .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, defaulting to dummy git hash") + } + + return "master" +} diff --git a/Source/Android/build.gradle b/Source/Android/build.gradle deleted file mode 100644 index e8343673c7..0000000000 --- a/Source/Android/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -plugins { - id 'com.android.application' version '8.0.2' apply false - id 'com.android.library' version '8.0.2' apply false - id 'org.jetbrains.kotlin.android' version '1.8.21' apply false -} diff --git a/Source/Android/build.gradle.kts b/Source/Android/build.gradle.kts new file mode 100644 index 0000000000..5a40522457 --- /dev/null +++ b/Source/Android/build.gradle.kts @@ -0,0 +1,12 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id("com.android.application") version "8.0.2" apply false + id("com.android.library") version "8.0.2" apply false + id("org.jetbrains.kotlin.android") version "1.8.21" apply false +} + +buildscript { + repositories { + google() + } +} diff --git a/Source/Android/settings.gradle b/Source/Android/settings.gradle.kts similarity index 85% rename from Source/Android/settings.gradle rename to Source/Android/settings.gradle.kts index 698c7c15b2..1fb82df416 100644 --- a/Source/Android/settings.gradle +++ b/Source/Android/settings.gradle.kts @@ -5,6 +5,8 @@ pluginManagement { mavenCentral() } } + +@Suppress("UnstableApiUsage") dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { @@ -12,5 +14,5 @@ dependencyResolutionManagement { mavenCentral() } } -include ':app' -include ':benchmark' + +include(":app")