WearableListView ClassNotFoundException Поддържа v4 ArrayMap

Добре, това е забавно: използвам Android Studio 1.1.0, имам приложение за Android и свързано приложение за Android Wear, което се опитвам да тествам на устройство за смарт часовник. Поставих клас файловете, които използвах в моето приложение за Android, в модул на библиотека на Android, след което го добавих като зависимост в моето приложение за Android Wear. Приложението се изгражда и внедрява в смарт часовника, но когато се стартира, получавам изключение по-долу и проследяване на стека. Всякакви предложения ще бъдат оценени. Благодаря ти!

04-17 21:55:45.764    7759-7759/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.myapp.wear, PID: 7759
    android.view.InflateException: Binary XML file line #12: Error inflating class android.support.wearable.view.WearableListView
            at android.view.LayoutInflater.createView(LayoutInflater.java:633)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
            at android.support.wearable.view.WatchViewStub.inflate(WatchViewStub.java:179)
            at android.support.wearable.view.WatchViewStub.onApplyWindowInsets(WatchViewStub.java:148)
            at android.view.View.dispatchApplyWindowInsets(View.java:6514)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5782)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5786)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5786)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchApplyWindowInsets(PhoneWindow.java:2333)
            at android.view.ViewRootImpl.dispatchApplyInsets(ViewRootImpl.java:1205)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1423)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
            at android.view.LayoutInflater.createView(LayoutInflater.java:607)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
            at android.support.wearable.view.WatchViewStub.inflate(WatchViewStub.java:179)
            at android.support.wearable.view.WatchViewStub.onApplyWindowInsets(WatchViewStub.java:148)
            at android.view.View.dispatchApplyWindowInsets(View.java:6514)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5782)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5786)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5786)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchApplyWindowInsets(PhoneWindow.java:2333)
            at android.view.ViewRootImpl.dispatchApplyInsets(ViewRootImpl.java:1205)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1423)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/util/ArrayMap;
            at android.support.v7.widget.RecyclerView$State.<init>(RecyclerView.java:7461)
            at android.support.v7.widget.RecyclerView.<init>(RecyclerView.java:233)
            at android.support.wearable.view.WearableListView.<init>(WearableListView.java:151)
            at android.support.wearable.view.WearableListView.<init>(WearableListView.java:147)
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
            at android.view.LayoutInflater.createView(LayoutInflater.java:607)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
            at android.support.wearable.view.WatchViewStub.inflate(WatchViewStub.java:179)
            at android.support.wearable.view.WatchViewStub.onApplyWindowInsets(WatchViewStub.java:148)
            at android.view.View.dispatchApplyWindowInsets(View.java:6514)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5782)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5786)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5786)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchApplyWindowInsets(PhoneWindow.java:2333)
            at android.view.ViewRootImpl.dispatchApplyInsets(ViewRootImpl.java:1205)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1423)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.util.ArrayMap" on path: DexPathList[[zip file "/data/app/com.myapp.wear-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.wear-1/lib/arm, /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.support.v7.widget.RecyclerView$State.<init>(RecyclerView.java:7461)
            at android.support.v7.widget.RecyclerView.<init>(RecyclerView.java:233)
            at android.support.wearable.view.WearableListView.<init>(WearableListView.java:151)
            at android.support.wearable.view.WearableListView.<init>(WearableListView.java:147)
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
            at android.view.LayoutInflater.createView(LayoutInflater.java:607)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
            at android.support.wearable.view.WatchViewStub.inflate(WatchViewStub.java:179)
            at android.support.wearable.view.WatchViewStub.onApplyWindowInsets(WatchViewStub.java:148)
            at android.view.View.dispatchApplyWindowInsets(View.java:6514)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5782)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5786)
            at android.view.ViewGroup.dispatchApplyWindowInsets(ViewGroup.java:5786)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchApplyWindowInsets(PhoneWindow.java:2333)
            at android.view.ViewRootImpl.dispatchApplyInsets(ViewRootImpl.java:1205)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1423)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
    Suppressed: java.lang.ClassNotFoundException: android.support.v4.util.ArrayMap
            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)
            ... 36 more
     Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

Ето визуализация на конфигурациите и модулите на gradle: library configконфигурация за носене


person Aaron Mathew Crayford    schedule 18.04.2015    source източник
comment
Какво имате предвид под „поставих клас файловете, използвани в моето приложение за Android“ – има ли причина да не добавяте просто библиотеката за поддръжка на преносими устройства като зависимост във вашия build.gradle файл?   -  person ianhanniballake    schedule 19.04.2015
comment
Не можах да използвам пространството от имена и последващите класове от моето основно приложение в моето приложение за носими устройства, тъй като беше отделен модул и този модул не беше библиотека. Затова ги копирах в библиотека, за да мога да ги използвам в приложението Wear. Искате да кажете, че приложението Wear не трябва да се настройва като отделен модул в Android Studio? Благодаря!   -  person Aaron Mathew Crayford    schedule 19.04.2015
comment
Добавих няколко екранни снимки, за да внеса яснота в случай, че не го обяснявам добре.   -  person Aaron Mathew Crayford    schedule 19.04.2015


Отговори (4)


Видях това java.lang.ClassNotFoundException: android.support.v4.util.ArrayMap във вашето проследяване на logcat. И мисля, че може би версията на вашите v4 и v7 причинява тази грешка. Вашата библиотека за поддръжка на v4 и v7 е актуална? Между другото, ArrayMap може да се използва само за Android API 21+

person SilentKnight    schedule 19.04.2015
comment
Добро хващане. Грешка на новобранец от моя страна. Благодаря ти! - person Aaron Mathew Crayford; 19.04.2015

В моя случай реших този проблем, като изтрих android-support-v4.jar, защото е стар и всъщност няма ArrayMap.class и сложих този от \extras\android\support\v4 в моята папка lib и след това го добавете към пътя за изграждане на Java и най-накрая проработи. Надявам се да помогне :)

person thamer radhouani    schedule 22.11.2015

Моят случай беше след ъпгрейд

    compile 'com.google.android.gms:play-services:8.1.0'

to

    compile 'com.google.android.gms:play-services:8.3.0'

Връщането към 8.1.0 го реши за мен

person Chisko    schedule 23.11.2015
comment
Това не е добро решение. Вместо да понижавате библиотеката на Google Play Services, трябва да надстроите библиотеката за поддръжка до версия, която включва ArrayMap. - person Albert Vila Calvo; 25.08.2016
comment
Моят отговор е конкретен за това, което работи за мен, никога не е споменавал, че е най-оптималното. Освен това, тъй като нямах нужда от най-новите функции, понижаването на версията изобщо не оказа влияние - person Chisko; 25.08.2016

Можете да намерите решение на тази грешка тук.

Грешката е много ясна (основно ArrayMap липсва):

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/util/ArrayMap;

Това се случва, защото версията на библиотеката за поддръжка е стара и друга библиотека (вероятно Google Play Services) не намира ArrayMap в нея.

Решението е да надстроите библиотеката за поддръжка до нова версия, която включва ArrayMap. Това направих и се получи.

В допълнение, според свързаното решение трябва също така:

уверете се, че вашият compileSdkVersion съответства на номера на основната версия на зависимостта

person Albert Vila Calvo    schedule 24.08.2016