Почему некоторые телефоны на 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&nbsp;а такжеsubFilesLarger0 == true, Мы хотели проверить, распакованы ли все библиотеки правильно и имеют ли они размер больше 0 байт. Кроме того, мы смотрим наfreeSpace&nbsp;чтобы увидеть, сколько дискового пространства доступно.freeSpace&nbsp;соответствует объему памяти, который вы можете найти в Настройки -> Приложения в нижней части экрана. Идея такого подхода заключалась в том, что, когда на диске недостаточно места, у установщика могут возникнуть проблемы с распаковкой APK.

Сценарий реального мира

Глядя на диагностику, некоторые устройства там делаютНЕ&nbsp;есть все 3 библиотеки в/data/data/app_id/lib&nbsp;папка, но есть много свободного места. Мне интересно, почему сообщение об ошибке ищет/data/app-lib/app_id-2, Все наши телефоны хранят свои библиотеки в/data/data/app_id/lib, Так жеSystem.loadLibrary()&nbsp;следует использовать единый путь для установки и загрузки библиотек? Как я могу узнать, где ОС ищет библиотеки?

Вопрос

Кто-нибудь испытывает проблемы с установкой родных библиотек? Какие обходные пути были успешными? Есть ли у вас опыт просто загружать нативные библиотеки через Интернет, когда их нет, и хранить их вручную? Что может вызвать проблему в первую очередь?

РЕДАКТИРОВАТЬ

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

РЕДАКТИРОВАТЬ 2 - Решение

Через 2 года потратил время на эту проблему. Мы придумали решение, которое сейчас хорошо работает для нас. Мы открываем источник этого:https://github.com/KeepSafe/ReLinker