javafxports multidex minSdkVersion установлен на 20 или меньше

Исследовал причину, указанную в этой проблеме. Ссылка на первоначальную причину проблемы. Решение состоит в том, чтобы реализовать обязательное использование мультидексной библиотеки Android в версиях Android SDK 20 или менее.

Теперь вопрос заключается в том, как реализовать решение, подробно описанное по этой ссылке. Использование мультидекса, если для minSdkVersion установлено значение 20 или ниже.

Выписка из ссылки.

Если вы переопределите класс Application, измените его на расширение 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

Вопрос - как реализовать мультидексное решение при расширении javafx.application.Application при использовании javafxports?

Теперь включая 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>

1 ответ

Пожалуйста, посмотрите на пример проекта, который мне нужно было создать в порядке, чтобы решить проблему с рендерингом пользовательского интерфейса. Первоначально он был очень медленным и занимал до 7 с (2 с разбор FXML, около 5 с замороженный пользовательский интерфейс) на моем Nexus 6 и теперь снижается до прибл. 2.5s.

Вот Манифест:

<?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>

Замечания: 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'
    }
    }
}

Я создал настройку Android/Desktop с плагином IDE для Eclipse (но это не должно иметь значения).

Я только что перепроверил его, собрал и проверил, что в файле два dex build/javafxports/tmp/android/dex:

  • classes.dex
  • classes2.dex

Я запустил сборку через задачу androidInstall и приложение работает, как и ожидалось, на тестовом устройстве Nexus 5.

Поэтому, пожалуйста: сравните эти файлы с вашей настройкой. Попробуйте собрать и установить его. Как я уже сказал: у меня хорошо работает...


Кроме того, я читал в другом посте здесь, на Stackru, который решил проблему dex, просто используя правильный JDK (64-битный вместо 32-битный). Поэтому убедитесь, что у вас все в порядке с Gradle и Manifest.

Другие вопросы по тегам