Flutter项目:app模块build.gradle空指针异常排查求助
构建Flutter应用时Build.Gradle空指针异常排查与解决
报错信息
以调试模式启动lib\main.dart到sdk gphone64 x86 64...
执行Gradle任务'assembleDebug'...FAILURE: 构建因异常失败。
位置:构建文件'C:\Users\mateu\StudioProjects\Coquinha\android\app\build.gradle'第66行
错误原因:评估:app项目时出现问题。
java.lang.NullPointerException(无错误信息)
尝试方案:
使用--stacktrace选项获取堆栈跟踪;
使用--info或--debug选项获取更多日志输出;
使用--scan选项获取完整分析信息。更多帮助:https://help.gradle.org
构建耗时2s失败,异常:Gradle任务assembleDebug退出码为1
完整Build.Gradle代码
def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { compileSdkVersion flutter.compileSdkVersion ndkVersion flutter.ndkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.coquinha" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName } signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties ['storeFile'] ? file(keystoreProperties[storeFile]) : null storePassword keystoreProperties['storePassword'] } } 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 signingConfig signingConfigs.release } } } flutter { source '../..' } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" }
问题代码片段
signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties ['storeFile'] ? file(keystoreProperties[storeFile]) : null storePassword keystoreProperties['storePassword'] } }
错误分析与修复
直接错误点
空指针异常由storeFile行的两处语法错误导致:
keystoreProperties ['storeFile']中键名前多了空格,导致Gradle无法正确解析属性访问,应改为keystoreProperties['storeFile']file(keystoreProperties[storeFile])中storeFile未加引号,被Gradle当作变量而非字符串键,应改为keystoreProperties['storeFile']
修正后的代码片段
signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } }
额外优化
若key.properties文件不存在,keystoreProperties中的所有属性都会是null,即使修复语法,调试模式下仍可能因release签名配置无效引发问题。建议将release签名配置逻辑包裹在文件存在判断中,确保调试时使用默认debug签名:
def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { // ... 其他配置保持不变 ... signingConfigs { release { if (keystorePropertiesFile.exists()) { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } } buildTypes { release { signingConfig keystorePropertiesFile.exists() ? signingConfigs.release : signingConfigs.debug } } }
内容的提问来源于stack exchange,提问作者Mateus Vitor
相关产品推荐
相关产品推荐

