Установка Android ищет классы не в том месте

Чтобы устранить более серьезную проблему, я создал пример приложения, в котором я могу проверить, где проблема (ы). Код в основном такой же, как тот, который генерируется мастером единого представления.

Когда я запускаю его на рабочем столе через appliaction > run, он работает нормально. Когда я запускаю его со своего устройства через other > androidInstall, я получаю черный экран (до этого я также запускал clean). Итак, я запустил adb logcat и обнаружил эту ошибку:

E DalvikLauncher: java.lang.ClassNotFoundException: не найден класс "com.gluonapplication.GluonApplication" по пути: DexPathList[[zip-файл "/data/app/com.gluonapplication-1/base.apk"],nativeLibraryDirectories=[ /data/app/com.gluonapplication-1/lib/arm, /data/app/com.gluonapplication-1/base.apk!/lib/armeabi, /vendor/lib, /system/lib]]

что неудивительно, потому что там нет класса. Основной класс находится в main.GluonApplication (возможно, неправильное имя пакета, но это тестовое приложение). build.gradle конкретно указывает mainClassName = 'main.GluonApplication'. Так почему версия для Android ищет где-то еще? Есть ли манифест, который мне нужно отредактировать/воссоздать? Есть ли какое-то кэширование где-то, где предыдущие версии приложения могут находиться и влиять на текущую версию?


person Mark    schedule 23.03.2017    source источник


Ответы (1)


Всякий раз, когда вы используете подключаемый модуль IDE для создания проекта, в папку src/android/ добавляется манифест по умолчанию AndroidManifest.xml.

Если вы откроете его, вы найдете назначенное имя пакета, которое будет соответствовать пакету основного класса, и его полное имя.

Согласно тому, что вы найдете в своем журнале, это будет ваш текущий манифест:

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          package="com.gluonapplication" 
          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="GluonApplication" android:name="android.support.multidex.MultiDexApplication" android:icon="@mipmap/ic_launcher">
                <activity android:name="javafxports.android.FXActivity" android:label="GoNative" android:configChanges="orientation|screenSize">
                        <meta-data android:name="main.class" android:value="com.gluonapplication.GluonApplication"/>
                        <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 вам нужно как минимум два слова и точка для действительного имени пакета, например com.gluonapplication.

person José Pereda    schedule 23.03.2017
comment
Ага, так для чего нужны смешанные и целевые версии SDK, если я укажу это в файле gradle? И может ли манифест не обновляться автоматически из файла gradle с информацией о пакете и версиях? - person Mark; 23.03.2017
comment
Об имени пакета: я просто изменил манифест package и android:value на свой main.GluonApplication, и это сработало. Итак, когда вы говорите как минимум 2 слова, вы имеете в виду package.subPackage.Class или достаточно package.Class? - person Mark; 23.03.2017
comment
Имя пакета используется для уникальной идентификации вашего приложения в Google Play, и рекомендуется использовать перевернутые доменные имена, для которых требуется как минимум два сегмента/слова. - person José Pereda; 23.03.2017
comment
Что касается вашего первого комментария: если у вас есть манифест по умолчанию, он не будет редактироваться из файла сборки, поэтому вам придется редактировать его самостоятельно. Если вы удалите этот манифест, будет создан новый, который будет включать значения из файла сборки. - person José Pereda; 23.03.2017