如何在LibGDX项目中添加Android Library模块?解决Gradle报错
在LibGDX项目中添加Android Library模块的解决方案
问题背景
用gdx-liftoff创建带Android模块(Kotlin-libktx)的LibGDX应用,尝试添加Android Library模块时触发报错:Cannot add extension with name 'kotlin', as there is an extension already registered with that name。修改build.gradle后报错类型变化,但核心问题未解决。需创建带Android依赖的模块,Java/Kotlin Library模块可正常工作,但Android Library模块无法构建。
错误根源
根build.gradle中重复且错误的插件配置导致冲突:
- 两次使用
configure(subprojects - project(':xxx')),使得所有子项目(包括Android模块)被强制应用java-library和kotlin插件 - Android插件本身已集成Kotlin支持,重复应用
kotlin插件会引发扩展名冲突 java-library插件与Android插件不兼容,触发后续构建错误
分步解决方案
1. 修复根build.gradle的插件配置
将根目录下的build.gradle中重复的configure块替换为仅针对非Android模块的统一配置,避免Android模块被错误应用Java/Kotlin插件:
buildscript { repositories { mavenCentral() maven { url 'https://s01.oss.sonatype.org' } mavenLocal() google() gradlePluginPortal() maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' } } dependencies { classpath "com.android.tools.build:gradle:$androidPluginVersion" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" constraints { classpath("org.apache.logging.log4j:log4j-core") { version { strictly("[2.18, 3[") prefer("2.18.0") } because("CVE-2021-44228, CVE-2021-45046, CVE-2021-45105: Log4j vulnerable to remote code execution and other critical security vulnerabilities") } } } } allprojects { apply plugin: 'eclipse' apply plugin: 'idea' } // 仅对非Android子项目应用Java/Kotlin插件 configure(subprojects.findAll { !it.name.startsWith('android') }) { apply plugin: 'java-library' apply plugin: 'kotlin' sourceCompatibility = 1.8 compileJava { options.incremental = true } dependencies { constraints { implementation("org.apache.logging.log4j:log4j-core") { version { strictly("[2.18, 3[") prefer("2.18.0") } because("CVE-2021-44228, CVE-2021-45046, CVE-2021-45105: Log4j vulnerable to remote code execution and other critical security vulnerabilities") } } } } subprojects { version = '1.0.0' ext.appName = 'TestLibGDXProject' repositories { mavenCentral() maven { url 'https://s01.oss.sonatype.org' } mavenLocal() gradlePluginPortal() maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' } maven { url 'https://jitpack.io' } } } eclipse.project.name = 'TestLibGDXProject' + '-parent'
2. 调整新Android Library模块(androTest)的build.gradle
将模块类型从Application改为Library,并适配相关配置:
// 替换原Application插件为Library插件 apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { compileSdkVersion 30 sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src/main/java', 'src/main/kotlin'] aidl.srcDirs = ['src/main/java', 'src/main/kotlin'] renderscript.srcDirs = ['src/main/java', 'src/main/kotlin'] res.srcDirs = ['res'] assets.srcDirs = ['../assets'] jniLibs.srcDirs = ['libs'] } } packagingOptions { pickFirst 'META-INF/LICENSE.txt' pickFirst 'META-INF/LICENSE' pickFirst 'META-INF/license.txt' pickFirst 'META-INF/LGPL2.1' pickFirst 'META-INF/NOTICE.txt' pickFirst 'META-INF/NOTICE' pickFirst 'META-INF/notice.txt' exclude 'META-INF/robovm/ios/robovm.xml' exclude 'META-INF/DEPENDENCIES.txt' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/dependencies.txt' } defaultConfig { // Android Library不需要applicationId,删除该行 minSdkVersion 19 targetSdkVersion 30 versionCode 1 versionName "1.0" multiDexEnabled true } compileOptions { sourceCompatibility "1.8" targetCompatibility "1.8" coreLibraryDesugaringEnabled true } kotlinOptions.jvmTarget = "1.8" buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } repositories { google() } configurations { natives } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion" implementation project(':core') natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" constraints { implementation("org.apache.logging.log4j:log4j-core") { version { strictly("[2.18, 3[") prefer("2.18.0") } because("CVE-2021-44228, CVE-2021-45046, CVE-2021-45105: Log4j vulnerable to remote code execution and other critical security vulnerabilities") } } } task copyAndroidNatives() { doFirst { file("libs/armeabi-v7a/").mkdirs() file("libs/arm64-v8a/").mkdirs() file("libs/x86_64/").mkdirs() file("libs/x86/").mkdirs() configurations.getByName("natives").copy().files.each { jar -> def outputDir = null if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a") if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a") if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64") if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86") if(outputDir != null) { copy { from zipTree(jar) into outputDir include "*.so" } } } } } tasks.matching { it.name.contains("merge") && it.name.contains("JniLibFolders") }.configureEach { packageTask -> packageTask.dependsOn 'copyAndroidNatives' } // Android Library不需要run任务,删除或注释该行以下的run任务代码 // task run(type: Exec) { // ... 原run任务代码 ... // } eclipse.project.name = appName + "-androTest"
3. 保留原Android模块配置
原Android模块的build.gradle无需修改,确保其插件为com.android.application和kotlin-android即可。
4. 同步并验证构建
- 点击Android Studio的
Sync Project with Gradle Files按钮同步配置 - 执行
./gradlew clean build命令验证构建是否成功
内容的提问来源于stack exchange,提问作者fram4
相关产品推荐
相关产品推荐

