Android Studio 3.2 Canary 14(JetPack)Gradle同步失败:Already disposed!
我之前在使用AS预览版时也碰到过类似的诡异同步错误,结合你提供的环境信息和错误堆栈,给你几个针对性的解决步骤:
问题背景
你在Debian 9.0 Stretch桌面长期使用Android Studio 3.1.x一切正常,但安装Android Studio 3.2 Canary 14(JetPack预览版)后,使用「Activity & Fragment+ViewModel」模板创建带Kotlin支持的新项目,执行Sync Project with Gradle Files时失败,日志中出现java.lang.AssertionError: Already disposed!的断言错误。
错误日志详情
2018-05-12 16:44:59,062 [ thread 43] WARN - ea.IdeaSyncPopulateProjectTask - Sync failed: Already disposed! java.lang.RuntimeException: java.lang.AssertionError: Already disposed! at com.intellij.openapi.application.impl.LaterInvocator.invokeAndWait(LaterInvocator.java:179) at com.intellij.openapi.application.impl.ApplicationImpl.invokeAndWait(ApplicationImpl.java:651) at com.intellij.openapi.application.impl.ApplicationImpl.invokeAndWait(ApplicationImpl.java:656) at com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.executeOnEdt(ExternalSystemApiUtil.java:480) at com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.executeProjectChangeAction(ExternalSystemApiUtil.java:469) at com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManagerImpl.dispose(ProjectDataManagerImpl.java:442) at com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManagerImpl.importData(ProjectDataManagerImpl.java:163) at com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManagerImpl.importData(ProjectDataManagerImpl.java:221) at com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManagerImpl.importData(ProjectDataManagerImpl.java:228) at com.android.tools.idea.gradle.project.sync.idea.IdeaSyncPopulateProjectTask.doPopulateProject(IdeaSyncPopulateProjectTask.java:120) at com.android.tools.idea.gradle.project.sync.idea.IdeaSyncPopulateProjectTask.populate(IdeaSyncPopulateProjectTask.java:97) at com.android.tools.idea.gradle.project.sync.idea.IdeaSyncPopulateProjectTask.access$000(IdeaSyncPopulateProjectTask.java:39) at com.android.tools.idea.gradle.project.sync.idea.IdeaSyncPopulateProjectTask$1.run(IdeaSyncPopulateProjectTask.java:86) at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:750) at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$1(CoreProgressManager.java:157) at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:580) at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:525) at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:85) at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:144) at com.intellij.openapi.progress.impl.CoreProgressManager$4.run(CoreProgressManager.java:395) at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:305) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.AssertionError: Already disposed! at com.intellij.openapi.components.impl.ComponentManagerImpl.disposeComponents(ComponentManagerImpl.java:128) at com.intellij.openapi.module.impl.ModuleImpl.dispose(ModuleImpl.java:145) at com.intellij.openapi.util.Disposer$1.execute(Disposer.java:48) at com.intellij.openapi.util.Disposer$1.execute(Disposer.java:44) at com.intellij.openapi.util.objectTree.ObjectTree.executeActionWithRecursiveGuard(ObjectTree.java:169) at com.intellij.openapi.util.objectTree.ObjectTree.executeUnregistered(ObjectTree.java:181) at com.intellij.openapi.util.objectTree.ObjectTree.executeAll(ObjectTree.java:140) at com.intellij.openapi.util.Disposer.dispose(Disposer.java:129) at com.intellij.openapi.util.Disposer.dispose(Disposer.java:125) at com.intellij.openapi.module.impl.ModuleManagerImpl$ModuleModelImpl.dispose(ModuleManagerImpl.java:895) at com.intellij.openapi.externalSystem.service.project.AbstractIdeModifiableModelsProvider.dispose(AbstractIdeModifiableModelsProvider.java:467) at com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManagerImpl$3.execute(ProjectDataManagerImpl.java:445) at com.intellij.openapi.externalSystem.util.DisposeAwareProjectChange.run(DisposeAwareProjectChange.java:36) at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1010) at com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.lambda$executeProjectChangeAction$6(ExternalSystemApi...
解决步骤
清理IDE缓存并重启
这是解决预览版IDE各种奇怪问题的首选方案:打开Android Studio,点击File -> Invalidate Caches / Restart...,选择Invalidate and Restart,让IDE彻底清理缓存并重启。很多时候同步错误都是缓存损坏导致的,这步能快速解决。删除项目的旧配置文件后重新同步
关闭Android Studio,手动删除项目根目录下的.gradle、.idea文件夹,以及所有模块下的build文件夹,然后重新打开项目,执行Sync Project with Gradle Files。这样可以彻底清除新旧AS版本留下的冲突配置,避免模块状态异常。检查Gradle与插件版本兼容性
打开项目根目录的build.gradle文件,确认Android Gradle Plugin(AGP)版本是3.2.0-alpha14(和AS 3.2 Canary 14对应),同时Gradle版本要匹配(建议使用AGP推荐的Gradle版本,通常在AS的Project Structure -> Project中可以查看和更新)。另外,确保Kotlin插件版本和AS版本兼容,Canary版本的Kotlin插件可能需要更新到对应预览版。验证模板是否存在bug
尝试创建一个普通的Empty Activity项目(勾选Kotlin支持),看是否能正常同步。如果普通项目同步正常,那大概率是「Activity & Fragment+ViewModel」模板的问题,可以手动添加JetPack组件(ViewModel、LiveData等)替代模板,或者等待Google发布后续Canary版本修复该bug。临时回退到稳定版AS(备选)
由于Canary版本本身是预览版,存在bug是正常现象。如果上述方法都无法解决,且你急需开展开发工作,可以暂时回退到Android Studio 3.1.x稳定版,等3.2正式版或后续Canary版本修复该问题后再升级。
内容的提问来源于stack exchange,提问作者Scott Smith

