我正在尝试测试LibGDX开发,并且在尝试使最基本的应用程序在我的android手机上运行时遇到错误,因为我的 keystore 或它的使用方式存在问题,但我没有确定到底是什么问题。

在更详细地描述问题和我尝试过的事情之前,我将首先描述有关我的环境的一些事情:

我在用:

 - `Android Studio 3.1.4,`              with
 - `Gradle 4.6`                         inside of it, my os is
 - `Linux Mint 18.1 (Serena)            (which is based on...
 -  `Ubuntu 16.04`,                     my kernel is
 -  `Linux 4.4.0-53-generic`.

在尝试解决此问题时,我多次生成了一个新的keypass s, sometimes using the command line, and sometimes through Android Studio's "Build" -> "Generate Signed APK" -> "Create New..."选项。

我生成的最新版本正在使用该“Build" -> "Generate Signed SPK" -> "Create New..."选项

然后经过大量的努力,我最终意识到我必须将我的 keystore 添加到我的gradle文件中,这是我做错的第一件事,最终我偶然发现了"File" -> "Project Structure" -> "android" -> "Signing"选项,单击绿色的“+”号并填充命名为“ key 别名”,“ key 密码”,“存储文件”和“存储密码”,并确保它们与我创建的最新 key 密码匹配。

创建签名后,我选择了它,然后单击“确定”,然后在gradle文件中确实看到了该文件,该文件已添加到我的gradle android模块中

我将gradle文件与我的应用程序重新同步,然后清理了我的应用程序。

但是,当我尝试重建我的应用程序或运行它并单击通过我插入的Android Phone运行它的选项时,我收到了错误消息:
Cause: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded

我已经尝试过一些研究来解决此问题,一种可能是我使用了错误的密码,但是此后我一直很小心以确保使用了正确的密码,但这并没有解决。

经过研究后,我发现的另一个可能性是, keystore 的密码有某些规则,我认为其中不使用特殊字符的情况就是其中之一,因此,我确保遵循该规则。

但是我也知道有2种不同的密码,也许它们有不同的规则,但是我不确定那是我的问题,我认为这是另外一回事。

非常感谢您为解决此签名问题提供的帮助,非常感谢。

编辑:我要添加一些我的gradle文件内容:
Gradle Scripts
    - `build.gradle` (Project: MyGDXGame4)
buildscript {


    repositories {
        //mavenLocal()
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" }
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        jcenter()
        google()
    }
    dependencies {
        classpath 'org.wisepersist:gwt-gradle-plugin:1.0.6'
        classpath 'com.android.tools.build:gradle:3.1.4'
        classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.3'
        classpath 'org.multi-os-engine:moe-gradle:1.4.0'


    }
}

allprojects {
    apply plugin: "eclipse"
    apply plugin: "idea"

    version = '1.0'
    ext {
        appName = "my-gdx-game4"
        gdxVersion = '1.9.8'
        roboVMVersion = '2.3.3'
        box2DLightsVersion = '1.4'
        ashleyVersion = '1.7.0'
        aiVersion = '1.8.0'
    }

    repositories {
        //mavenLocal()
        mavenCentral()
        jcenter()
        google()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        maven { url "https://oss.sonatype.org/content/repositories/releases/" }
    }
}

project(":desktop") {
    apply plugin: "java"


    dependencies {
        implementation project(":core")
        implementation "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
        implementation "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-desktop"
        implementation "com.badlogicgames.gdx:gdx-tools:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-controllers-desktop:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-controllers-platform:$gdxVersion:natives-desktop"
        implementation "de.tomgrill.gdxfacebook:gdx-facebook-desktop:1.4.1"
        implementation "de.tomgrill.gdxdialogs:gdx-dialogs-desktop:1.2.5"

    }
}

project(":android") {
    apply plugin: "android"

    configurations { natives }

    dependencies {
        implementation project(":core")
        implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
        implementation "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-arm64-v8a"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86_64"
        implementation "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-ai:$aiVersion"
        implementation "com.badlogicgames.ashley:ashley:$ashleyVersion"
        implementation "com.badlogicgames.box2dlights:box2dlights:$box2DLightsVersion"
        implementation "de.tomgrill.gdxfacebook:gdx-facebook-android:1.4.1"
        implementation "de.tomgrill.gdxdialogs:gdx-dialogs-android:1.2.5"

    }
}

project(":ios") {
    apply plugin: "java"
    apply plugin: "robovm"


    dependencies {
        implementation project(":core")
        implementation "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
        implementation "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
        implementation "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
        implementation "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-ios"
        implementation "de.tomgrill.gdxfacebook:gdx-facebook-ios:1.4.1"
        implementation "de.tomgrill.gdxdialogs:gdx-dialogs-ios:1.2.5"

    }
}

project(":html") {
    apply plugin: "gwt"
    apply plugin: "war"


    dependencies {
        implementation project(":core")
        implementation "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
        implementation "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
        implementation "com.badlogicgames.gdx:gdx-box2d:$gdxVersion:sources"
        implementation "com.badlogicgames.gdx:gdx-box2d-gwt:$gdxVersion:sources"
        implementation "com.badlogicgames.gdx:gdx-controllers:$gdxVersion:sources"
        implementation "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion:sources"
        implementation "com.badlogicgames.gdx:gdx-ai:$aiVersion:sources"
        implementation "com.badlogicgames.ashley:ashley:$ashleyVersion:sources"
        implementation "com.badlogicgames.box2dlights:box2dlights:$box2DLightsVersion:sources"
        implementation "net.dermetfan.libgdx-utils:libgdx-utils:0.13.4:sources"
        implementation "com.kotcrab.vis:vis-ui:1.3.0:sources"
        implementation "net.dermetfan.libgdx-utils:libgdx-utils:0.13.4:sources"
        implementation "net.dermetfan.libgdx-utils:libgdx-utils-box2d:0.13.4:sources"
        implementation "de.tomgrill.gdxfacebook:gdx-facebook-core:1.4.1:sources"
        implementation "de.tomgrill.gdxfacebook:gdx-facebook-html:1.4.1:sources"
        implementation "de.tomgrill.gdxdialogs:gdx-dialogs-html:1.2.5"
        implementation "de.tomgrill.gdxdialogs:gdx-dialogs-html:1.2.5:sources"
        compile "de.tomgrill.gdxdialogs:gdx-dialogs-core:1.2.5:sources"
        implementation "com.github.czyzby:gdx-kiwi:1.9.1.9.6:sources"
        implementation "com.github.czyzby:gdx-kiwi:1.9.1.9.6:sources"
        implementation "com.github.czyzby:gdx-lml:1.9.1.9.6:sources"
        implementation "com.github.czyzby:gdx-lml-vis:1.9.1.9.6:sources"
        implementation "com.kotcrab.vis:vis-ui:1.3.0:sources"
        implementation "com.github.czyzby:gdx-kiwi:1.9.1.9.6:sources"
        implementation "com.github.czyzby:gdx-lml:1.9.1.9.6:sources"

    }
}

project(":core") {
    apply plugin: "java"


    dependencies {
        implementation "com.badlogicgames.gdx:gdx:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
        implementation "com.badlogicgames.gdx:gdx-ai:$aiVersion"
        implementation "com.badlogicgames.ashley:ashley:$ashleyVersion"
        implementation "com.badlogicgames.box2dlights:box2dlights:$box2DLightsVersion"
        implementation "net.dermetfan.libgdx-utils:libgdx-utils:0.13.4"
        implementation "com.kotcrab.vis:vis-ui:1.3.0"
        implementation "net.dermetfan.libgdx-utils:libgdx-utils-box2d:0.13.4"
        implementation "de.tomgrill.gdxfacebook:gdx-facebook-core:1.4.1"
        compile "de.tomgrill.gdxdialogs:gdx-dialogs-core:1.2.5"
        implementation "com.github.czyzby:gdx-kiwi:1.9.1.9.6"
        implementation "com.github.czyzby:gdx-lml-vis:1.9.1.9.6"
        implementation "com.github.czyzby:gdx-lml:1.9.1.9.6"

    }
}

project(":ios-moe") {
    apply plugin: "moe"

    configurations { natives }

    dependencies {
        implementation project(":core")
        implementation "com.badlogicgames.gdx:gdx-backend-moe:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
        natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-ios"
        implementation "de.tomgrill.gdxfacebook:gdx-facebook-ios-moe:1.4.1"
        implementation "de.tomgrill.gdxdialogs:gdx-dialogs-ios-moe:1.2.5"

    }
}

tasks.eclipse.doLast {
    delete ".project"
}

  • build.gradle (Module: android)

  • (请注意,我在实际的gradle文件中将key_pass keyAlias,keyPassword,storeFile和storePassword替换为“*****”,它们是不同的
    android {
        signingConfigs {
            key_pass {
                keyAlias '*****'
                keyPassword '******'
                storeFile file('*****')
                storePassword '*****'
            }
        }
        buildToolsVersion "27.0.3"
        compileSdkVersion 27
        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
                jniLibs.srcDirs = ['libs']
            }
    
        }
        packagingOptions {
            exclude 'META-INF/robovm/ios/robovm.xml'
        }
        defaultConfig {
            applicationId "com.mygdx.game4"
            minSdkVersion 19
            targetSdkVersion 27
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        productFlavors {
        }
    }
    // called every time gradle gets executed, takes the native dependencies of
    // the natives configuration, and extracts them to the proper libs/ folders
    // so they get packed with the APK.
    task copyAndroidNatives() {
        file("libs/armeabi/").mkdirs();
        file("libs/armeabi-v7a/").mkdirs();
        file("libs/arm64-v8a/").mkdirs();
        file("libs/x86_64/").mkdirs();
        file("libs/x86/").mkdirs();
    
        configurations.natives.files.each { jar ->
            def outputDir = null
            if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
            if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
            if (jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
            if (jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
            if (jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
            if (outputDir != null) {
                copy {
                    from zipTree(jar)
                    into outputDir
                    include "*.so"
                }
            }
        }
    }
    task run(type: Exec) {
        def path
        def localProperties = project.file("../local.properties")
        if (localProperties.exists()) {
            Properties properties = new Properties()
            localProperties.withInputStream { instr ->
                properties.load(instr)
            }
            def sdkDir = properties.getProperty('sdk.dir')
            if (sdkDir) {
                path = sdkDir
            } else {
                path = "$System.env.ANDROID_HOME"
            }
        } else {
            path = "$System.env.ANDROID_HOME"
        }
    
        def adb = path + "/platform-tools/adb"
        commandLine "$adb", 'shell', 'am', 'start', '-n', 'com.mygdx.game4/com.mygdx.game4.AndroidLauncher'
    }
    // sets up the Android Eclipse project, using the old Ant based build.
    eclipse {
        // need to specify Java source sets explicitly, SpringSource Gradle Eclipse plugin
        // ignores any nodes added in classpath.file.withXml
        sourceSets {
            main {
                java.srcDirs "src", 'gen'
            }
        }
    
        jdt {
            sourceCompatibility = 1.6
            targetCompatibility = 1.6
        }
    
        classpath {
            plusConfigurations += [project.configurations.compile]
            containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES'
        }
    
        project {
            name = appName + "-android"
            natures 'com.android.ide.eclipse.adt.AndroidNature'
            buildCommands.clear();
            buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder"
            buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder"
            buildCommand "org.eclipse.jdt.core.javabuilder"
            buildCommand "com.android.ide.eclipse.adt.ApkBuilder"
        }
    }
    // sets up the Android Idea project, using the old Ant based build.
    idea {
        module {
            sourceDirs += file("src");
            scopes = [COMPILE: [plus: [project.configurations.compile]]]
    
            iml {
                withXml {
                    def node = it.asNode()
                    def builder = NodeBuilder.newInstance();
                    builder.current = node;
                    builder.component(name: "FacetManager") {
                        facet(type: "android", name: "Android") {
                            configuration {
                                option(name: "UPDATE_PROPERTY_FILES", value: "true")
                            }
                        }
                    }
                }
            }
        }
    }
    dependencies {
    }
    
     - `build.gradle (Module: core)`
    
    apply plugin: "java"
    
    sourceCompatibility = 1.6
    [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
    
    sourceSets.main.java.srcDirs = [ "src/" ]
    
    
    eclipse.project {
        name = appName + "-core"
    }
    
     - `gradle-wrapper.properties (Gradel Version)`
    
    #Sun Dec 30 13:51:33 EST 2018
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
    
    - `proguard-rules.pro`
    
    # To enable ProGuard in your project, edit project.properties
    # to define the proguard.config property as described in that file.
    #
    # Add project specific ProGuard rules here.
    # By default, the flags in this file are appended to flags specified
    # in ${sdk.dir}/tools/proguard/proguard-android.txt
    # You can edit the include path and order by changing the ProGuard
    # include property in project.properties.
    #
    # For more details, see
    #   http://developer.android.com/guide/developing/tools/proguard.html
    
    # Add any project specific keep options here:
    
    # If your project uses WebView with JS, uncomment the following
    # and specify the fully qualified class name to the JavaScript interface
    # class:
    #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
    #   public *;
    #}
    
    -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
    
    -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.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);
    }
    
     - `gradle.properties`
    
    org.gradle.daemon=true
    org.gradle.jvmargs=-Xms128m -Xmx1500m
    org.gradle.configureondemand=false
    
     - `settings.gradle`
    
    include 'desktop', 'android', 'ios', 'html', 'core', 'ios-moe'
    
     - `local.properties`
    
    # Location of the android SDK
    sdk.dir=/home/Android/Sdk
    

    最佳答案

    好吧,我发现了问题,我只是缺少了一个额外的步骤,我不得不去“项目属性”->“模块:android”下的“构建类型”,并选择我认为我已经选择了的 keystore ,方法是在下面突出显示它签名。

    09-28 00:10