Skip to content

Resolving "minCompileSdk (31) specified in dependency's AAR metadata" error

Problem Overview

The error "The minCompileSdk (31) specified in a dependency's AAR metadata is greater than this module's compileSdkVersion (android-30)" occurs when your Android project uses a library that requires API level 31 (Android 12) but your project is configured to compile against an older SDK version.

This error commonly appears with libraries like:

  • androidx.core:core-ktx:1.7.0-alpha02 and newer versions
  • androidx.lifecycle:lifecycle-livedata:2.4.0-beta01
  • androidx.navigation:navigation-compose:2.4.0-alpha07

Primary Solution: Update compileSdkVersion

The recommended and most straightforward solution is to update your project's compileSdkVersion to 31:

kotlin
android {
    compileSdk 31
    
    defaultConfig {
        // Other configuration
        targetSdk 31 // Optional but recommended
    }
    
    // ...
}

For Java-based projects using the older syntax:

groovy
android {
    compileSdkVersion 31
    
    defaultConfig {
        // Other configuration
        targetSdkVersion 31 // Optional but recommended
    }
    
    // ...
}

TIP

Updating compileSdkVersion doesn't affect your app's runtime behavior or require immediate changes to targetSdkVersion. It simply allows your code to compile against the newer API level.

Alternative Solutions

1. Downgrade Problematic Dependencies

If updating compileSdkVersion isn't immediately feasible, you can downgrade to stable library versions:

groovy
// Instead of:
implementation "androidx.core:core-ktx:1.7.0-alpha02"
// Use:
implementation "androidx.core:core-ktx:1.6.0"

// Instead of:
implementation "androidx.lifecycle:lifecycle-livedata:2.4.0-beta01"
// Use:
implementation "androidx.lifecycle:lifecycle-livedata:2.3.1"

// Instead of:
implementation "androidx.navigation:navigation-compose:2.4.0-alpha07"
// Use:
implementation "androidx.navigation:navigation-compose:2.4.0-alpha06"

2. Force Specific Dependency Versions

Use Gradle's resolution strategy to force a specific version across all dependencies:

groovy
configurations.all {
    resolutionStrategy { 
        // For Kotlin projects
        force 'androidx.core:core-ktx:1.6.0'
        
        // For Java projects
        force 'androidx.core:core:1.6.0'
    }
}

Place this code in your app-level build.gradle file, above the android {} block.

3. Fix Version Specifiers

Avoid using dynamic version specifiers (+) that automatically pick the latest version:

groovy
// Problematic:
implementation "androidx.core:core-ktx:+"

// Solution:
implementation "androidx.core:core-ktx:1.6.0"

Best Practices

  1. Regularly update dependencies: Keep your libraries current to benefit from security patches and performance improvements
  2. Use explicit versions: Avoid dynamic version specifiers to prevent unexpected breaking changes
  3. Stay current with SDK versions: Plan regular updates to your compileSdkVersion and targetSdkVersion
  4. Test thoroughly: After updating SDK versions or dependencies, thoroughly test your app to catch any compatibility issues

When to Use Each Approach

  • Update compileSdkVersion: Recommended long-term solution for new projects and maintained applications
  • Downgrade dependencies: Temporary fix for legacy projects that can't immediately update SDK versions
  • Force versions: Emergency workaround for complex projects with conflicting dependencies

For most projects, updating compileSdkVersion to 31 is the optimal solution as it ensures compatibility with the latest Android features and libraries while maintaining backward compatibility with older Android versions.