Intereting Posts
Тестирование устройств Android в Eclipse: «Не удалось запустить тест» "Http: // {root_dir} / oauth / token" Файл не найден в Magento для регистрации приложения REST API Android Spinner – onItemSelected / setOnItemSelectedListener не запускается Дефект изображения с помощью ScriptIntrinsicBlur из библиотеки поддержки Что такое LinearLayoutCompat в appCompat v7? Android Studio: Gradle – build failed – Выполнение не выполнено для задачи: dexDebug ' Увеличьте значение записи в базе данных android / sqlite Разница между новичком и новичком в Android Можно ли использовать картографию для элемента списка и как Более одного BroadcastReceiver для одного и того же намерения с противоречивым документом и практикой Предупреждение SSL от google play Написание сценария Gradle для запуска модульных тестовых примеров для проекта Eclipse Android Test В Android-приложении проблемы с памятью – пробовал все и все еще в недоумении Branch.io deeplink в android открывает Play Store даже независимо от того, что Может ли Android-устройство действовать как iBeacon?

Android: «загрузчик классов может не работать для процессов с несколькими приложениями»

Что означает это сообщение в logcat Eclipse для Android?

W/ActivityThread: ClassLoader.getResources: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader()); 

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

Solutions Collecting From Web of "Android: «загрузчик классов может не работать для процессов с несколькими приложениями»"

Исходная информация

Сообщение означает, что Android установил манекен ClassLoader с Thread.currentThread().setContextClassLoader() , и что-то пытается использовать этот загрузчик классов. Что- то может быть много, трудно точно сказать, что из приведенной информации. Есть трюк, который вы можете попробовать, см. Ниже. Во всяком случае, Android устанавливает загрузчик фиктивных классов, если существует риск того, что процесс может содержать код из нескольких APK. Более конкретно, Android выглядит в вашем манифесте, если вы использовали android:sharedUserId :

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... android:sharedUserId="triggers.dummy.loader" > 

Или если вы запускаете нестандартный android:process

  <application android:process="triggers.dummy.loader"> 

Как избавиться от предупреждения

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

  1. Не используйте android:sharedUserId или android:process
  2. Явно установить, какой APK ClassLoader использовать перед запуском любого другого кода

Чтобы пойти с решением 2, вам нужно найти некоторые ключевые идеи. Во-первых, для любого класса AnyClass в APK AnyClass.class.getClassLoader() вернет тот же ClassLoader . Во-вторых,

 AnyClass obj = new AnyClass(); Thread.currentThread().setContextClassLoader(obj.getClass().getClassLoader()) 

такой же как

 Thread.currentThread().setContextClassLoader(AnyClass.class.getClassLoader()) 

В-третьих, вам нужно вызвать Thread.currentThread().setContextClassLoader(getClass().getClassLoader()) перед кодом, вызывающим Thread.currentThread().getContextClassLoader() . В-четвертых, когда задействовано много APK, вам нужно вызвать Thread.setContextClassLoader(getClass().getClassLoader()) после загрузки последнего APK (в противном случае загрузка последнего APK перезапишет то, что вы установили вручную). Из-за этого было бы неплохо узнать, кто использует загрузчик контекстного класса в вашем случае, используя приведенный ниже отладочный трюк. Затем, прямо перед этим, вы вызываете Thread.setContextClassLoader(getClass().getClassLoader()) для класса из требуемого APK, обычно APK, который загружается первым (или, в случае, когда задействован только один APK, APK ;). В-пятых, загрузчик контекстного класса относится к потоку , который вам нужно иметь в виду, если ваше приложение многопоточно.

Отладочный трюк

Если вы хотите узнать, какой код вызывает ClassLoader.getResources (), это должно работать:

 Thread.currentThread().setContextClassLoader(new ClassLoader() { @Override public Enumeration<URL> getResources(String resName) throws IOException { Log.i("Debug", "Stack trace of who uses " + "Thread.currentThread().getContextClassLoader()." + "getResources(String resName):", new Exception()); return super.getResources(resName); } }); 

Если вы сделаете это достаточно рано, вы должны увидеть в logcat трассировку стека, которая возвращается к тому, кто вызывает getResources() в загрузчике фиктивного класса.

Я получил это предупреждение без андроида: sharedUserId или android: процесс в моем манифесте …

Нашел его только на эмуляторе …

Устройства не представили предупреждающее сообщение. Протестировано на смартфоне KitKat 4.4 API 19 и Tablet 5.0.1 API 21.