plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } 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.1.8937393" viewBinding.enabled = true compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true sourceCompatibility = "11" targetCompatibility = "11" } kotlinOptions { jvmTarget = '11' } 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 { // TODO If this is ever modified, change application_id in strings.xml 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 } 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 { // TODO If this is ever modified, change application_id in debug/strings.xml applicationIdSuffix ".debug" versionNameSuffix '-debug' jniDebuggable true } 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" } } 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" } } } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.0' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.0' implementation 'androidx.exifinterface:exifinterface:1.3.5' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1' implementation 'androidx.fragment:fragment:1.5.5' implementation 'androidx.slidingpanelayout:slidingpanelayout:1.2.0' implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.core:core-splashscreen:1.0.0' implementation 'androidx.preference:preference:1.2.0' implementation 'androidx.profileinstaller:profileinstaller:1.2.2' // Kotlin extensions for lifecycle components implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.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' 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' }