Почему некоторые телефоны на Android заставляют наше приложение генерировать ошибку java.lang.UnsatisfiedLinkError?
Мы испытываемjava.lang.UnsatisfiedLinkError
на некоторых телефонах Android, которые используют наше приложение на рынке.
Описание проблемы:
static
{
System.loadLibrary("stlport_shared"); // C++ STL
System.loadLibrary("lib2");
System.loadLibrary("lib3");
}
Вылетает приложение наSystem.loadLibrary()
линии сjava.lang.UnsatisfiedLinkError
. java.lang.UnsatisfiedLinkError: Couldn't load stlport_shared from loader dalvik.system.PathClassLoader[dexPath=/data/app/app_id-2.apk,libraryPath=/data/app-lib/app_id-2]: findLibrary returned null
Подход к решению
Мы начали запускать некоторую пользовательскую диагностику на всех наших установках, чтобы проверить, распакованы ли все библиотеки в/data/data/app_id/lib
папка.
PackageManager m = context.getPackageManager();
String s = context.getPackageName();
PackageInfo p;
p = m.getPackageInfo(s, 0);
s = p.applicationInfo.dataDir;
File appDir = new File(s);
long freeSpace = appDir.getFreeSpace();
File[] appDirList = appDir.listFiles();
int numberOfLibFiles = 0;
boolean subFilesLarger0 = true;
for (int i = 0; i < appDirList.length; i++) {
if(appDirList[i].getName().startsWith("lib")) {
File[] subFile = appDirList[i].listFiles(FileFilters.FilterDirs);
numberOfLibFiles = subFile.length;
for (int j = 0; j < subFile.length; j++) {
if(subFile[j].length() <= 0) {
subFilesLarger0 = false;
break;
}
}
}
}
На каждом тестовом телефоне, который у нас естьnumberOfLibFiles == 3
а такжеsubFilesLarger0 == true
, Мы хотели проверить, распакованы ли все библиотеки правильно и имеют ли они размер больше 0 байт. Кроме того, мы смотрим наfreeSpace
чтобы увидеть, сколько дискового пространства доступно.freeSpace
соответствует объему памяти, который вы можете найти в Настройки -> Приложения в нижней части экрана. Идея такого подхода заключалась в том, что, когда на диске недостаточно места, у установщика могут возникнуть проблемы с распаковкой APK.
Сценарий реального мира
Глядя на диагностику, некоторые устройства там делаютНЕ есть все 3 библиотеки в/data/data/app_id/lib
папка, но есть много свободного места. Мне интересно, почему сообщение об ошибке ищет/data/app-lib/app_id-2
, Все наши телефоны хранят свои библиотеки в/data/data/app_id/lib
, Так жеSystem.loadLibrary()
следует использовать единый путь для установки и загрузки библиотек? Как я могу узнать, где ОС ищет библиотеки?
Вопрос
Кто-нибудь испытывает проблемы с установкой родных библиотек? Какие обходные пути были успешными? Есть ли у вас опыт просто загружать нативные библиотеки через Интернет, когда их нет, и хранить их вручную? Что может вызвать проблему в первую очередь?
РЕДАКТИРОВАТЬ
Теперь у меня также есть пользователь, который сталкивается с этой проблемой после обновления приложения. Предыдущая версия прекрасно работала на его телефоне, а после обновления родные библиотеки, похоже, отсутствуют. Копирование библиотек вручную, кажется, также вызывает проблемы. Он на андроиде 4.х с нерутированным телефоном без кастомного ПЗУ.
РЕДАКТИРОВАТЬ 2 - Решение
Через 2 года потратил время на эту проблему. Мы придумали решение, которое сейчас хорошо работает для нас. Мы открываем источник этого:https://github.com/KeepSafe/ReLinker