2019-09-03 02:31:51 +02:00
// Gradle build config for Godot Engine's Android port.
2022-05-31 20:10:15 +02:00
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
apply from: 'config.gradle'
2019-09-03 02:31:51 +02:00
allprojects {
repositories {
google ( )
2021-06-24 08:49:18 +02:00
mavenCentral ( )
2024-01-17 22:44:11 +01:00
gradlePluginPortal ( )
maven { url "https://plugins.gradle.org/m2/" }
2024-04-20 19:24:11 +02:00
maven { url "https://s01.oss.sonatype.org/content/repositories/snapshots/" }
2020-04-24 09:45:14 +02:00
// Godot user plugins custom maven repos
String [ ] mavenRepos = getGodotPluginsMavenRepos ( )
if ( mavenRepos ! = null & & mavenRepos . size ( ) > 0 ) {
for ( String repoUrl : mavenRepos ) {
maven {
url repoUrl
}
}
}
2019-09-03 02:31:51 +02:00
}
}
2021-06-25 15:45:16 +02:00
configurations {
// Initializes a placeholder for the devImplementation dependency configuration.
devImplementation { }
2024-02-09 17:26:53 +01:00
// Initializes a placeholder for the monoImplementation dependency configuration.
monoImplementation { }
2021-06-25 15:45:16 +02:00
}
2019-09-03 02:31:51 +02:00
dependencies {
2024-01-17 22:44:11 +01:00
implementation "androidx.fragment:fragment:$versions.fragmentVersion"
2024-06-10 02:02:03 +02:00
implementation "androidx.core:core-splashscreen:$versions.splashscreenVersion"
2020-01-27 18:56:27 +01:00
2019-09-03 02:31:51 +02:00
if ( rootProject . findProject ( ":lib" ) ) {
implementation project ( ":lib" )
2019-10-18 18:59:04 +02:00
} else if ( rootProject . findProject ( ":godot:lib" ) ) {
implementation project ( ":godot:lib" )
2019-09-03 02:31:51 +02:00
} else {
2023-02-02 00:17:06 +01:00
// Godot gradle build mode. In this scenario this project is the only one around and the Godot
2019-09-03 02:31:51 +02:00
// library is available through the pre-generated godot-lib.*.aar android archive files.
2024-02-09 17:26:53 +01:00
debugImplementation fileTree ( dir: 'libs/debug' , include: [ '**/*.jar' , '*.aar' ] )
devImplementation fileTree ( dir: 'libs/dev' , include: [ '**/*.jar' , '*.aar' ] )
releaseImplementation fileTree ( dir: 'libs/release' , include: [ '**/*.jar' , '*.aar' ] )
2019-09-03 02:31:51 +02:00
}
2019-10-18 18:59:04 +02:00
2020-04-24 09:45:14 +02:00
// Godot user plugins remote dependencies
String [ ] remoteDeps = getGodotPluginsRemoteBinaries ( )
if ( remoteDeps ! = null & & remoteDeps . size ( ) > 0 ) {
for ( String dep : remoteDeps ) {
implementation dep
}
}
2019-10-18 18:59:04 +02:00
2020-04-24 09:45:14 +02:00
// Godot user plugins local dependencies
String [ ] pluginsBinaries = getGodotPluginsLocalBinaries ( )
if ( pluginsBinaries ! = null & & pluginsBinaries . size ( ) > 0 ) {
implementation files ( pluginsBinaries )
2019-10-18 18:59:04 +02:00
}
2024-02-09 17:26:53 +01:00
2024-09-27 00:12:25 +02:00
// Automatically pick up local dependencies in res://addons
String addonsDirectory = getAddonsDirectory ( )
if ( addonsDirectory ! = null & & ! addonsDirectory . isBlank ( ) ) {
implementation fileTree ( dir: "$addonsDirectory" , include: [ '*.jar' , '*.aar' ] )
}
2024-02-09 17:26:53 +01:00
// .NET dependencies
String jar = '../../../../modules/mono/thirdparty/libSystem.Security.Cryptography.Native.Android.jar'
if ( file ( jar ) . exists ( ) ) {
monoImplementation files ( jar )
}
2019-09-03 02:31:51 +02:00
}
android {
compileSdkVersion versions . compileSdk
buildToolsVersion versions . buildTools
2021-06-25 15:45:16 +02:00
ndkVersion versions . ndkVersion
2019-09-03 02:31:51 +02:00
2020-03-23 17:41:16 +01:00
compileOptions {
2020-10-29 00:32:45 +01:00
sourceCompatibility versions . javaVersion
targetCompatibility versions . javaVersion
2020-03-23 17:41:16 +01:00
}
2022-05-31 20:10:15 +02:00
kotlinOptions {
jvmTarget = versions . javaVersion
}
2021-09-10 04:55:42 +02:00
assetPacks = [ ":assetPacks:installTime" ]
2024-01-17 22:44:11 +01:00
namespace = 'com.godot.game'
2019-09-03 02:31:51 +02:00
defaultConfig {
2020-05-25 21:03:35 +02:00
// The default ignore pattern for the 'assets' directory includes hidden files and directories which are used by Godot projects.
aaptOptions {
2021-03-10 09:14:57 +01:00
ignoreAssetsPattern "!.svn:!.git:!.gitignore:!.ds_store:!*.scc:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"
2020-05-25 21:03:35 +02:00
}
2020-07-31 22:48:08 +02:00
ndk {
String [ ] export_abi_list = getExportEnabledABIs ( )
abiFilters export_abi_list
}
2021-02-24 12:49:00 +01:00
manifestPlaceholders = [ godotEditorVersion: getGodotEditorVersion ( ) ]
2019-09-03 02:31:51 +02:00
// Feel free to modify the application id to your own.
2019-12-13 01:52:57 +01:00
applicationId getExportPackageName ( )
2020-07-23 18:16:03 +02:00
versionCode getExportVersionCode ( )
versionName getExportVersionName ( )
2021-12-07 23:38:33 +01:00
minSdkVersion getExportMinSdkVersion ( )
targetSdkVersion getExportTargetSdkVersion ( )
2021-06-25 15:45:16 +02:00
missingDimensionStrategy 'products' , 'template'
2019-09-03 02:31:51 +02:00
}
lintOptions {
abortOnError false
disable 'MissingTranslation' , 'UnusedResources'
}
2021-01-05 22:40:42 +01:00
ndkVersion versions . ndkVersion
2019-09-03 02:31:51 +02:00
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
2020-04-23 09:21:39 +02:00
2021-03-10 09:14:57 +01:00
// 'doNotStrip' is enabled for development within Android Studio
if ( shouldNotStrip ( ) ) {
doNotStrip '**/*.so'
}
2024-02-16 02:43:32 +01:00
jniLibs {
// Setting this to true causes AGP to package compressed native libraries when building the app
// For more background, see:
// - https://developer.android.com/build/releases/past-releases/agp-3-6-0-release-notes#extractNativeLibs
// - https://stackoverflow.com/a/44704840
useLegacyPackaging shouldUseLegacyPackaging ( )
}
2024-05-29 23:37:36 +02:00
// Always select Godot's version of libc++_shared.so in case deps have their own
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
2019-09-03 02:31:51 +02:00
}
2020-11-21 23:09:33 +01:00
signingConfigs {
2021-06-07 18:19:18 +02:00
debug {
if ( hasCustomDebugKeystore ( ) ) {
storeFile new File ( getDebugKeystoreFile ( ) )
storePassword getDebugKeystorePassword ( )
keyAlias getDebugKeyAlias ( )
keyPassword getDebugKeystorePassword ( )
}
}
2020-11-21 23:09:33 +01:00
release {
File keystoreFile = new File ( getReleaseKeystoreFile ( ) )
if ( keystoreFile . isFile ( ) ) {
storeFile keystoreFile
storePassword getReleaseKeystorePassword ( )
keyAlias getReleaseKeyAlias ( )
keyPassword getReleaseKeystorePassword ( )
}
}
}
2024-02-09 17:26:53 +01:00
buildFeatures {
buildConfig = true
}
2020-11-21 23:09:33 +01:00
buildTypes {
debug {
// Signing and zip-aligning are skipped for prebuilt builds, but
2023-02-02 00:17:06 +01:00
// performed for Godot gradle builds.
2020-11-21 23:09:33 +01:00
zipAlignEnabled shouldZipAlign ( )
if ( shouldSign ( ) ) {
signingConfig signingConfigs . debug
} else {
signingConfig null
}
}
2021-06-25 15:45:16 +02:00
dev {
initWith debug
// Signing and zip-aligning are skipped for prebuilt builds, but
2023-02-02 00:17:06 +01:00
// performed for Godot gradle builds.
2021-06-25 15:45:16 +02:00
zipAlignEnabled shouldZipAlign ( )
if ( shouldSign ( ) ) {
signingConfig signingConfigs . debug
} else {
signingConfig null
}
}
2020-11-21 23:09:33 +01:00
release {
// Signing and zip-aligning are skipped for prebuilt builds, but
2023-02-02 00:17:06 +01:00
// performed for Godot gradle builds.
2020-11-21 23:09:33 +01:00
zipAlignEnabled shouldZipAlign ( )
if ( shouldSign ( ) ) {
signingConfig signingConfigs . release
} else {
signingConfig null
}
}
2019-09-03 02:31:51 +02:00
}
2024-02-09 17:26:53 +01:00
flavorDimensions 'edition'
productFlavors {
standard { }
mono { }
}
2019-09-03 02:31:51 +02:00
sourceSets {
main {
manifest . srcFile 'AndroidManifest.xml'
2019-10-18 18:59:04 +02:00
java . srcDirs = [ 'src' ]
res . srcDirs = [ 'res' ]
aidl . srcDirs = [ 'aidl' ]
assets . srcDirs = [ 'assets' ]
2019-09-03 02:31:51 +02:00
}
2021-03-22 18:38:25 +01:00
debug . jniLibs . srcDirs = [ 'libs/debug' , 'libs/debug/vulkan_validation_layers' ]
2021-06-25 15:45:16 +02:00
dev . jniLibs . srcDirs = [ 'libs/dev' ]
2019-10-18 18:59:04 +02:00
release . jniLibs . srcDirs = [ 'libs/release' ]
2019-09-03 02:31:51 +02:00
}
applicationVariants . all { variant - >
variant . outputs . all { output - >
2024-02-09 17:26:53 +01:00
String filenameSuffix = variant . flavorName = = "mono" ? variant . name : variant . buildType . name
output . outputFileName = "android_${filenameSuffix}.apk"
2019-09-03 02:31:51 +02:00
}
}
}
2020-07-31 22:48:08 +02:00
2024-04-30 23:09:24 +02:00
task copyAndRenameBinary ( type: Copy ) {
2024-04-17 16:43:21 +02:00
// The 'doNotTrackState' is added to disable gradle's up-to-date checks for output files
// and directories. Otherwise this check may cause permissions access failures on Windows
// machines.
doNotTrackState ( "No need for up-to-date checks for the copy-and-rename operation" )
2024-04-30 23:09:24 +02:00
String exportPath = getExportPath ( )
String exportFilename = getExportFilename ( )
2024-02-09 17:26:53 +01:00
String exportEdition = getExportEdition ( )
2024-04-30 23:09:24 +02:00
String exportBuildType = getExportBuildType ( )
2024-02-09 17:26:53 +01:00
String exportBuildTypeCapitalized = exportBuildType . capitalize ( )
2024-04-30 23:09:24 +02:00
String exportFormat = getExportFormat ( )
2020-07-31 22:48:08 +02:00
2024-04-30 23:09:24 +02:00
boolean isAab = exportFormat = = "aab"
2024-02-09 17:26:53 +01:00
boolean isMono = exportEdition = = "mono"
String filenameSuffix = exportBuildType
if ( isMono ) {
filenameSuffix = isAab ? "${exportEdition}-${exportBuildType}" : "${exportEdition}${exportBuildTypeCapitalized}"
}
String sourceFilename = isAab ? "build-${filenameSuffix}.aab" : "android_${filenameSuffix}.apk"
String sourceFilepath = isAab ? "$buildDir/outputs/bundle/${exportEdition}${exportBuildTypeCapitalized}/$sourceFilename" : "$buildDir/outputs/apk/$exportEdition/$exportBuildType/$sourceFilename"
2024-04-17 16:43:21 +02:00
2024-04-30 23:09:24 +02:00
from sourceFilepath
into exportPath
rename sourceFilename , exportFilename
2020-07-31 22:48:08 +02:00
}
2023-12-21 09:13:16 +01:00
/ * *
* Used to validate the version of the Java SDK used for the Godot gradle builds .
* /
task validateJavaVersion {
if ( JavaVersion . current ( ) ! = versions . javaVersion ) {
throw new GradleException ( "Invalid Java version ${JavaVersion.current()}. Version ${versions.javaVersion} is the required Java version for Godot gradle builds." )
}
}
2024-01-17 22:44:11 +01:00
/ *
When they 're scheduled to run, the copy*AARToAppModule tasks generate dependencies for the ' app '
module , so we 're ensuring the ' : app: preBuild ' task is set to run after those tasks .
* /
if ( rootProject . tasks . findByPath ( "copyDebugAARToAppModule" ) ! = null ) {
preBuild . mustRunAfter ( rootProject . tasks . named ( "copyDebugAARToAppModule" ) )
}
if ( rootProject . tasks . findByPath ( "copyDevAARToAppModule" ) ! = null ) {
preBuild . mustRunAfter ( rootProject . tasks . named ( "copyDevAARToAppModule" ) )
}
if ( rootProject . tasks . findByPath ( "copyReleaseAARToAppModule" ) ! = null ) {
preBuild . mustRunAfter ( rootProject . tasks . named ( "copyReleaseAARToAppModule" ) )
}