Skip to content

Gradleビルド時のNullPointerExceptionエラー解決

問題の詳細

Androidプロジェクトのビルド中に以下のエラーが発生:

log
> Could not resolve all files for configuration ':MyPlugin:debugRuntimeClasspath'
   > Failed to transform commons-lang3-3.14.0.jar
      > Execution failed for DexingNoClasspathTransform
         > Error while dexing.
java.lang.NullPointerException: Cannot invoke "String.length()" because "<parameter1>" is null

このエラーは以下が共通点として報告されています:

  • プロジェクトのコード変更なしに突然発生
  • ./gradlew clean やキャッシュ削除で解決しない
  • Gradle 7.5で発生するがGradle 8では正常動作
  • 複数のプロジェクトで再現可能

主な原因と解決策

1. JDKの互換性問題

特定のJDKバージョンで発生する既知の問題です。特にJDK 21が原因となるケースが多いです。

Android Studioでの設定変更

  1. Settings > Build, Execution, Deployment > Build Tools > Gradle
  2. Gradle JDKJDK 17に変更
  3. 再ビルドを実行

注意

コマンドラインからビルドする場合、環境変数JAVA_HOMEがJDK 17を指しているか確認:

bash
export JAVA_HOME=/path/to/jdk-17
./gradlew clean build

2. GradleとAGPのバージョン不一致

Android Gradle Plugin(AGP)とGradleバージョンの非互換が原因となるケース。

推奨組み合わせ:

  • AGP 8.3.1 + Gradle 8.4

build.gradle の更新例:

groovy
// プロジェクトレベルのbuild.gradle
plugins {
    id 'com.android.application' version '8.3.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.9.0' apply false
}

gradle-wrapper.properties の更新:

properties
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip

Android Studioのアップグレード支援機能

Tools > AGP Upgrade Assistant を使用すると安全に更新可能

3. 依存ライブラリのバージョン問題

特定ライブラリのバージョンで発生するケースがあります。

修正例1:問題のあるライブラリのバージョンチェンジ

diff
dependencies {
-    implementation 'org.apache.commons:commons-lang3:3.14.0'
+    implementation 'org.apache.commons:commons-lang3:3.13.0'
}

修正例2:動的バージョンの禁止

+ 記法は最新バージョンへの自動更新を許可するため危険:

diff
dependencies {
-    implementation 'androidx.core:core-ktx:+'
+    implementation 'androidx.core:core-ktx:1.12.0'
}

修正例3:プラグインとライブラリのバージョン整合

互換性のない組み合わせを回避:

groovy
plugins {
    id 'com.android.application'
-    id 'org.jetbrains.kotlin.android' version '1.7.20'
+    id 'org.jetbrains.kotlin.android' version '1.9.0'
}

dependencies {
    // 1.9.0との互換性があるバージョンを使用
    implementation 'androidx.core:core-ktx:1.12.0'
}

フレームワーク別追加対策

Flutterプロジェクトの場合

pubspec.yaml の依存関係指定で any を使用していると発生する場合があります:

diff
dependencies:
  flutter:
    sdk: flutter
-  camera: any
+  camera: ^0.10.5+2  // 明示的なバージョン指定

根本原因と予防策

  • 本質的な原因:GradleのDexingプロセス中のNullPointerException
  • 共通要因:最近のライブラリがJava 21機能に依存しているのに、古いGradleが正しく処理できない
  • 再発防止
    1. 定期的なGradle/AGP更新
    2. 動的バージョン(+)の禁止
    3. CI環境におけるJDKバージョンの固定

まとめ

「String.length()がnull」エラーの本質的な解決には以下が有効:

  1. JDK 17へのダウングレード
  2. AGP 8.3.1 + Gradle 8.4の使用
  3. 依存ライブラリのバージョン固定

環境変更がない場合でも外部依存ライブラリの更新が原因となるため、依存バージョンの固定は重要なベストプラクティスです。問題解決後はAndroid公式互換性チェッカーで環境整合を確認しましょう。