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.atlasconnection\assets\images\menuTexture.jsonconnection\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
相关产品推荐
相关产品推荐

