The inability to accept Android licenses in .NET MAUI on Linux usually stems from missing environment variables or permission issues within the Android SDK directory. Resolving this requires manually running the sdkmanager command with elevated privileges and ensuring the ANDROID_HOME path is correctly exported in your shell profile.
Identifying the License Error
When attempting to build or debug a .NET MAUI application for Android on an Arch Linux system, you may encounter a fatal error indicating that required Android licenses have not been accepted. The compiler typically outputs a message stating that it cannot find accepted licenses for packages likebuild-tools;33.0.0 or platforms;android-33. This blocks the compilation process entirely because the Android build tools refuse to proceed without explicit user agreement to their legal terms.
This issue is particularly common in headless environments or when using Visual Studio Code on Linux, where interactive prompts are not available in the terminal output. Unlike Windows or macOS, Linux users often need to explicitly manage these licenses via the command line interface. The error persists even if you have installed the SDK components correctly, as the acceptance status is stored separately in the SDK root directory.
Locating the Android SDK Path
Before accepting licenses, you must know exactly where your Android SDK is installed. In most standard setups on Arch Linux, the SDK resides in$HOME/Android/Sdk or sometimes in /usr/lib/android-sdk depending on how the android-sdk package was installed via pacman. You can verify this by checking the ANDROID_HOME environment variable.
Run the following command in your terminal:
echo $ANDROID_HOME
If this returns nothing, you likely need to set it up. Add the export line to your ~/.bashrc or ~/.zshrc file. For example:
export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools
After updating your shell configuration, reload it using source ~/.bashrc. If you are using Visual Studio Code, ensure that the integrated terminal inherits these environment variables. Sometimes VS Code runs with a non-login shell, which might not source your profile files correctly. You can test this by opening the terminal inside VS Code and running echo $ANDROID_HOME again to confirm visibility.
Accepting Licenses Manually
The core solution involves using thesdkmanager tool to accept all pending licenses. Navigate to the tools/bin directory of your Android SDK. From there, execute the license acceptance command. Because license files are often owned by root or require write permissions to the SDK directory, you may need to use sudo.
sudo ./sdkmanager --licenses
This command will prompt you to agree to each license one by one. Type y for yes at every prompt. It is crucial to do this for every single package listed, including build tools, platforms, and system images. If you skip any, the build will fail later. On some systems, simply running the command without sudo might work if your user has full ownership of the ~/Android/Sdk directory. However, if you installed the SDK globally via pacman, sudo is mandatory.
Another approach is to pipe y into the command to automate the process, though this is less transparent:
yes | sudo ./sdkmanager --licenses
Verify that the licenses are accepted by listing them:
./sdkmanager --list_sdk
There should be no warnings about unaccepted licenses in the output.
Verifying .NET MAUI Configuration
Once licenses are accepted, you must ensure that .NET MAUI can see them. Run the following command to check the health of your Android setup:dotnet workload install maui
If you previously had errors, you might need to repair the workload:
dotnet workload repair
This step forces the .NET SDK to re-evaluate the Android SDK configuration. It checks for the presence of the platform tools and validates that the licenses are indeed present in the expected location. If the workload repair succeeds without errors, your environment is ready.
For further insights on debugging configurations, you might find Understanding Android Debugging on Rooted Devices useful, as it covers additional runtime permissions that can affect deployment.
Common Pitfalls and Fixes
One frequent mistake is having multiple versions of the Android SDK installed. Ensure thatANDROID_HOME points to the correct one used by your current project. Another issue arises if the java_home is not set correctly. .NET MAUI requires a compatible JDK, usually JDK 17. Set JAVA_HOME to point to your JDK installation.
If you still face issues, clear the NuGet cache and reinstall the workloads:
dotnet nuget locals all --clear
dotnet workload restore
This forces a fresh download of dependencies and re-applies the license checks. Remember that license acceptance is persistent across sessions once written to disk, so you only need to run the sdkmanager --licenses command once per SDK installation unless you delete the SDK folder.
Frequently Asked Questions
Why does sdkmanager ask for sudo?
The Android SDK directory is often owned by root when installed via system package managers like pacman. Accepting licenses writes files to this directory, requiring elevated permissions. If you installed the SDK in your home directory, sudo is usually not needed.
Can I accept licenses automatically without typing y?
Yes, you can pipe the letter 'y' into the sdkmanager command using the yes utility. This automates the acceptance process for all licenses, saving time during CI/CD pipelines or fresh machine setups.
What if dotnet workload repair fails after accepting licenses?
This often indicates a mismatch between the Java version and the Android SDK. Ensure you have JDK 17 installed and that JAVA_HOME is correctly set. Also, verify that your Android API levels match those specified in your .csproj file.
Do I need to accept licenses for every new project?
No, license acceptance is tied to the Android SDK installation, not individual projects. Once accepted for the SDK located at ANDROID_HOME, all .NET MAUI projects on that machine can access the licensed components.
How do I check which licenses are currently accepted?
You can list the contents of the $ANDROID_HOME/licenses directory. Each accepted license appears as a file named after the package ID. If a file is missing, that specific component's license has not been accepted.