microg / microg/GmsCore

[<com.humble.SlayTheSpire>] Slay the Spire Sync Problem

Open
#3,785 3 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
14.6k
Forks
3.2k
Avg merge
12d 11h
Merged PRs (30d)
4

Description

**Affected app**
Name: Slay the Spire
Package id: com.humble.SlayTheSpire

**Describe the bug**
The game hangs indefinitely on a "Synchronizing Data" screen at launch. Logcat shows GamesService binding correctly and a Play Games sign-in flow starting (GmsHttpFormClient requests an OAuth token for the "games_lite" scope), but no success or failure response is ever logged - the app just waits forever. FakeLicenseService's license check completes successfully before this, so licensing isn't the issue.

**To Reproduce**
Steps to reproduce the behavior:
1. Sign into a Google account via App Lounge / microG
2. Install Slay the Spire (paid, already owned)
3. Launch the app
4. It gets stuck on the sign-in/"Synchronizing Data" screen

***Workaround to run in Offline-Mode***
Enabling Airplane Mode before launch, then tapping the blank area next to the sync popup's button (not the button itself), causes the app to close and relaunch itself, after which it loads normally into offline/guest mode. This suggests the OAuth request needs to fail fast rather than hang to unblock the app.

Source: [https://community.e.foundation/t/how-to-get-slay-the-spire-working/81576](https://community.e.foundation/t/how-to-get-slay-the-spire-working/81576)

**Expected behavior**
Sign-in should either complete or fail/time out gracefully instead of hanging indefinitely.

**Screenshots**
Syncing screen:

Image

Launch in Airplane Mode:

Image

**System**
Android Version: 16
Custom ROM: /e/OS 4.2-a16-20260815662938-official-FP6

**microG**
microG Core version: 0.3.15.252432-72
microG Self-Check results: All ticked

**Log**
09-06 15:02:19.431 2342 10237 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 xflg=0x4 pkg=com.humble.SlayTheSpire cmp=com.humble.SlayTheSpire/android.app.NativeActivity bnds=[682,1345][931,1624]} with LAUNCH_MULTIPLE from uid 10156 (sr=3256988) (BAL_ALLOW_VISIBLE_WINDOW) result code=0
09-06 15:02:19.433 3075 3122 V WindowManagerShell: Transition requested (#4290): android.os.BinderProxy@46f41ed TransitionRequestInfo { type = OPEN, triggerTask = TaskInfo{userId=0 taskId=750 effectiveUid=10282 displayId=0 isRunning=true baseIntent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 pkg=com.humble.SlayTheSpire cmp=com.humble.SlayTheSpire/android.app.NativeActivity } baseActivity=ComponentInfo{com.humble.SlayTheSpire/android.app.NativeActivity} topActivity=ComponentInfo{com.humble.SlayTheSpire/android.app.NativeActivity} origActivity=null realActivity=ComponentInfo{com.humble.SlayTheSpire/android.app.NativeActivity} numActivities=1 lastActiveTime=281843251 supportsMultiWindow=false resizeMode=0 isResizeable=false minWidth=-1 minHeight=-1 defaultMinSize=220 token=WCT{android.window.IWindowContainerToken$Stub$Proxy@3c37822} topActivityType=1 pictureInPictureParams=null shouldDockBigOverlays=false launchIntoPipHostTaskId=-1 lastParentTaskIdBeforePip=-1 displayCutoutSafeInsets=Rect(0, 110 - 0, 0) topActivityInfo=ActivityInfo{520b2b3 android.app.NativeActivity} launchCookies=[android.os.BinderProxy@ed0d070] positionInParent=Point(0, 0) parentTaskId=-1 isFocused=false isVisible=false isVisibleRequested=false isTopActivityNoDisplay=false isSleeping=false locusId=null displayAreaFeatureId=1 isTopActivityTransparent=false isActivityStackTransparent=false lastNonFullscreenBounds=Rect(81, 1030 - 1035, 1492) capturedLink=null capturedLinkTimestamp=0 requestedVisibleTypes=-9 topActivityRequestOpenInBrowserEducationTimestamp=0 appCompatTaskInfo=AppCompatTaskInfo { topActivityInSizeCompat=false eligibleForLetterboxEducation= false isLetterboxEducationEnabled= false isLetterboxDoubleTapEnabled= false eligibleForUserAspectRatioButton= false topActivityBoundsLetterboxed= false isFromLetterboxDoubleTap= false topActivityLetterboxVerticalPosition= -1 topActivityLetterboxHorizontalPosition= -1 topActivityLetterboxWidth=-1 topActivityLetterboxHeight=-1 topActivityAppBounds=Rect(0, 0 - 1116, 2484) isUserFullscreenOverrideEnabled=false isSystemFullscreenOverrideEnabled=false hasMinAspectRatioOverride=false topActivityLetterboxBounds=null cameraCompatTaskInfo=CameraCompatTaskInfo { freeformCameraCompatMode=inactive}} topActivityMainWindowFrame=null}, pipChange = null, remoteTransition = RemoteTransition { remoteTransition = android.window.IRemoteTransition$Stub$Proxy@50b0fe9, appThread = null, debugName = QuickstepLaunch }, displayChange = null, flags = 0, debugId = 4290 }
09-06 15:02:19.448 2342 10237 D CoreBackPreview: Window{b6781c8 u0 Splash Screen com.humble.SlayTheSpire}: Setting back callback OnBackInvokedCallbackInfo{mCallback=android.window.IOnBackInvokedCallback$Stub$Proxy@5f2a186, mPriority=0, mIsAnimationCallback=false, mOverrideBehavior=0}
09-06 15:02:19.460 2342 2379 I ActivityManager: Start proc 15078:com.humble.SlayTheSpire/u0a282 for next-top-activity {com.humble.SlayTheSpire/android.app.NativeActivity}
09-06 15:02:19.463 2342 2364 V WindowManager: Sent Transition (#4290) createdAt=09-06 15:02:19.421 via request=TransitionRequestInfo { type = OPEN, triggerTask = TaskInfo{userId=0 taskId=750 effectiveUid=10282 displayId=0 isRunning=true baseIntent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 pkg=com.humble.SlayTheSpire cmp=com.humble.SlayTheSpire/android.app.NativeActivity } baseActivity=ComponentInfo{com.humble.SlayTheSpire/android.app.NativeActivity} topActivity=ComponentInfo{com.humble.SlayTheSpire/android.app.NativeActivity} origActivity=null realActivity=ComponentInfo{com.humble.SlayTheSpire/android.app.NativeActivity} numActivities=1 lastActiveTime=281843251 supportsMultiWindow=false resizeMode=0 isResizeable=false minWidth=-1 minHeight=-1 defaultMinSize=220 token=WCT{RemoteToken{d2ec3e3 Task{4b0204f #750 type=standard A=10282:com.humble.SlayTheSpire nonResizable}}} topActivityType=1 pictureInPictureParams=null shouldDockBigOverlays=false launchIntoPipHostTaskId=-1 lastParentTaskIdBeforePip=-1 displayCutoutSafeInsets=Rect(0, 110 - 0, 0) topActivityInfo=ActivityInfo{12ac1e0 android.app.NativeActivity} launchCookies=[android.os.BinderProxy@986fc99] positionInParent=Point(0, 0) parentTaskId=-1 isFocused=false isVisible=false isVisibleRequested=false isTopActivityNoDisplay=false isSleeping=false locusId=null displayAreaFeatureId=1 isTopActivityTransparent=false isActivityStackTransparent=false lastNonFullscreenBounds=Rect(81, 1030 - 1035, 1492) capturedLink=null capturedLinkTimestamp=0 requestedVisibleTypes=-9 topActivityRequestOpenInBrowserEducationTimestamp=0 appCompatTaskInfo=AppCompatTaskInfo { topActivityInSizeCompat=false eligibleForLetterboxEducation= false isLetterboxEducationEnabled= false isLetterboxDoubleTapEnabled= false eligibleForUserAspectRatioButton= false topActivityBoundsLetterboxed= false isFromLetterboxDoubleTap= false topActivityLetterboxVerticalPosition= -1 topActivityLetterboxHorizontalPosition= -1 topActivityLetterboxWidth=-1 topActivityLetterboxHeight=-1 topActivityAppBounds=Rect(0, 0 - 1116, 2484) isUserFullscreenOverrideEnabled=false isSystemFullscreenOverrideEnabled=false hasMinAspectRatioOverride=false topActivityLetterboxBounds=null cameraCompatTaskInfo=CameraCompatTaskInfo { freeformCameraCompatMode=inactive}} topActivityMainWindowFrame=null}, pipChange = null, remoteTransition = RemoteTransition { remoteTransition = android.window.IRemoteTransition$Stub$Proxy@6c65b5e, appThread = null, debugName = QuickstepLaunch }, displayChange = null, flags = 0, debugId = 4290 }
09-06 15:02:19.463 2342 2364 V WindowManager: {WCT{RemoteToken{d2ec3e3 Task{4b0204f #750 type=standard A=10282:com.humble.SlayTheSpire nonResizable}}} m=OPEN f=NONE leash=Surface(name=Task=750)/@0x89cc39d sb=Rect(0, 0 - 1116, 2484) eb=Rect(0, 0 - 1116, 2484) epz=Point(1116, 2484) d=0 endFixedRotation=1 taskParent=-1},
09-06 15:02:19.505 15078 15078 D nativeloader: Configuring clns-9 for other apk /data/app/~~yGZ90yFXu22Z2NJoiUidag==/com.humble.SlayTheSpire-_nSBBQPY1aahBS7LH5V1pA==/base.apk:/data/app/~~yGZ90yFXu22Z2NJoiUidag==/com.humble.SlayTheSpire-_nSBBQPY1aahBS7LH5V1pA==/split_InstallPack.apk. target_sdk_version=35, uses_libraries=, library_path=/data/app/~~yGZ90yFXu22Z2NJoiUidag==/com.humble.SlayTheSpire-_nSBBQPY1aahBS7LH5V1pA==/lib/arm64:/data/app/~~yGZ90yFXu22Z2NJoiUidag==/com.humble.SlayTheSpire-_nSBBQPY1aahBS7LH5V1pA==/base.apk!/lib/arm64-v8a:/data/app/~~yGZ90yFXu22Z2NJoiUidag==/com.humble.SlayTheSpire-_nSBBQPY1aahBS7LH5V1pA==/split_InstallPack.apk!/lib/arm64-v8a, permitted_path=/data:/mnt/expand:/data/user/0/com.humble.SlayTheSpire
09-06 15:02:19.511 15078 15078 V GraphicsEnvironment: com.humble.SlayTheSpire is not listed in per-application setting
09-06 15:02:19.511 15078 15078 V GraphicsEnvironment: com.humble.SlayTheSpire is not listed in ANGLE allowlist or settings, returning default
09-06 15:02:19.523 15078 15096 I AdrenoGLES-0: Process Name : com.humble.SlayTheSpire
09-06 15:02:19.577 15078 15078 D nativeloader: Load /data/app/~~yGZ90yFXu22Z2NJoiUidag==/com.humble.SlayTheSpire-_nSBBQPY1aahBS7LH5V1pA==/base.apk!/lib/arm64-v8a/libSpire_ANDROID.so using class loader ns clns-9 (caller=): ok
09-06 15:02:20.021 2342 2364 V WindowManager: {WCT{RemoteToken{d2ec3e3 Task{4b0204f #750 type=standard A=10282:com.humble.SlayTheSpire nonResizable}}} m=CHANGE f=NONE p=WCT{RemoteToken{6503344 DefaultTaskDisplayArea@161384973}} leash=Surface(name=Task=750)/@0x89cc39d sb=Rect(0, 0 - 1116, 2484) eb=Rect(0, 0 - 2484, 1116) epz=Point(2484, 1116) d=0 r=0->1:0 taskParent=-1},
09-06 15:02:20.593 2342 2791 D CoreBackPreview: Window{bc9f827 u0 com.humble.SlayTheSpire/android.app.NativeActivity}: Setting back callback OnBackInvokedCallbackInfo{mCallback=android.window.IOnBackInvokedCallback$Stub$Proxy@2f04af6, mPriority=0, mIsAnimationCallback=false, mOverrideBehavior=0}
09-06 15:02:20.599 4648 5419 D GamesConnectService: bound by: GetServiceRequest[GAMES, packageName="com.humble.SlayTheSpire", gmsVersion=12451000, scopes=[], extras=Bundle[{com.google.android.gms.games.key.gamePackageName=com.humble.SlayTheSpire, com.google.android.gms.games.key.API_VERSION=9}], defaultFeatures=[], apiFeatures=[], supportsConnectionInfo=true]
09-06 15:02:20.603 2342 2364 I ActivityTaskManager: Displayed com.humble.SlayTheSpire/android.app.NativeActivity for user 0: +1s180ms
09-06 15:02:20.608 4648 13309 D GmsHttpFormClient: androidId=null&app=com.humble.SlayTheSpire&client_sig=[REDACTED_CLIENT_SIG]&callerPkg=com.google.android.gms&callerSig=[REDACTED_CALLER_SIG]&device_country=de&Email=[REDACTED_EMAIL]&google_play_services_version=252432000&is_called_from_account_manager=1&_opt_is_called_from_account_manager=1&it_caveat_types=2&lang=en_DE&operatorCountry=de&sdk_version=36&service=oauth2%3Ahttps%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgames_lite&source=android&Token=[REDACTED_TOKEN]&token_request_options=[REDACTED]
09-06 15:02:20.617 15078 15098 I Android Application Output: *CHECKING FOR FILE: /storage/emulated/0/Android/data/com.humble.SlayTheSpire/files/preferences/STSSound
09-06 15:02:20.618 15078 15098 I Android Application Output: *READING FILE: /storage/emulated/0/Android/data/com.humble.SlayTheSpire/files/preferences/STSSound
09-06 15:02:20.619 15078 15098 I Android Application Output: *CHECKING FOR FILE: /storage/emulated/0/Android/data/com.humble.SlayTheSpire/files/preferences/STSGameplaySettings
09-06 15:02:20.620 15078 15098 I Android Application Output: *READING FILE: /storage/emulated/0/Android/data/com.humble.SlayTheSpire/files/preferences/STSGameplaySettings
09-06 15:02:20.640 2342 2934 I ImeTracker: com.humble.SlayTheSpire:ca7bf82f: onRequestHide at ORIGIN_SERVER reason HIDE_UNSPECIFIED_WINDOW fromUser false
09-06 15:02:20.641 15078 15078 I ImeTracker: com.humble.SlayTheSpire:ca7bf82f: onCancelled at PHASE_CLIENT_ALREADY_HIDDEN
09-06 15:02:20.971 2342 5505 D CoreBackPreview: Window{b6781c8 u0 Splash Screen com.humble.SlayTheSpire EXITING}: Setting back callback null
09-06 15:02:20.999 15078 15116 W InteractionJankMonitor: Initializing without READ_DEVICE_CONFIG permission. enabled=false, interval=1, missedFrameThreshold=3, frameTimeThreshold=64, package=com.humble.SlayTheSpire
09-06 15:02:21.361 1547 7819 I UsecaseValidator: verifyAudioAttributes update usage: 1 to AUDIO_USAGE_GAME for output: 21 pid: 15078 package: com.humble.SlayTheSpire
09-06 15:02:21.362 2342 3675 E AppOps : attributionTag not declared in manifest of com.humble.SlayTheSpire
09-06 15:02:21.363 2342 2791 E AppOps : attributionTag not declared in manifest of com.humble.SlayTheSpire
09-06 15:02:21.651 4648 5419 D GamesService: bound by: GetServiceRequest[GAMES, packageName="com.humble.SlayTheSpire", gmsVersion=12451000, scopes=[], extras=Bundle[{com.google.android.gms.games.key.gameRunToken=[REDACTED_GAME_RUN_TOKEN], com.google.android.gms.games.key.gamePackageName=com.humble.SlayTheSpire, com.google.android.gms.games.key.sdkVariant=2101523, com.google.android.gms.games.key.isHeadless=false, com.google.android.gms.games.key.signInOptions=Bundle[mParcelledData.dataSize=1160], com.google.android.gms.games.key.showConnectingPopup=true, com.google.android.gms.games.key.API_VERSION=9, com.google.android.gms.games.key.isGmsCoreUiInitiatedRequest=false, com.google.android.gms.games.key.retryingSignIn=false, com.google.android.gms.games.key.desiredLocale=en_DE, com.google.android.gms.games.key.popupWindowToken=Supplier{VAL_PARCELABLE@2512+148}, com.google.android.gms.games.key.forceResolveAccountKey=null, com.google.android.gms.games.key.unauthenticated=false, com.google.android.gms.games.key.connectingPopupGravity=17, com.google.android.gms.games.key.proxyApis=Supplier{VAL_LIST@3108+12}, com.google.android.gms.games.key.realClientPackageName=null, com.google.android.gms.games.key.skipPgaCheck=false, com.google.android.gms.games.key.skipWelcomePopup=false}], defaultFeatures=[], apiFeatures=[Feature[games_get_account_selection_intent,1], Feature[games_get_privacy_settings_intent,1], Feature[games_load_player_force_reload,1], Feature[games_load_profile_capabilities,2], Feature[games_recall,1], Feature[games_report_player,1], Feature[games_app_shortcuts,1], Feature[games_game_streaks,1], Feature[games_public_gamer_profile,1]], supportsConnectionInfo=true]
09-06 15:02:21.663 4648 13309 D GmsHttpFormClient: androidId=null&app=com.humble.SlayTheSpire&client_sig=[REDACTED_CLIENT_SIG]&callerPkg=com.google.android.gms&callerSig=[REDACTED_CALLER_SIG]&device_country=de&Email=[REDACTED_EMAIL]&google_play_services_version=252432000&is_called_from_account_manager=1&_opt_is_called_from_account_manager=1&it_caveat_types=2&lang=en_DE&operatorCountry=de&sdk_version=36&service=oauth2%3Ahttps%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgames_lite&source=android&Token=[REDACTED_TOKEN]&token_request_options=[REDACTED]
09-06 15:02:22.594 2342 5505 W ProcessStats: Tracking association SourceState{9b60433 com.humble.SlayTheSpire/10282 BTop #195429} whose proc state 2 is better than process ProcessState{8dc43c9 com.android.vending/10087 pkg=com.android.vending} proc state 15 (5 skipped)
09-06 15:02:22.597 6812 13058 V FakeLicenseService: checkLicenseV2(com.humble.SlayTheSpire, Bundle[EMPTY_PARCEL])

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the launch with logcat and start from the GamesService binding and GmsHttpFormClient OAuth request shown in the report; use FakeLicenseService only to confirm licensing is not involved. Trace the Play Games sign-in flow from the synchronizing screen. Done means sign-in completes or fails/times out gracefully instead of leaving the game hanging indefinitely.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, java
Domain
authentication, mobile
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.