Fix Android Resource Linking Failed with Android-35 in Flutter Build
Problem Statement
When building a Flutter app for release (flutter build apk
) with Android API level 35, you encounter the following critical error:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:processReleaseResources'.
> Android resource linking failed
aapt2 E ... Failed to load resources table in APK .../android-35/android.jar
error: failed to load include path .../android-35/android.jar
This issue typically occurs when:
- Using Android Gradle Plugin (AGP) versions below 8.5 with
compileSdk = 35
- Flutter's dependencies conflict with newer Android SDKs
- The SDK file
android.jar
is corrupted or incompatible
The error prevents release builds from completing, preventing app distribution despite debug builds working normally.
Solutions
Primary Solution: Update Android Gradle Plugin and Gradle
This resolves compatibility issues with SDK 35:
- Update Gradle version by editing
android/gradle/wrapper/gradle-wrapper.properties
:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
TIP
Alternatively run this command in Terminal:
./gradlew wrapper --gradle-version=8.9
- Update Android Gradle Plugin in
android/settings.gradle
:
pluginManagement {
plugins {
// ... other plugins
id "com.android.application" version "8.5.0" apply false
}
}
- Finalize Gradle Changes:
flutter clean
flutter pub get
Use Flutter's Built-in SDK Versions
Instead of hardcoding SDK versions, use Flutter's predefined constants in app/build.gradle
:
android {
namespace = "com.example.flutter_application_1"
compileSdk = flutter.compileSdkVersion // Use Flutter's variable
ndkVersion = flutter.ndkVersion
defaultConfig {
minSdk = flutter.minSdkVersion // Auto-updates with Flutter
targetSdk = flutter.targetSdkVersion
}
}
Alternative Solution: Manual Desugering & Configuration
If AGP update isn't possible:
- Set default SDK in
android/app/build.gradle
:
android {
compileSdkVersion 34 // Instead of 35
targetSdkVersion 34
}
- Add temporary fix to
gradle.properties
:
android.aapt2Version=8.6.1-11315950
android.suppressUnsupportedCompileSdk=35
- Enable desugaring for dependencies:
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}
Validate Common Fixes
- Ensure namespace in
app/build.gradle
matches package ID:
android {
namespace = "com.your.package" // Must match AndroidManifest.xml
}
- Remove duplicate package from
AndroidManifest.xml
:
<manifest
~~package="com.your.package"~~ > <!-- Remove if already in build.gradle -->
- Clean project after configuration changes:
flutter clean
flutter build apk --release
Best Practices for Future-Proofing
- Always verify Flutter's AGP compatibility
- Delay
compileSdkVersion
upgrades until Flutter officially supports newer SDKs - Never hardcode SDK versions—use Flutter's variables as shown above
- Maintain consistent versions across:
android.enableJetifier=true
android.useAndroidX=true
WARNING
API level 35 requires AGP 8.5+ to avoid resource linking issues. Using AGP <8.5 with SDK35 will consistently fail due to aapt2 incompatibilities.
Following these solutions ensures reliable Flutter release builds while maintaining Android 14+ compatibility. The primary recommendation is updating AGP to 8.5+ with Gradle 8.9 as it resolves the root cause of resource linking failures.