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

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

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

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

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

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

1 Ответ

1 голос
/ 27 марта 2012

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

...