Search code examples
androidandroid-studiogradlebuild-tools

Error on changing "buildToolsVersion" of project in Android Studio


I use Android Studio 3.1.4 and android gradle plugin version 3.1.4.

Previously I set buildToolsVersion "27.0.3" in build.gradle of module and there was no problem in building/running. Today I installed newer version of build tools and change build.gradle to use that: buildToolsVersion "28.0.2"

But when I try to sync project with gradle files or rebuild project it ends with AAPT2 error:

AGPBI: {"kind":"error","text":"error: \u003citem\u003e inner element must either be a resource reference or empty.","sources":[{"file":"<path to module>/src/main/res/values/ids.xml","position":{"startLine":16,"startColumn":4,"startOffset":752,"endColumn":55,"endOffset":803}}],"original":"","tool":"AAPT"}
....
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':<modulee-name>:mergeDebugResources'.
> Error: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details

But I do not understand what causes the error. For example addressed line in error is:

<item type="id" name="bookmark">false</item>

What causes this error and how I can solve this problem?

Edit

I added android.enableAapt2=false to the gradle.properties and it seems ignores error, but causes this warning:

The option 'android.enableAapt2' is deprecated and should not be used anymore. Use 'android.enableAapt2=true' to remove this warning. It will be removed at the end of 2018..


Solution

  • you cannot assign false (nor any other value but it's name) to an ID resource.

    An ID is a simple resource that is referenced using the value provided in the name attribute (not the name of the XML file). As such, you can combine ID resources with other simple resources in the one XML file, under one element. Also, remember that an ID resources does not reference an actual resource item; it is simply a unique ID that you can attach to other resources or use as a unique integer in your application.

    with android.enableAapt2=false it might ignore the logical error, but not "fix it".