Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
DarkVortex
102 / 68 / 18
Регистрация: 07.07.2014
Сообщений: 239
#1

DexClassLoader не работает - Android

24.12.2015, 17:30. Просмотров 292. Ответов 0
Метки нет (Все метки)

Добрый день. Возникла проблема с использованием DexClassLoader. Тестирование приложения на эмуляторах и на моих устройствах проходит без проблем, но обнаружил, что примерно на 30% устройств возникает проблема. Для загрузки класса из .dex (который упакован в apk) использую следующий код:
Java
1
2
3
4
5
6
7
PRIVATE_CACHE = context.getCacheDir().getAbsolutePath();
DexLoader = new  DexClassLoader(PRIVATE_CACHE + "/DEX_API.apk", PRIVATE_CACHE, PRIVATE_CACHE, ClassLoader.getSystemClassLoader());
try {
    DexLoader.loadClass("com.class");
} catch (Exception e) {
    Log.d("TAG", getStackTrace(e));
}
От устройств где это не работает получаю 2 вида ошибок:
java.lang.ClassNotFoundException: Didn't find class "class_name" on path: DexPathList[[zip file "/data/data/packagename/cache/DEX_API.apk"],nativeLibraryDirectories=[/data/data/packagename/cache, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at com.API1.Reflector.loadClass(Reflector.java:43)
at com.API1.RaccoonBroadcast.onReceive(RaccoonBroadcast.java:65)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2528)
at android.app.ActivityThread.access$1700(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1319)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5372)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:970)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786)
at dalvik.system.NativeStart.main(Native Method)
Suppressed: java.io.IOException: unable to open DEX file
at dalvik.system.DexFile.openDexFileNative(Native Method)
at dalvik.system.DexFile.openDexFile(DexFile.java:296)
at dalvik.system.DexFile.<init>(DexFile.java:111)
at dalvik.system.DexFile.loadDex(DexFile.java:151)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:266)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:230)
at dalvik.system.DexPathList.<init>(DexPathList.java:112)
at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
at dalvik.system.DexClassLoader.<init>(DexClassLoader.java:57)
at com.API1.Reflector.<init>(Reflector.java:36)
at com.API1.Reflector.getInstance(Reflector.java:49)
at com.API1.API1Service.onStartCommand(API1Service.java:52)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2823)
at android.app.ActivityThread.access$2100(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1340)
... 8 more
или

java.lang.ClassNotFoundException: class_name in loader dalvik.system.DexClassLoader@40566f48
at dalvik.system.DexClassLoader.findClass(DexClassLoader.java:235)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at com.API1.Reflector.loadClass(Reflector.java:43)
at com.API1.RaccoonBroadcast.onReceive(RaccoonBroadcast.java:65)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:1813)
at android.app.ActivityThread.access$2400(ActivityThread.java:121)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:990)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3714)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:853)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(Native Method)

Перед загрузкой проверяется наличие и контрольная сумма загружаемого apk. В чем может быть проблема не знаю, попробовал использовать PathClassLoader и скармливать ему распакованный dex файл, но у меня это не работает. В оф. доках все достаточно обобщенно описано, может есть какой-то более низкоуровневый но надежный способ загрузить внешний dex файл. Кто-то сталкивался с такой проблемой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2015, 17:30     DexClassLoader не работает
Посмотрите здесь:

Android RSS-читалка - работает на эмуляторе, не работает на реальном девайсе
Работает в Eclipce но не работает на телефоне Android
Стандартная функция delete в Eclipse работает а в AndroidStudio не работает Android
Android Socket.io (прослушивание события работает на Desktop и не работает на Android)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 15:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru