완벽한 방법이 아니고 매번 이렇게 해서 고쳐야 하네요 어떤 버그 인지 모르겠어요 누가 골탕 먹이는 건지 ㅠㅠ.. 슬프네요.

 

아래 사진과 같이 Android 메뉴가 사라진걸 볼수 있어요 인터넷에서 하라는 대로 다 해봤지만 소용 없더라고요

 

추가 내용 도저히 안되겠어서 베타 버전 설치 하고 업데이트 업데이트 하니 고쳐 졌네요 휴 

https://developer.android.com/studio/preview?hl=ko

 

추가 내용 모든 열려 있는 텝을 닫으면 해결 될때도 있네요.

 

 

build.gradle.kts 클릭 하고 오른쪽 오픈을 하세요

 

 

그럼 기다리면 우측에 먼가 나오고 오른쪽이 사라졌던 것이 나타 나요 그리고 ok 누르는게 아니라 나가세요 

 

 

그리고 sync 다시 해주세요.

 

그럼 사라졌던 메뉴가 보여요

 

 

네, 링크 글 내용이 정상적으로 보입니다. 글에 적어두신 절차( build.gradle.kts 를 열고 우측 “Open”로 스크립트 화면을 띄운 다음, 창을 닫고 다시 Sync)도 확인했습니다. (don)

말씀하신 현상에서 핵심은 이겁니다.

왜 “build.gradle.kts를 Open했다가 Sync” 하면 돌아오나

Android Studio의 Project 창의 “Android” 보기는 단순 파일 트리 뷰가 아니라, Gradle(툴링 모델)에서 가져온 ‘Android 모듈 모델’이 정상 로드/동기화되어야 생성됩니다. 즉:

  • Gradle Sync(또는 Android 모델 로딩)가 어떤 이유로 부분 실패/중단/지연되면 → Android 뷰가 목록에서 사라질 수 있습니다.
  • 그런데 build.gradle.kts 를 “Open”로 열면 IDE가 그 스크립트를 프로젝트의 Gradle 스크립트로 강제 인식/재해석하면서
    • Gradle 연동(툴링 모델 요청)
    • Kotlin DSL 스크립트 인덱싱/해석
    • 관련 플러그인(AGP) 모델 재로딩
      을 “다시 트리거”하는 경우가 많습니다.
  • 그 직후 Sync를 다시 하면 운 좋게 이번에는 모델 로딩이 끝까지 성공하면서 Android 뷰가 복구되는 패턴이 됩니다.

“간헐적”으로 생기는 대표 원인 후보

아래 중 하나가 가장 흔합니다(여러 개가 동시에 있을 수도 있습니다).

  1. Gradle Sync가 실제로는 에러/경고로 실패했는데, 화면에서는 티가 덜 나는 경우
    • Event Log에 “Sync failed”가 찍히거나, 하단 Build/Sync 로그에 오류가 남아 있습니다.
  2. Kotlin DSL(.kts) 스크립트 해석/인덱싱이 꼬이는 경우
    • 버전 카탈로그(libs.versions.toml), 플러그인 DSL, 또는 스크립트 캐시가 꼬이면 간헐적으로 모델 생성이 실패할 수 있습니다.
  3. AGP(Android Gradle Plugin) ↔ Gradle ↔ JDK 버전 조합 불일치
    • 조합이 애매하면 “어쩔 땐 되고 어쩔 땐 안 되는” 형태로 Sync 안정성이 떨어질 수 있습니다.
  4. IDE 캐시/인덱스 손상, 파일 감시(File watcher) 문제, 메모리 부족
    • 이 경우도 “Invalidate Caches”로 완화되는 케이스가 많습니다.

재발 방지용으로 바로 해볼 것들(우선순위)

  1. Event Log / Sync 로그에서 “실패 원인”을 먼저 확인
    • 우측 하단 Event Log(알림 종) 또는 Build 창에서 마지막 Sync 실패 메시지를 확인하세요.
  2. File → Invalidate Caches / Restart 1회 실행
    • 간헐적 인덱싱/모델 로딩 문제에 가장 효과가 좋습니다.
  3. Gradle/JDK 설정 고정
    • Settings → Build Tools → Gradle에서 Gradle JDK를 프로젝트 권장 JDK로 명확히 고정(자동 인식에 맡기지 않기)
  4. 버전 조합 점검
    • gradle-wrapper.properties(Gradle 버전), build.gradle.kts(AGP 버전), 사용하는 JDK 버전이 호환되는지 점검

원인을 “정확히” 좁히려면, 아래 3가지만 알려주시면 진단을 거의 확정할 수 있습니다.

  • Android Studio 버전(Stable/Beta/Canary)과 빌드번호
  • gradle-wrapper.properties의 Gradle 버전
  • plugins { id("com.android.application") version "..." } 또는 classpath의 AGP 버전

이 3개 조합에서 흔히 터지는 케이스(호환성/버그)를 기준으로, 재발을 거의 없애는 쪽으로 설정을 제안드리겠습니다.

 

 

그리고 이런 에러가 나네요

 

java.lang.IllegalStateException: This method is forbidden on EDT because it does not pump the event queue. Switch to a BGT, or use com.intellij.openapi.progress.TasksKt.runWithModalProgressBlocking. 
at com.intellij.openapi.progress.CoroutinesKt.assertBackgroundThreadAndNoWriteAction(coroutines.kt:577)
at com.intellij.openapi.progress.CoroutinesKt.runBlockingCancellable(coroutines.kt:130)
at com.intellij.openapi.progress.CoroutinesKt.runBlockingMaybeCancellable(coroutines.kt:180)
at org.jetbrains.plugins.gradle.service.GradleInstallationManager.getGradleJvmPath(GradleInstallationManager.kt:145)
at cohttp://m.android.tools.idea.gradle.project.AndroidStudioGradleInstallationManager.getGradleJvmPath(AndroidStudioGradleInstallationManager.kt:42)
at cohttp://m.android.tools.idea.sdk.IdeSdks.isUsingJavaHomeJdk(IdeSdks.java:568)
at cohttp://m.android.tools.idea.gradle.project.sync.listeners.SpawnMultipleDaemonsWarningListener.syncSucceeded(SpawnMultipleDaemonsWarningListener.kt:44)
at cohttp://m.intellij.util.messages.impl.MessageBusImplKt.invokeMethod(MessageBusImpl.kt:818)
at cohttp://m.intellij.util.messages.impl.MessageBusImplKt.invokeListener(MessageBusImpl.kt:762)
at cohttp://m.intellij.util.messages.impl.MessageBusImplKt.deliverMessage(MessageBusImpl.kt:501)
at cohttp://m.intellij.util.messages.impl.MessageBusImplKt.pumpWaiting(MessageBusImpl.kt:480)
at cohttp://m.intellij.util.messages.impl.MessageBusImplKt.access$pumpWaiting(MessageBusImpl.kt:1)
at cohttp://m.intellij.util.messages.impl.MessagePublisher.invoke(MessageBusImpl.kt:543)
at jdk.proxy3/jdk.proxy3.$Proxy214.syncSucceeded(Unknown Source)
at cohttp://m.android.tools.idea.gradle.project.sync.GradleSyncStateHolder.syncSucceeded$lambda$0(GradleSyncStateImpl.kt:247)
at cohttp://m.android.tools.idea.gradle.project.sync.GradleSyncStateHolder.syncPublisher$publish(GradleSyncStateImpl.kt:379)
at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:240)
at cohttp://m.intellij.openapi.application.TransactionGuardImpl.access$100(TransactionGuardImpl.java:26)
at com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:202)
at cohttp://m.intellij.openapi.application.impl.AppImplKt$runnableUnitFunction$1.invoke(appImpl.kt:104)
at cohttp://m.intellij.openapi.application.impl.AppImplKt$runnableUnitFunction$1.invoke(appImpl.kt:104)
at cohttp://m.intellij.platform.locking.impl.NestedLocksThreadingSupport.doRunWriteIntentReadAction(NestedLocksThreadingSupport.kt:666)
at cohttp://m.intellij.platform.locking.impl.NestedLocksThreadingSupport.runPreventiveWriteIntentReadAction(NestedLocksThreadingSupport.kt:640)
at cohttp://m.intellij.platform.locking.impl.NestedLocksThreadingSupport.runWriteIntentReadAction(NestedLocksThreadingSupport.kt:633)
at cohttp://m.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:1022)
at cohttp://m.intellij.openapi.application.impl.ApplicationImpl$6.run(ApplicationImpl.java:574)
at cohttp://m.intellij.util.concurrency.ChildContext$runInChildContext$1.invoke(propagation.kt:167)
at cohttp://m.intellij.util.concurrency.ChildContext$runInChildContext$1.invoke(propagation.kt:167)
at cohttp://m.intellij.util.concurrency.ChildContext.runInChildContext(propagation.kt:173)
at cohttp://m.intellij.util.concurrency.ChildContext.runInChildContext(propagation.kt:167)
at cohttp://m.intellij.util.concurrency.ContextRunnable.run(ContextRunnable.java:27)
at cohttp://m.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:122)
at cohttp://m.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:43)
at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
at cohttp://m.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:595)
at cohttp://m.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:488)
at cohttp://m.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12$lambda$11$lambda$10$lambda$9(IdeEventQueue.kt:313)
at cohttp://m.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:865)
at cohttp://m.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12$lambda$11$lambda$10(IdeEventQueue.kt:312)
at cohttp://m.intellij.ide.IdeEventQueueKt.performActivity$lambda$3(IdeEventQueue.kt:974)
at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:110)
at cohttp://m.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:974)
at cohttp://m.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12(IdeEventQueue.kt:307)
at cohttp://m.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:347)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)

 

 


에러 메시지의 핵심은 이겁니다.

  • EDT(Event Dispatch Thread) = IntelliJ/Android Studio의 UI 스레드
  • 로그의 뜻: “UI 스레드(EDT)에서 하면 안 되는(이벤트 큐를 펌핑하지 않는) 작업을 어떤 코드가 실행했다”
  • 스택트레이스를 보면 그 “문제 코드”는 Gradle Sync 성공 직후 실행되는 경고 리스너 쪽입니다.

특히 이 부분이 결정적입니다.

  • SpawnMultipleDaemonsWarningListener.syncSucceeded(...)
  • → 내부에서 IdeSdks.isUsingJavaHomeJdk(...)
  • → GradleInstallationManager.getGradleJvmPath(...)
  • → 여기서 UI 스레드에서 runBlocking 계열을 호출해서 IllegalStateException 발생

즉, 프로젝트 설정이 잘못됐다기보다 Android Studio/Gradle 플러그인 쪽 버그 또는 특정 환경변수/설정이 그 경로를 타게 만들어서 간헐적으로 터지는 유형입니다. Windows 포맷 후 재설치해도 반복되는 것도 “프로젝트/환경 설정”이 같은 방향으로 세팅되어 있거나, 해당 버전 조합의 버그일 가능성이 큽니다.

아래 순서대로 하면 “근본 원인 후보”를 빠르게 제거할 수 있습니다.


1) Gradle JDK를 “Embedded JDK”로 고정 (가장 효과적인 우회/해결)

Android Studio:

  • File → Settings → Build, Execution, Deployment → Build Tools → Gradle
  • Gradle JDK를 다음으로 설정:
    • Embedded JDK (권장)
    • 또는 Studio가 번들한 JDK(예: jbr)

이 에러는 JAVA_HOME을 참조하거나 Gradle JVM 경로를 조회하는 과정에서 발생하므로, Gradle JDK를 명시적으로 Embedded로 고정하면 해당 코드 경로를 피하는 경우가 많습니다.

추가로 아래도 확인하세요.

  • 프로젝트의 gradle.properties에 **org.gradle.java.home=...**가 있으면 일단 제거/주석 처리 후 Sync

2) Windows 환경변수 JAVA_HOME을 “임시로” 제거 또는 정리

스택에 isUsingJavaHomeJdk가 등장하는 것으로 보아, JAVA_HOME을 감지하는 경로를 타고 있습니다.

Windows:

  • 시스템 환경변수에서 JAVA_HOME이 설정되어 있다면,
    • 임시로 제거(또는 다른 값으로 변경) 후 Android Studio 재실행
    • Gradle JDK는 Embedded로 유지

목표는 “IDE가 JAVA_HOME 기반 JDK 경로 확인을 하다가 UI 스레드에서 막히는 상황”을 차단하는 것입니다.


3) 동일 증상 재발 시: Android Studio 채널(베타/카나리) 변경 또는 업/다운그레이드

이 에러는 IDE 내부 스레딩 제약을 위반한 플러그인 코드에서 나는 형태라서,

  • 특정 Android Studio 버전(특히 Beta/Canary)
  • 특정 Gradle/AGP 조합
    에서만 나다가, 다음 버전에서 “조용히” 고쳐지는 경우가 흔합니다.

권장:

  • 가능하면 Stable(정식) 최신으로 이동
  • 또는 현재 Stable이면, 한 단계 위/아래 버전으로 변경 테스트

4) “Invalidate Caches / Restart 하면 나타난다”의 의미

Invalidate Caches는

  • 인덱스/Gradle 모델 캐시/일부 상태를 초기화해
  • 우연히 “문제 경로를 다시 밟지 않고” Sync가 끝나게 만들 수 있습니다.

하지만 근본 원인이 남아 있으면 다시 재발합니다. 그래서 위의 Gradle JDK 고정 + JAVA_HOME 정리가 더 중요합니다.


5) 그래도 계속되면: 재현 조건이 “프로젝트 설정”인지 “IDE 버그”인지 분리

아래 두 가지를 해보면 원인 분리가 됩니다.

  1. 새 Empty Activity 프로젝트 생성 → 동일 증상 발생?
  • 새 프로젝트에서도 나면: IDE/환경(JAVA_HOME 등) 쪽 가능성↑
  1. 문제가 나는 기존 프로젝트에서만 발생?
  • 프로젝트의 gradle.properties, settings.gradle(.kts), 버전 카탈로그, 플러그인 버전 쪽 가능성↑

제가 보기엔 “가장 가능성 높은 원인” 2개

  1. JAVA_HOME 감지 경로를 타는 과정에서 발생하는 Android Studio/Gradle 연동 버그
  2. 특정 Android Studio 버전(특히 베타) + AGP/Gradle 조합에서 Sync 성공 후 리스너가 UI 스레드에서 잘못 실행되는 버그

원인 확정을 위해, 아래 3가지만 알려주시면 제가 “정확히 어떤 조합에서 알려진 문제인지 + 가장 안전한 버전 조합”으로 정리해 드리겠습니다.

  1. Android Studio 버전 (예: 202x.x.x Patch x / Beta인지)
  2. AGP 버전 (com.android.application 버전)
  3. Gradle 버전 (gradle-wrapper.properties의 distributionUrl)

가능하면 Settings → Build Tools → Gradle 화면 캡처(Gradle JDK가 무엇으로 되어 있는지)도 같이 주시면 진단이 훨씬 빨라집니다.

반응형

+ Recent posts