Nano Hash - криптовалюты, майнинг, программирование

Как система сборки Android обрабатывает библиотеки Java, которые загружают собственные общие библиотеки

Рассмотрим следующую ситуацию: у меня есть два проекта Android с именами P1 и P2, которые создают apk, использующие один и тот же идентификатор процесса, и будут работать в одном и том же процессе на Android. P1 и P2 используют библиотеку Java JL1. JL1 загружает во время выполнения разделяемую библиотеку 1 SL1.

Что я вижу во время выполнения, так это то, что в какой-то момент я получаю java/lang/UnsatisfiedLinkError при загрузке этого SL1. Он также выводит: Общая библиотека уже открыта.

Что вызывает эту проблему? Я предполагаю, что код библиотеки в java как бы копируется в каждый проект/apk, а во время выполнения, когда apks объединяются в один процесс, он забывает о копиях. Таким образом, каждая копия сама загружает свою разделяемую библиотеку, вызывая уже загруженную ошибку.

Если да, то это нежелательное поведение. Потому что теперь у вас никогда не будет java-библиотеки с общей библиотекой в ​​одном и том же процессе, используемой более одного раза.

[править] Я обнаружил, что каждый apk использует свой собственный загрузчик классов (также в одном процессе). Это означает, что каждый класс JL будет загружен для каждого apk, и поэтому каждый общий объект будет загружен более одного раза, что приведет к ошибке. У кого-нибудь есть идеи, как это обойти? Можно ли разрешить apks совместно использовать загрузчик классов?

23.03.2012

  • Мне кажется, что ваши P1 и P2 загружаются разными загрузчиками классов. Не могли бы вы это подтвердить? Если это действительно так, AFAIK это ожидаемое поведение, то есть: одна и та же собственная библиотека JNI не может быть загружена более чем в один загрузчик классов. docs.oracle.com/javase/1.4. 2/docs/guide/jni/jni-12.html Одним из обходных путей может быть разработка ваших классов таким образом, чтобы только один их набор нуждался в доступе к собственным методам... 23.03.2012
  • Я думаю, я должен узнать. Я не знаю, как андроид справляется с этим. Я думаю, вы правы. Как поясняется в вопросе. Я использую два разных apk, которые загружаются в одном и том же процессе. Я могу представить, что Android будет создавать один загрузчик классов для каждого apk. Было бы лучше, если бы для каждого процесса создавался загрузчик классов. Нужно посмотреть, как андроид справляется с этим. 26.03.2012
  • Я посмотрел это. Каждый apk имеет свой собственный загрузчик классов. Таким образом, это означает, что общий объект будет загружен дважды. Любые идеи, чтобы исправить это? 26.03.2012
  • Я завершу этот вопрос своим собственным ответом и опубликую другой в stackoverflow, содержащий информацию о специфике загрузчика классов. 27.03.2012
  • Извините за задержку... ну, если это ответ на ваш вопрос, отлично! Наверное :) 27.03.2012

Ответы:


1

У каждого apk есть свой загрузчик классов. Это означает, что у двух проектов/apks будет собственная копия классов из библиотеки. Который они загружают во время выполнения. Поэтому то, что выглядит как одни и те же классы, на самом деле является копиями. Поэтому загрузка нативной библиотеки в такой класс приведет к ее загрузке для каждого загруженного класса (даже если это делается в статическом поле). Что приводит к ошибке времени выполнения для загрузки собственного общего объекта более одного раза, если два apk используют один и тот же процесс.

27.03.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..