研究了此问题中发现的原因Link to initial cause of issue。解决方案是在Android sdk 20或更低版本上实现android multidex库的必要使用。
现在的问题是如何实施此链接详细解决方案Using multidex when minSdkVersion is set to 20 or lower
从链接中提取。
如果您覆盖Application类,请将其更改为extend MultiDexApplication(如果可能)如下:
public class MyApplication extends MultiDexApplication { ... }
或者如果你覆盖Application类但是不可能 更改基类,然后您可以改为覆盖 attachBaseContext()方法并调用MultiDex.install(this)来启用 multidex:
public class MyApplication extends SomeOtherApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(context); Multidex.install(this); } }
上述代码中提到的类的完整包名称是
android.support.multidex.MultiDexApplication
android.app.Application
javafx应用程序扩展了javafx.application.Application
问题是 - 在使用javafxports时如何在扩展javafx.application.Application
时实现multidex解决方案?
现在包括AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ie.murphysoftware.games.magnatron"
android:versionCode="5"
android:versionName="5.0">
<supports-screens android:xlargeScreens="true" />
<uses-sdk android:minSdkVersion="21"/>
<application android:icon="@drawable/magnatron_icon" android:label="@string/app_name">
<activity android:name="javafxports.android.FXActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<meta-data android:name="launcher.class" android:value="javafxports.android.DalvikLauncher" />
<!-- Full name of the application class to run -->
<meta-data android:name="main.class"
android:value="ie.murphysoftware.games.magnatron.MagnatronStart" />
<!-- Jvm arguments (delimiter |) -->
<meta-data android:name="jvm.args"
android:value="-Djavafx.verbose=true|-Djavafx.name=value" />
<!--This meta-data tag is required to use Google Play Services.-->
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<!-- Application arguments (delimiter |) -->
<meta-data android:name="app.args" android:value="arg1|arg2" />
<!-- Jdwp debugging port. Don't forget to forward port (adb forward tcp:port1 tcp:port2) -->
<meta-data android:name="debug.port" android:value="0" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="com.android.vending.BILLING"></uses-permission>
</manifest>
答案 0 :(得分:0)
请查看示例项目,我需要按顺序创建以解决UI呈现问题。最初它在我的Nexus 6上非常慢并占用了7s(2s FXML解析,大约5s冻结UI),现在已降至约。 2.5秒。
这是清单:
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="eu.dzim.example" android:versionCode="1" android:versionName="1.0">
<supports-screens android:xlargeScreens="true"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="21"/>
<application android:label="ExampleProject" android:name="android.support.multidex.MultiDexApplication" android:icon="@mipmap/ic_launcher">
<activity android:name="javafxports.android.FXActivity" android:label="ExampleProject" android:configChanges="orientation|screenSize">
<meta-data android:name="main.class" android:value="eu.dzim.example.Main"/>
<meta-data android:name="debug.port" android:value="0"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
{p> 注意: android:name="android.support.multidex.MultiDexApplication"
标记上的<application>
。
Gradle文件如下所示:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.javafxports:jfxmobile-plugin:1.2.0'
}
}
apply plugin: 'org.javafxports.jfxmobile'
repositories {
jcenter()
maven {
url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
}
}
mainClassName = 'eu.dzim.example.Main'
dependencies {
compile 'com.gluonhq:charm:4.2.0'
compile 'org.controlsfx:controlsfx:8.40.12'
compile 'de.jensd:fontawesomefx-commons:8.13'
compile 'de.jensd:fontawesomefx-fontawesome:4.7.0'
compile 'de.jensd:fontawesomefx-materialdesignfont:1.7.22'
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.4'
compileNoRetrolambda 'com.airhacks:afterburner.mfx:1.6.2'
}
jfxmobile {
downConfig {
version = '3.1.0'
plugins 'display', 'lifecycle', 'statusbar', 'storage', 'settings'
}
android {
manifest = 'src/android/AndroidManifest.xml'
compileSdkVersion = 22
minSdkVersion = 19
targetSdkVersion = 22
dexOptions {
javaMaxHeapSize '2g'
}
packagingOptions {
pickFirst 'META-INF/LICENSE'
pickFirst 'META-INF/NOTICE'
pickFirst 'license/LICENSE.txt'
}
}
}
我使用Eclipse的IDE插件创建了Android / Desktop设置(但这无关紧要)。
我只是重新检查它,构建并验证,build/javafxports/tmp/android/dex
中有两个dex文件:
我通过任务androidInstall
触发了构建,并且应用程序在Nexus 5测试设备上按预期运行。
所以请:将这些文件与您的设置进行比较。尝试构建并安装它。正如我所说:它对我来说很好......
此外,我在StackOverflow上阅读了其他一些帖子,通过简单地使用正确的JDK(64位而不是32位)解决了一个dex问题。所以请确保您在Gradle和Manifest旁边的设置也没问题。