Status Update
Comments
ra...@google.com <ra...@google.com>
sp...@google.com <sp...@google.com>
sp...@google.com <sp...@google.com> #2
za...@gmail.com <za...@gmail.com> #3
sp...@google.com <sp...@google.com> #4
The problem is that, while there is no error indicated on the project, when I try to run using the IDE run button (or ctrl-r), nothing happens (gradle build doesn't even start) and I see this exception on "IDE Fatal Errors" (the red exclamation mark icon in the bottom right in the status bar):
java.lang.IllegalArgumentException: No enum constant com.android.manifmerger.NodeOperationType.MERGE-ONLY-ATTRIBUTES
at java.lang.Enum.valueOf(Enum.java:238)
at com.android.manifmerger.NodeOperationType.valueOf(NodeOperationType.java:34)
at com.android.manifmerger.XmlElement.<init>(XmlElement.java:108)
at com.android.manifmerger.XmlElement.initMergeableChildren(XmlElement.java:893)
at com.android.manifmerger.XmlElement.<init>(XmlElement.java:170)
at com.android.manifmerger.XmlElement.initMergeableChildren(XmlElement.java:893)
at com.android.manifmerger.XmlElement.<init>(XmlElement.java:170)
at com.android.manifmerger.XmlDocument.getRootNode(XmlDocument.java:247)
at com.android.manifmerger.PlaceholderHandler.visit(PlaceholderHandler.java:82)
at com.android.manifmerger.ManifestMerger2.performPlaceHolderSubstitution(ManifestMerger2.java:1068)
at com.android.manifmerger.ManifestMerger2.load(ManifestMerger2.java:1027)
at com.android.manifmerger.ManifestMerger2.merge(ManifestMerger2.java:139)
at com.android.manifmerger.ManifestMerger2.access$600(ManifestMerger2.java:61)
at com.android.manifmerger.ManifestMerger2$Invoker.merge(ManifestMerger2.java:1737)
at com.android.tools.idea.model.ManifestInfo.getMergedManifest(ManifestInfo.java:254)
at com.android.tools.idea.model.ManifestInfo$ManifestFile.parseManifest(ManifestInfo.java:314)
at com.android.tools.idea.model.ManifestInfo$ManifestFile.refresh(ManifestInfo.java:379)
at com.android.tools.idea.model.MergedManifest.syncWithReadPermission(MergedManifest.java:410)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:925)
at com.android.tools.idea.model.MergedManifest.sync(MergedManifest.java:372)
at com.android.tools.idea.model.MergedManifest.getActivities(MergedManifest.java:550)
at com.android.tools.idea.run.activity.DefaultActivityLocator.lambda$computeDefaultActivity$0(DefaultActivityLocator.java:84)
at com.intellij.openapi.project.DumbService.lambda$runReadActionInSmartMode$0(DumbService.java:79)
at com.intellij.openapi.project.DumbService.runReadActionInSmartMode(DumbService.java:110)
at com.intellij.openapi.project.DumbService.runReadActionInSmartMode(DumbService.java:79)
at com.android.tools.idea.run.activity.DefaultActivityLocator.computeDefaultActivity(DefaultActivityLocator.java:83)
at com.android.tools.idea.run.activity.DefaultActivityLocator.validate(DefaultActivityLocator.java:70)
at com.android.tools.idea.run.editor.DefaultActivityLaunch$State.checkConfiguration(DefaultActivityLaunch.java:49)
at com.android.tools.idea.run.AndroidAppRunConfigurationBase.checkConfiguration(AndroidAppRunConfigurationBase.java:113)
at com.android.tools.idea.run.AndroidRunConfigurationBase.validate(AndroidRunConfigurationBase.java:190)
at com.android.tools.idea.run.AndroidRunConfigurationBase.checkConfiguration(AndroidRunConfigurationBase.java:123)
at com.intellij.execution.impl.RunnerAndConfigurationSettingsImpl.checkSettings(RunnerAndConfigurationSettingsImpl.kt:321)
at com.intellij.execution.impl.RunManagerImpl$Companion.canRunConfiguration(RunManagerImpl.kt:67)
at com.intellij.execution.impl.RunManagerImpl$Companion.canRunConfiguration(RunManagerImpl.kt:61)
at com.intellij.execution.impl.RunManagerImpl.canRunConfiguration(RunManagerImpl.kt)
at com.intellij.execution.ProgramRunnerUtil.executeConfigurationAsync(ProgramRunnerUtil.java:65)
at com.intellij.execution.ProgramRunnerUtil.executeConfiguration(ProgramRunnerUtil.java:43)
at com.intellij.execution.impl.ExecutionManagerImpl.start(ExecutionManagerImpl.java:94)
at com.intellij.execution.impl.ExecutionManagerImpl.access$300(ExecutionManagerImpl.java:43)
at com.intellij.execution.impl.ExecutionManagerImpl$3.run(ExecutionManagerImpl.java:423)
at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:232)
at com.intellij.util.Alarm$Request.runSafely(Alarm.java:405)
at com.intellij.util.Alarm$Request.access$700(Alarm.java:330)
at com.intellij.util.Alarm$Request$1.run(Alarm.java:371)
at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:315)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:447)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:431)
at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:415)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:762)
at java.awt.EventQueue.access$500(EventQueue.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:715)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:732)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:817)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:758)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:394)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
But you don't even need my sample project for this. I just created a new project with a basic activity, ran it once to make sure it works then added this attribute to the main activity
in the AndroidManifest.xml:
tools:node="merge-only-attributes"
To be extra clear, this is the main activity node on the manifest that causes the error:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"
tools:node="merge-only-attributes">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Removing the "merge-only-attributes" flag makes the error go away. In my original problem, I traded it for "<intent-filter tools:node="removeAll"/>" inside the activity node.
My problem with this is that the IDE even allows me to autocomplete the "merge-only-attributes" flag. If it no longer exists, then it should be removed from the IDE.
za...@gmail.com <za...@gmail.com> #5
I'm still able to reproduce on AS Electric Eel Canary 8.
It should be "mergeOnlyAttributes", not "merge-only-attributes".
This is an IDE bug - autocomplete should suggest "mergeOnlyAttributes".
za...@gmail.com <za...@gmail.com> #6
I've submitted a fix which will be available in the next canary build.
sp...@google.com <sp...@google.com> #7
Thank you for your patience while our engineering team worked to resolve this issue. A fix for this issue is now available in:
- Android Studio Ladybug Feature Drop | 2024.2.2 Canary 1
- Android Gradle Plugin 8.8.0-alpha01
We encourage you to try the latest update.
If you notice further issues or have questions, please file a new bug report.
Thank you for taking the time to submit feedback — we really appreciate it!
za...@gmail.com <za...@gmail.com> #8
sp...@google.com <sp...@google.com> #9
an...@google.com <an...@google.com> #10
Thank you for your patience while our engineering team worked to resolve this issue. A fix for this issue is now available in:
- Android Studio Ladybug Feature Drop | 2024.2.2 Canary 2
- Android Gradle Plugin 8.8.0-alpha02
We encourage you to try the latest update.
If you notice further issues or have questions, please file a new bug report.
Thank you for taking the time to submit feedback — we really appreciate it!
ju...@yahooinc.com <ju...@yahooinc.com> #11
sp...@google.com <sp...@google.com> #12
Was a resolution ever found to the MissingValueException? I am seeing the same issue
Not that I know of.
Are you hitting that after trying the workaround from #4?
If so, does using AGP 8.8.0-alpha02 or newer fix the original problem for you?
ju...@yahooinc.com <ju...@yahooinc.com> #13
Are you hitting that after trying the workaround from #4?
No, I am seeing the issue from #8 without having hit the original issue. I've been attempting to debug myself, but as the original reporter said, it can be frustrating to debug configuration internals in gradle.
However I have managed to work around it. As the original reporter said, I believe there is somewhere where AGP is setting a provider value on kapt stub gen KotlinCompile tasks with
I acknowledge that you were unable to find a location where this occurs, so possible this is being performed in kapt library. But the project I am working on uses freeCompilerArgs minimally, and I don't believe we are causing this ourselves.
Avoid the e via the following setup in the applicable areas where freeCompilerArgs are being set (simplified for sharing purposes):
android {
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
try {
freeCompilerArgs.appendAll(
"-opt-in=kotlin.RequiresOptIn",
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
)
} catch (e: MissingValueException) {
freeCompilerArgs.set(mutableListOf())
freeCompilerArgs.appendAll(
"-opt-in=kotlin.RequiresOptIn",
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
)
}
}
}
}
sp...@google.com <sp...@google.com> #14
Thanks for the info!
If you use AGP 8.8.0-alpha02 or newer, do you still need the workaround in #13?
ju...@yahooinc.com <ju...@yahooinc.com> #15
sp...@google.com <sp...@google.com> #16
Thanks for the info. Any chance you can create a repro project hitting the MissingValueException
? I wasn't able to repro it on my side previously.
ju...@yahooinc.com <ju...@yahooinc.com> #17
Any chance you can create a repro project hitting the MissingValueException? I wasn't able to repro it on my side previously.
Apologies, this would not be something I would have the chance to do with my current workload.
I did note though, that when swapping freeCompilerArgs.append/appendAll
for freeCompilerArgs.add/addAll
the failure re-emerged. This is of interest to me since append* gets removed in Gradle 8.8:
ju...@yahooinc.com <ju...@yahooinc.com> #18
Update:
The issue did lie in our usage of freeCompilerArgs
. Traced the issue back to the following format in root build.gradle.kts
. This setup had worked prior to upgrading to 2.0.0. Was able to work around the issue once I was aware of what caused it.
subprojects {
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
compilerOptions {
freeCompilerArgs.add(*any arg here*)
}
}
}
You should be able to reproduce now with this setup in any project.
sp...@google.com <sp...@google.com> #19
Thanks for the update! I filed
Description
I've been trying out kotlin test fixtures in AGP 8.5 was surprised to find that classes compiled by these tasks were using the jvm-target of our running JDK (22) in our case, and not the one our convention plugin sets for all KotlinCompile tasks (17).
After some digging and disallowChanges use to track down who was overriding this, it looks like AGP sources kotlinOptions from
android.kotlinOptions
? tbh I didn't realize this DSL still existed, and kinda wonder why. Is this intentional? Confirmed that if I manually set these values separately, it works as expected.Could these be deduped (or at least source from the same convention as other KGP tasks?). The reason I ask is because this means to use testFixtures, our convention plugin would have to add a separate, somewhat duplicate code path to configure kotlin options just for AGP test fixtures that uses legacy APIs (i.e.
kotlinOptions
and not the new property-basedcompilerOptions
).