I am trying to test out LibGDX development, and I am getting an error trying to get even the most basic app to run on my android phone, because there is some problem with my keystore or in how it's being used, and I'm not sure exactly what that problem is.
Before, describing the problem in further detail and what I've tried, I will first describe some things about my environment:
I am using:
- `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`.
In trying to solve this problem, I have generated a new keypass many times, sometimes using the command line, and sometimes through Android Studio's "Build" -> "Generate Signed APK" -> "Create New..."
option.
The latest one I have generated was using that "Build" -> "Generate Signed SPK" -> "Create New..."
option
Then after a lot of struggle, I eventually realized that I had to add my keystore to my gradle file, which was the first thing I was doing wrong, and I eventually stumbled upon the "File" -> "Project Structure" -> "android" -> "Signing"
option, clicked the Green "+" sign and filled out a Name, the "Key Alias", "Key Password", "Store File" and "Store Password", making sure that they matched the latest keypass I had created.
after creating the signing, I selected it, and clicked "OK" and then saw that indeed in my gradle file, that was added to my gradle android module
I re-synced the gradle file with my app, and then cleaned my app.
But, when I attempted to rebuild my app, or run it and click on the option for running it through my plugged in Android Phone, I get the error message:
Cause: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded
I had done some research in trying to fix this, and one possibility was that I was using the wrong passwords, but I have since been careful to make sure that I used the right passwords, and that did not fix it.
Another possibility I found after doing some research, was that there are certain rules for the passwords for the keystore, and I think not using special characters was one of the them, so I made sure I followed that rule.
But I also know there are 2 different passwords, maybe they have different rules, but I'm not sure that's my problem, I think it's something else.
I would very much appreciate help in fixing this signing issue, thank you very much.
Edit: I am going to add some of my gradle file contents:
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)
(Please Note, I have replaced the key_pass keyAlias, keyPassword, storeFile & storePassword with '*****', in the actual gradle file, they are different
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