buildscript{ repositories{ mavenLocal() mavenCentral() google() maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" } } dependencies{ classpath 'com.android.tools.build:gradle:8.2.2' } } apply plugin: "com.android.application" configurations{ natives } repositories{ mavenCentral() maven{ url "https://maven.google.com" } } task deploy(type: Copy){ dependsOn "assembleRelease" from "build/outputs/apk/release/android-release.apk" into "../deploy/" rename("android-release.apk", "${generateDeployName('android')}.apk") } android{ namespace = "io.anuke.mindustry" buildToolsVersion = '34.0.0' compileSdk = 34 sourceSets{ main{ manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets', 'src/main/assets', '../core/assets/'] jniLibs.srcDirs = ['libs'] } androidTest.setRoot('tests') } packagingOptions{ exclude 'META-INF/robovm/ios/robovm.xml' } defaultConfig{ Properties props = loadVersionProps() Integer vcode = props['androidBuildCode']?.toInteger() ?: 1 def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}" applicationId "io.anuke.mindustry" minSdkVersion 14 targetSdkVersion 34 versionName versionNameResult versionCode = vcode if(project.hasProperty("release")){ props['androidBuildCode'] = (vcode + 1).toString() } props.store(file('../core/assets/version.properties').newWriter(), null) multiDexEnabled true } compileOptions{ sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } flavorDimensions = ["google"] signingConfigs{ release{ if(project.hasProperty("RELEASE_STORE_FILE")){ storeFile file(RELEASE_STORE_FILE) storePassword RELEASE_STORE_PASSWORD keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD }else if(System.getenv("CI") == "true"){ storeFile = file("../../bekeystore.jks") storePassword = System.getenv("keystore_password") keyAlias = System.getenv("keystore_alias") keyPassword = System.getenv("keystore_alias_password") }else{ println("No keystore property found. Releases will be unsigned.") } } } buildTypes{ all{ //TODO without these lines (r8 enabled), Mindustry crashes with missing default interface method errors. //WHY THE HELL ARE DEFAULT INTERFACES NOT BEING DESUGARED? WHY DID UPDATING AGP MAKE THIS HAPPEN? //When I ENABLE shrinking, r8 goes and REMOVES ALL DEFAULT INTERFACE CLASSES, which breaks mods. Why? //-keep class mindustry.** { *; } should *keep the classes* - WHY IS R8 REMOVING THEM? minifyEnabled = true shrinkResources = true proguardFiles("proguard-rules.pro") } } if(project.hasProperty("RELEASE_STORE_FILE") || System.getenv("CI") == "true"){ buildTypes{ release{ signingConfig signingConfigs.release } } } } dependencies{ implementation project(":core") implementation arcModule("backends:backend-android") implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3' natives "com.github.Anuken.Arc:natives-android:$arcHash" natives "com.github.Anuken.Arc:natives-freetype-android:$arcHash" def version; def highestVersion; new File((String)findSdkDir(), "/platforms").eachFileMatch ~/android-\d+/, { version = it.name.find(/\d+/).toInteger(); highestVersion = version > highestVersion ? version : highestVersion; } def sdkFile = new File((String)findSdkDir(), "/platforms/android-${highestVersion}/android.jar") if(sdkFile.exists()) compileOnly files(sdkFile.absolutePath) } task copyAndroidNatives(){ configurations.natives.files.each{ jar -> copy{ from zipTree(jar) into file("libs/") include "**" } } } task run(type: Exec){ commandLine "${findSdkDir()}/platform-tools/adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/mindustry.android.AndroidLauncher' } if(!project.ext.hasSprites()){ tasks.whenTaskAdded{ task -> if(task.name == 'assembleDebug' || task.name == 'assembleRelease'){ task.dependsOn ":tools:pack" } } }