Gradleビルド時のNullPointerExceptionエラー解決
問題の詳細
Androidプロジェクトのビルド中に以下のエラーが発生:
> 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での設定変更
Settings
>Build, Execution, Deployment
>Build Tools
>Gradle
Gradle JDK
を JDK 17に変更- 再ビルドを実行
注意
コマンドラインからビルドする場合、環境変数JAVA_HOME
がJDK 17を指しているか確認:
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 の更新例:
// プロジェクトレベルの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 の更新:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
Android Studioのアップグレード支援機能
Tools
> AGP Upgrade Assistant
を使用すると安全に更新可能
3. 依存ライブラリのバージョン問題
特定ライブラリのバージョンで発生するケースがあります。
修正例1:問題のあるライブラリのバージョンチェンジ
dependencies {
- implementation 'org.apache.commons:commons-lang3:3.14.0'
+ implementation 'org.apache.commons:commons-lang3:3.13.0'
}
修正例2:動的バージョンの禁止
+
記法は最新バージョンへの自動更新を許可するため危険:
dependencies {
- implementation 'androidx.core:core-ktx:+'
+ implementation 'androidx.core:core-ktx:1.12.0'
}
修正例3:プラグインとライブラリのバージョン整合
互換性のない組み合わせを回避:
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
を使用していると発生する場合があります:
dependencies:
flutter:
sdk: flutter
- camera: any
+ camera: ^0.10.5+2 // 明示的なバージョン指定
根本原因と予防策
- 本質的な原因:GradleのDexingプロセス中のNullPointerException
- 共通要因:最近のライブラリがJava 21機能に依存しているのに、古いGradleが正しく処理できない
- 再発防止:
- 定期的なGradle/AGP更新
- 動的バージョン(
+
)の禁止 - CI環境におけるJDKバージョンの固定
まとめ
「String.length()がnull」エラーの本質的な解決には以下が有効:
- JDK 17へのダウングレード
- AGP 8.3.1 + Gradle 8.4の使用
- 依存ライブラリのバージョン固定
環境変更がない場合でも外部依存ライブラリの更新が原因となるため、依存バージョンの固定は重要なベストプラクティスです。問題解決後はAndroid公式互換性チェッカーで環境整合を確認しましょう。