You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX应用Google Play加载skin.json报错,IDE运行正常求助

LibGDX应用Google Play发布后纹理加载失败问题解决

问题概述

LibGDX应用在IntelliJ IDE本地运行正常,但上传至Google Play控制台后出现纹理加载失败,具体报错为读取images/menuTexture.json文件失败,根源是找不到com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle类。

相关信息

皮肤配置JSON

{
  com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: {
    background: {
      down: shade,
      up: shade
    }
  },
  com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: {
    default-horizontal: {
      background: slider-background,
      knob: slider-knob-1,
      knobBefore: slider-knobBefore,
      knobAfter: slider-knobAfter
    },
  },
  com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle: {
    default-horizontal: {
      background: slider-background,
      knob: slider-background,
      knobBefore: slider-knobBefore,
      knobAfter: slider-knobAfter
    },
  },
  com.badlogic.gdx.scenes.scene2d.ui.Image: {
    background: {
      drawable: shade
    },
    speaker-high: {
      drawable: speaker-high
    },
    speaker-medium: {
      drawable: speaker-medium
    },
    speaker-low: {
      drawable: speaker-low
    },
    line: {
      drawable: line
    },
    googlePlayGamesIcon-Off: {
      drawable: googlePlayGamesIcon-Off
    },
    googlePlayGamesIcon-On: {
      drawable: googlePlayGamesIcon-On
    },
  },
}

皮肤加载代码

skinMenu = new Skin(Gdx.files.internal(Constants.SKIN_MENU_UI));

报错堆栈

Exception Process: com.pixelvalue.connection, PID: 9821
a1.d0: Error reading file: images/menuTexture.json
  at com.badlogic.gdx.scenes.scene2d.ui.Skin.load (Skin.java)
  at com.badlogic.gdx.scenes.scene2d.ui.Skin.<init> (Skin.java)
  at com.pixelvalue.connection.screens.game.Game.<init> (Game.java)
  at com.pixelvalue.connection.screens.MainScreen.show (MainScreen.java)
  at com.badlogic.gdx.Game.setScreen (Game.java)
  at com.pixelvalue.connection.MyGdxGame.create (MyGdxGame.java)
  at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged (AndroidGraphics.java)
  at android.opengl.GLSurfaceView$GLThread.guardedRun (GLSurfaceView.java:1557)
  at android.opengl.GLSurfaceView$GLThread.run (GLSurfaceView.java:1272)
Caused by a1.d0: Error reading file: images/menuTexture.json
  at com.badlogic.gdx.utils.Json.fromJson (Json.java)
  at com.badlogic.gdx.scenes.scene2d.ui.Skin.load (Skin.java)
Caused by a1.d0:
  at com.badlogic.gdx.scenes.scene2d.ui.Skin$2.read (Skin.java)
  at com.badlogic.gdx.scenes.scene2d.ui.Skin$2.read (Skin.java)
  at com.badlogic.gdx.utils.Json.readValue (Json.java)
  at com.badlogic.gdx.scenes.scene2d.ui.Skin$1.readValue (Skin.java)
  at com.badlogic.gdx.utils.Json.fromJson (Json.java)
Caused by b1.e: Class not found: com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle
  at com.badlogic.gdx.utils.reflect.ClassReflection.forName (ClassReflection.java)
  at com.badlogic.gdx.scenes.scene2d.ui.Skin$2.read (Skin.java)
Caused by java.lang.ClassNotFoundException: com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle
  at java.lang.Class.classForName
  at java.lang.Class.forName (Class.java:454)
  at java.lang.Class.forName (Class.java:379)
  at com.badlogic.gdx.utils.reflect.ClassReflection.forName (ClassReflection.java)

文件路径

  • connection\assets\images\menuTexture.atlas
  • connection\assets\images\menuTexture.json
  • connection\assets\images\menuTexture.png

问题原因

Google Play发布版本默认启用R8代码混淆,混淆工具会移除它认为“未被使用”的类。而LibGDX的Skin是通过反射从JSON文件中加载UI样式类(如Button$ButtonStyle),这种间接引用无法被R8检测到,导致这些类被误删,最终加载Skin时抛出类找不到异常。

解决方案

1. 添加ProGuard/R8保留规则

在项目的proguard-rules.pro文件中添加以下规则,保留所有用到的LibGDX UI样式类:

# 保留LibGDX UI样式类,避免被R8混淆移除
-keep class com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle { *; }
-keep class com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle { *; }
-keep class com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle { *; }
-keep class com.badlogic.gdx.scenes.scene2d.ui.Image { *; }

如果需要覆盖更多UI组件,也可以使用更通用的规则:

-keep class com.badlogic.gdx.scenes.scene2d.ui.**$*Style { *; }
-keep class com.badlogic.gdx.scenes.scene2d.ui.Image { *; }

2. 本地验证发布版本

在上传Google Play前,先通过Android Studio生成签名发布包(Build > Generate Signed Bundle/APK),安装到测试设备上运行,确认问题已解决后再提交至Google Play控制台。

3. 检查构建配置

确保在build.gradle(Android模块)中,发布版本的混淆配置已正确引用proguard-rules.pro文件:

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

内容的提问来源于stack exchange,提问作者Ajax12Ajax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:55:14