在 Google Play 商店发布后,需要哪些 R8 规则才能制作带有 libgdx 游戏的 android 应用程序?

Which R8 rules are necessary to make an android app with a libgdx game work once published in the Google Play Store?

我正在尝试发布一个包含 libgdx 小游戏的 android 应用程序,它在调试模式下应用 R8 (minifyEnabled true) 后工作正常,但是当我在发布模式下执行它并且在 Play 商店中发布它,当我按下打开 libgdx 游戏的按钮时,应用程序崩溃了。我使用 Android Studio 版本 4.0

我已经用不同的 R8 规则尝试了几次,但是 none 它们在生产时有效。

我在 Android 模块中的代码:

build.gradle(:android)

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

proguard-rules.pro

-verbose

-dontwarn android.support.**
-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
-dontwarn com.badlogic.gdx.utils.GdxBuild
-dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild
-dontwarn com.badlogic.gdx.jnigen.BuildTarget*
-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild




#-keep class com.badlogic.gdx.controllers.android.AndroidControllers
# tried changing AndroidControllers with line:
-keep class com.badlogic.gdx.controllers.android.*

# tried adding this one
#-keep class com.ongngo.game.AndroidLauncher  

#    -keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
#       <init>(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
#    }

# tried separating AndroidInputs
    -keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput {
       <init>(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
    }
    -keepclassmembers class com.badlogic.gdx.backends.android.AndroidInputThreePlus {
       <init>(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
    }

# tried with this
-keepclassmembers class com.ongngo.game.CoreAndroidInterface
-keepclassmembers class com.ongngo.game.AndroidLauncher
-dontwarn com.badlogic.gdx.**
-dontnote com.badlogic.gdx.**
-keepclassmembers class com.badlogic.gdx.graphics.Cubemap* { *; }
-keepclassmembers class com.badlogic.gdx.graphics.GL* { *; }
#


-keepclassmembers class com.badlogic.gdx.physics.box2d.World {
   boolean contactFilter(long, long);
   void    beginContact(long);
   void    endContact(long);
   void    preSolve(long, long);
   void    postSolve(long, long);
   boolean reportFixture(long);
   float   reportRayFixture(long, float, float, float, float, float);
}

MainActivity.kt:

onCreate(...) 
        ...
        coreAndroidInterface = object : CoreAndroidInterface {
            override fun updateLifes(lifes: Int) {
                var lifesVar = lifes
                if (lifes < 0) {
                    lifesVar = 0
                }

                MainActivity.LIFES = lifesVar
                prefs.lifes = lifesVar
            }
        } 

片段中的一个按钮(取决于 MainActivity)启动 AndroidLauncher.k:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val config = AndroidApplicationConfiguration()
        config.useAccelerometer = false
        config.useCompass = false
        initialize(MyGame(MainActivity.LIFES!!, MainActivity.coreAndroidInterface), config)
    }
} 

核心模块中的代码:

CoreAndroidInterface.kt

interface CoreAndroidInterface {
    fun updateLifes(lifes : Int)
} 

MyGame.java

public class MyGame extends Game implements ApplicationListener {
private final CoreAndroidInterface coreAndroidInterface;
...
    public MyGame(int vidas, CoreAndroidInterface coreAndroidInterface) {//constructor
        this.LIFES = lifes;
        this.coreAndroidInterface = coreAndroidInterface;
    }

当应用程序崩溃时,我从 Google Play 控制台得到的错误是:

 java.lang.ClassNotFoundException
com.ongngo.game.AndroidLauncher.onCreate 

类型: java.lang.RuntimeException

堆栈跟踪:

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2795)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2873)
  at android.app.ActivityThread.-wrap11 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1602)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6543)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)
Caused by: java.lang.RuntimeException: 
  at com.badlogic.gdx.backends.android.AndroidInputFactory.newAndroidInput (AndroidInputFactory.java:65)
  at com.badlogic.gdx.backends.android.AndroidApplication.init (AndroidApplication.java:34)
  at com.badlogic.gdx.backends.android.AndroidApplication.initialize (AndroidApplication.java:1)
  at com.ongngo.game.AndroidLauncher.onCreate (AndroidLauncher.java:36)
  at android.app.Activity.performCreate (Activity.java:7023)
  at android.app.Activity.performCreate (Activity.java:7014)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2748)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2873)
  at android.app.ActivityThread.-wrap11 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1602)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6543)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)
Caused by: java.lang.ClassNotFoundException: 
  at java.lang.Class.classForName (Class.java)
  at java.lang.Class.forName (Class.java:453)
  at java.lang.Class.forName (Class.java:378)
  at com.badlogic.gdx.backends.android.AndroidInputFactory.newAndroidInput (AndroidInputFactory.java:8)
  at com.badlogic.gdx.backends.android.AndroidApplication.init (AndroidApplication.java:34)
  at com.badlogic.gdx.backends.android.AndroidApplication.initialize (AndroidApplication.java:1)
  at com.ongngo.game.AndroidLauncher.onCreate (AndroidLauncher.java:36)
  at android.app.Activity.performCreate (Activity.java:7023)
  at android.app.Activity.performCreate (Activity.java:7014)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2748)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2873)
  at android.app.ActivityThread.-wrap11 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1602)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6543)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)
Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:125)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:379)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
  at java.lang.Class.classForName (Class.java)
  at java.lang.Class.forName (Class.java:453)
  at java.lang.Class.forName (Class.java:378)
  at com.badlogic.gdx.backends.android.AndroidInputFactory.newAndroidInput (AndroidInputFactory.java:8)
  at com.badlogic.gdx.backends.android.AndroidApplication.init (AndroidApplication.java:34)
  at com.badlogic.gdx.backends.android.AndroidApplication.initialize (AndroidApplication.java:1)
  at com.ongngo.game.AndroidLauncher.onCreate (AndroidLauncher.java:36)
  at android.app.Activity.performCreate (Activity.java:7023)
  at android.app.Activity.performCreate (Activity.java:7014)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2748)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2873)
  at android.app.ActivityThread.-wrap11 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1602)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6543)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:438)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807)

问题跟踪器上有一个 issue for this exact problem。要么更新到 libgdx 1.9.11,要么在更新之前禁用 R8。您可以改用 Proguard。