You're in Android Studio, you hit Run, and the build grinds for a minute before dying with something like AGP: AAPT2 error: resource style/AppTheme (aka com.yourpackage:style/AppTheme) not found. Or maybe error: resource drawable/ic_launcher_foreground not found. This usually happens right after you merge a branch, pull new code, or rename a package. It's infuriating because the compiler points at a file that exists — you can see it in the project tree. This tripped me up the first time too.
What's actually going on
AAPT2 is the Android Asset Packaging Tool. It reads your resources (XML layouts, drawables, styles) and generates a binary file the app uses at runtime. When it says resource not found, it means one of two things:
- The resource you're referencing doesn't exist — maybe you deleted it, or the file name doesn't match the reference exactly (case matters, and hyphens are invalid).
- The resource exists but isn't being compiled — this happens when the resource file is in the wrong folder, has a syntax error, or gets filtered out by a build variant or resource qualifier.
I've seen this on projects with res/values/styles.xml that reference a color defined in res/values/colors.xml, but someone renamed the color in one file and not the other. Classic.
The fix: 5 steps that work
Skip the random clean/rebuild frenzy — do this instead:
1. Read the full error message
Don't just look at the first line. Scroll up in the Build output. AAPT2 usually lists the exact file and line number. For example:
error: resource color/brand_primary (aka com.example:color/brand_primary) not found.
error: failed linking file resources.
That tells you it's color/brand_primary. Now you know what to search for.
2. Search your project for that resource name
In Android Studio, press Ctrl+Shift+F (or Cmd+Shift+F on Mac) and type the missing resource name — brand_primary in this case. Look for references that might point to a typo. Also check if you have two definitions — one in values/colors.xml and another in values-night/colors.xml — and one of them got deleted.
3. Check for invalid resource names
Android resource names can only contain lowercase letters, digits, and underscores. If you have a file like my-icon.png or ButtonStyle.xml, rename it to my_icon.png or button_style.xml. I've seen this trip up people who copy files from iOS style naming.
4. Look at your Gradle files for resource shrinking
If you have shrinkResources true and minifyEnabled true in your build.gradle (usually in the release build type), sometimes resources get stripped unexpectedly. Try the debug build — if it works, that's your culprit. For a quick test, flip shrinkResources to false and rebuild.
5. Clean and rebuild — properly
I said skip the frenzy, but a targeted clean can help if there's a stale build cache. Run this from the terminal in your project root:
./gradlew clean
./gradlew assembleDebug
That wipes the build/ folders and regenerates everything. If you're on Windows, use gradlew.bat instead.
Still broken? Check these three things
If the error persists, it's not a simple name mismatch. Here's what I'd dig into next:
- Resource qualifiers: Have a
drawable-hdpibut nodrawable-mdpi? That's fine for density, but if you have avalues-landfolder and the mainvaluesfolder references a string only defined invalues-land, the linker will fail on orientation change. Make sure every resource referenced in a default config exists in the basevalues/ordrawable/folder. - Library conflicts: You might have two dependencies that both define the same resource ID. Check your
build.gradledependencies — if one library is a fork that includes resources with the same names, the build fails with a duplicate resource error. Fix by removing one dependency or usingexcludein the dependency block. - Corrupted Gradle cache: Sometimes the Gradle daemon gets stuck on an old resource index. Close Android Studio, then run
./gradlew --stopand delete the~/.gradle/caches/folder (yes, it'll re-download, but it's worth it). Then reopen Studio and let it sync.
One more thing — if you're using a library like Glide or Firebase that generates resources at build time, make sure you've applied the right plugin in your Gradle file. Missing an annotation processor can cause resources to not exist when the linker runs.
In my experience, 8 out of 10 times it's a simple typo or a resource that got deleted in a merge conflict. The other 2 times, it's a build cache issue that the clean command sorts out. Work through these steps in order and you'll have the build green before your coffee cools.