dolphin/Source/Android/app/build.gradle.kts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

226 lines
7.3 KiB
Plaintext
Raw Normal View History

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
kotlin("plugin.serialization") version "1.8.21"
id("androidx.baselineprofile")
}
@Suppress("UnstableApiUsage")
android {
2023-09-18 20:04:44 +00:00
compileSdkVersion = "android-34"
2024-07-30 16:24:48 +00:00
ndkVersion = "27.0.12077973"
buildFeatures {
viewBinding = true
2024-05-26 02:13:25 +00:00
buildConfig = 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
2023-09-18 20:04:44 +00:00
targetSdk = 34
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"
// Uncomment the line below if you don't want to build the C++ unit tests
//targets("main", "hook_impl", "main_hook", "gsl_alloc_hook", "file_redirect_hook")
}
}
}
packaging {
jniLibs.useLegacyPackaging = true
}
}
dependencies {
2024-05-26 02:13:25 +00:00
baselineProfile(project(":benchmark"))
2023-09-18 19:56:28 +00:00
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4")
2024-04-20 15:53:11 +00:00
implementation("androidx.core:core-ktx:1.13.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.cardview:cardview:1.0.0")
2023-09-18 19:56:28 +00:00
implementation("androidx.recyclerview:recyclerview:1.3.2")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
2023-09-18 19:56:28 +00:00
implementation("androidx.fragment:fragment-ktx:1.6.2")
implementation("androidx.slidingpanelayout:slidingpanelayout:1.2.0")
2024-04-20 15:53:11 +00:00
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.core:core-splashscreen:1.0.1")
2023-09-18 19:56:28 +00:00
implementation("androidx.preference:preference-ktx:1.2.1")
implementation("androidx.profileinstaller:profileinstaller:1.3.1")
// Kotlin extensions for lifecycle components
2024-04-20 15:53:11 +00:00
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
// 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
2024-04-20 15:53:11 +00:00
implementation("io.coil-kt:coil:2.6.0")
// For loading custom GPU drivers
2024-04-20 15:53:11 +00:00
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
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 {
Android: Adopt a new versionCode scheme Right now, we assign a versionCode to each Android build of Dolphin by counting the total number of git commits made. This has worked fine so far, but it won't work as-is for the new release process. Let's say we're currently on commit 20000. If we want to create a release under the new release process, we would create a release branch, add a new commit on it that updates the release name in CMake files and so on, and create a tag for that commit. The Android build of this release commit would get the version code 20001. However, the master branch is also going to get a commit with the version code 20001 sooner or later, and this commit would be an entirely different commit than commit 20001 on the release branch. This isn't much of a problem for people downloading Dolphin from dolphin-emu.org, but it's a big problem for Google Play, as Google Play doesn't allow us to upload two builds with the same version code. This commit makes us calculate the Android version code in a new way: The number of commits times two, and if the current build isn't a release build, plus 1. (We check whether the current build is a release build by checking whether there's a tag for the current commit.) With this new version code scheme, the release commit described in my example would get the version code 40002, and the master commit would get the version code 40003. This lets us upload both corresponding builds to Google Play, and also lets the user switch from the release build to the development build if they would like to. (Under normal circumstances, Android forbids installing a build with an older version code than the currently installed build. Therefore, whether the 1 is added for release builds or for development builds is a decision with consequences.)
2024-06-01 15:36:20 +00:00
val commitCount = 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()
)
Android: Adopt a new versionCode scheme Right now, we assign a versionCode to each Android build of Dolphin by counting the total number of git commits made. This has worked fine so far, but it won't work as-is for the new release process. Let's say we're currently on commit 20000. If we want to create a release under the new release process, we would create a release branch, add a new commit on it that updates the release name in CMake files and so on, and create a tag for that commit. The Android build of this release commit would get the version code 20001. However, the master branch is also going to get a commit with the version code 20001 sooner or later, and this commit would be an entirely different commit than commit 20001 on the release branch. This isn't much of a problem for people downloading Dolphin from dolphin-emu.org, but it's a big problem for Google Play, as Google Play doesn't allow us to upload two builds with the same version code. This commit makes us calculate the Android version code in a new way: The number of commits times two, and if the current build isn't a release build, plus 1. (We check whether the current build is a release build by checking whether there's a tag for the current commit.) With this new version code scheme, the release commit described in my example would get the version code 40002, and the master commit would get the version code 40003. This lets us upload both corresponding builds to Google Play, and also lets the user switch from the release build to the development build if they would like to. (Under normal circumstances, Android forbids installing a build with an older version code than the currently installed build. Therefore, whether the 1 is added for release builds or for development builds is a decision with consequences.)
2024-06-01 15:36:20 +00:00
val isRelease = ProcessBuilder("git", "describe", "--exact-match", "HEAD")
.directory(project.rootDir)
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.redirectError(ProcessBuilder.Redirect.PIPE)
.start()
.waitFor() == 0
return commitCount * 2 + (if (isRelease) 0 else 1)
} 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"
}