Flutter使用url_launcher插件时出现D8空指针编译错误
问题描述
我在Flutter项目中使用url_launcher插件时遇到构建错误。为保证版本兼容性,我在pubspec.yml中将依赖版本设为any:
dependencies: url_launcher: any
在Android目录下执行./gradlew clean build时Gradle构建成功,但在Android模拟器上运行Flutter项目时失败,控制台报错如下:
ERROR:D:\Workspace\Projects\trip\build\url_launcher_android\intermediates\runtime_library_classes_jar\debug\classes.jar: D8: java.lang.NullPointerException FAILURE: Build failed with an exception. * 出错原因: 任务':app:mergeLibDexDebug'执行失败。 > 无法解析配置':app:debugRuntimeClasspath'的所有文件。 > 转换classes.jar(项目:url_launcher_android)失败... > DexingWithClasspathTransform执行失败: ...\classes.jar. > 转换dex文件时出错。 * 尝试方案:(Gradle故障排除步骤) ... BUILD FAILED in 1s Error: Gradle task assembleDebug failed with exit code 1
版本信息
- Flutter 3.22.0
- Gradle 8.2.1
- Android SDK 35
关键观察
- 在Android目录下执行
./gradlew clean build构建成功,但运行Flutter项目时失败 - D8 dex转换阶段出现NullPointerException
- 错误仅发生在
url_launcher_android模块
相关配置文件内容
android/build.gradle
allprojects { repositories { google() mavenCentral() } } rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { project.evaluationDependsOn(":app") } tasks.register("clean", Delete) { delete rootProject.buildDir }
android/app/build.gradle
plugins { id "com.android.application" id "kotlin-android" // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" } def localProperties = new Properties() def localPropertiesFile = rootProject.file("local.properties") if (localPropertiesFile.exists()) { localPropertiesFile.withReader("UTF-8") { reader -> localProperties.load(reader) } } def flutterVersionCode = localProperties.getProperty("flutter.versionCode") if (flutterVersionCode == null) { flutterVersionCode = "1" } def flutterVersionName = localProperties.getProperty("flutter.versionName") if (flutterVersionName == null) { flutterVersionName = "1.0" } android { namespace = "com.example.trip" compileSdk = flutter.compileSdkVersion ndkVersion = flutter.ndkVersion compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "com.example.trip" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutterVersionCode.toInteger() versionName = flutterVersionName } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. signingConfig = signingConfigs.debug } } } flutter { source = "../.." }
gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip
解决方案
锁定
url_launcher兼容版本
使用any会拉取最新版本,可能与当前Flutter/Gradle版本不兼容。修改pubspec.yml指定兼容版本:dependencies: url_launcher: ^6.2.5执行
flutter pub get更新依赖。调整Gradle编译选项
在android/app/build.gradle的android块中添加D8配置,避免空指针:android { // ... 原有代码 dexOptions { javaMaxHeapSize "4g" preDexLibraries = false } // ... 原有代码 }修复构建目录配置冲突
现有构建目录配置可能与Flutter构建流程冲突,注释或移除android/build.gradle中以下代码:// rootProject.buildDir = "../build" // subprojects { // project.buildDir = "${rootProject.buildDir}/${project.name}" // }彻底清理并重新构建
执行以下命令清除缓存后重新构建:flutter clean rm -rf android/.gradle rm -rf ~/.gradle/caches flutter pub get flutter run
内容的提问来源于stack exchange,提问作者Mingtiao Shiqi
相关产品推荐
相关产品推荐

