Плагин Android Unity - класс не найден, исключение

Я хочу экспортировать библиотеку Android в Unity, но Android выдает следующую ошибку:

05-14 12:58:10.601 18408-18408/? E/AndroidRuntime: FATAL EXCEPTION: main
                                               Process: com.joostverbraeken.weargame, PID: 18408
                                               java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.joostverbraeken.weargame/com.joostverbraeken.weargame.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.joostverbraeken.weargame.MainActivity" on path: DexPathList[[zip file "/data/app/com.joostverbraeken.weargame-1/base.apk"],nativeLibraryDirectories=[/data/app/com.joostverbraeken.weargame-1/lib/arm, /data/app/com.joostverbraeken.weargame-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
at android.app.ActivityThread.access$900(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5436)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:735)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
                                                    Caused by: java.lang.ClassNotFoundException: Didn't find class "com.joostverbraeken.weargame.MainActivity" on path: DexPathList[[zip file "/data/app/com.joostverbraeken.weargame-1/base.apk"],nativeLibraryDirectories=[/data/app/com.joostverbraeken.weargame-1/lib/arm, /data/app/com.joostverbraeken.weargame-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newActivity(Instrumentation.java:1068)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2322)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) 
at android.app.ActivityThread.access$900(ActivityThread.java:153) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5436) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:735) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
                                                    Suppressed: java.lang.NoClassDefFoundError: com.joostverbraeken.weargame.MainActivity
at dalvik.system.DexFile.defineClassNative(Native Method)
at dalvik.system.DexFile.defineClass(DexFile.java:226)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
at dalvik.system.DexPathList.findClass(DexPathList.java:338)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
        ... 13 more
                                                    Suppressed: java.lang.ClassNotFoundException: com.joostverbraeken.weargame.MainActivity
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 12 more
                                                    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

Мой AndroidManifest (я скопировал его из своей библиотеки в Unity) выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.joostverbraeken.weargame">

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name">
        <activity android:name=".MainActivity"
            android:label="@string/app_name"
            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Зависимости довольно просты и объявлены в Gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'], exclude: ['classes.jar'])
    provided files('libs/classes.jar')
    wearApp project(':wear')
    compile 'com.google.android.gms:play-services:8.4.0'
    compile 'com.android.support:support-v4:23.4.0'
}

На форуме я прочитал, что Unity необходимо скопировать зависимости в Assets/Plugins/Android, хотя я использую aar вместо jar. Поэтому я также скопировал support-v4-23.3.0-sources.jar в Assets/Plugins/Android, но play-services-8.4.0.jar не потому, что он не включен в системные файлы Android. play-services-8.4.0.aar включен, но если я скопирую его в Unity, я получу следующую ошибку:

Moving
Temp/StagingArea\android-libraries\play-services-8.4.0\classes.jar to
Temp/StagingArea\android-libraries\play-services-8.4.0\bin\classes.jar:
The system cannot find the file specified.

Кто-нибудь знает, как решить ClassNotFoundException?


person Joost Verbraeken    schedule 14.05.2016    source источник
comment
Даже я сталкиваюсь с той же проблемой. Вы находите какое-либо решение для этого ??   -  person Nishant Anindya    schedule 16.06.2016


Ответы (3)


Я считаю, что это вызвано AndroidManifest.xml, который конфликтует с AndroidManifest.xml, сгенерированным Unity. Недружелюбно, что в этом случае единство не выдает никаких сообщений об ошибках, и это действительно отстой, который экспортирует только проект eclipse.

Сегодня я столкнулся с тем же исключением, поэтому я провел еще один тест и обнаружил, что ClassNotFoundException может быть создан только в классах Activity. Поэтому я экспортировал проект, импортировал проект в AndriodStudio и перекомпилировал его. У меня есть ошибка в AndroidManifest.xml, например, неправильная тема или неправильный значок и т. д.

После обновления всех неверных конфигураций в AndriodManifest.xml и пересборки AAR все заработало нормально.

Надеюсь, это поможет вам.

person Weibo    schedule 21.07.2016
comment
Вы никогда не заставляли его работать без экспорта проекта Unity в проект AndroidStudio? Мы превысили количество ссылок и подумали об использовании отдельных API-интерфейсов сервисов Google Play вместо того, чтобы копировать полную необработанную папку google_play_services_lib в нашу папку Plugins/Android. Но последние сервисы Google Play теперь в формате *.aar. И, как сказал Дефи, если мы включим *.aar в папку Plugins/Android, мы получим ошибку перемещения Temp/StagingArea.... - person Psylocke; 28.07.2016
comment
К сожалению, наши сборки автоматизированы, и мы не можем экспортировать проект Unity в AndroidStudio. Интересно, как мы могли бы уменьшить библиотеку сервисов Google Play, не нарушая наше приложение. :( Мы также получаем classNotFoundException в нашей mainActivity. - person Psylocke; 28.07.2016
comment
@Psylocke Вы автоматизировали интеграцию aar в единство? Я экспортировал некоторую библиотеку Android как aar в единстве, но каждый раз, когда я вношу некоторые изменения в свою библиотеку, мне приходится вручную копировать новый файл aar в единство и перестраивать проект. Можете ли вы помочь мне с автоматизацией этого процесса? - person Alireza A. Ahmadi; 06.07.2017

Если у кого-то еще есть проблема или что-то связанное с ней... Наконец-то я нашел решение, оно такое простое. Просто скопируйте вручную «support-v4-24.1.1.aar» в папку проекта плагина Unity. Или другой файл поддержки aar android. Он поставляется с SDK. В моем случае файл находился в "C:\AndroidSDK\extras\android\m2repository\com\android\support\support-v4\24.1.1"

Независимо от версии, вы должны быть уверены, что класс «FileProvider» находится внутри файла. Вы можете просто разархивировать файл aar с помощью winrar и быть уверенным, что класс там.

person juanram0n    schedule 22.01.2019

Спустя долгое время после того, как этот вопрос был опубликован, я нашел это, пытаясь понять, как решить аналогичную проблему.

Лучшим решением является использование следующего:

https://github.com/googlesamples/unity-jar-resolver

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

person Nikos    schedule 28.01.2020
comment
В чем преимущество добавления его прямо в банку? - person Nelles; 28.01.2020
comment
Если у вас есть два плагина в проекте, оба включают одинаковые зависимости в двоичном файле, это приведет к ошибке, при этом один или оба плагина не будут загружаться. Сопоставитель jar-файлов единства гарантирует, что только одна копия библиотеки будет включена в проект единства, независимо от того, сколькими подключаемыми модулями она используется. - person Nikos; 29.01.2020