Dlaczego niektóre telefony z Androidem powodują, że nasza aplikacja zgłasza błąd java.lang.UnsatisfiedLinkError?

Doświadczamyjava.lang.UnsatisfiedLinkError na niektórych telefonach z Androidem, które korzystają z naszej aplikacji na rynku.

Opis problemu:

static
{
    System.loadLibrary("stlport_shared"); // C++ STL        
    System.loadLibrary("lib2"); 
    System.loadLibrary("lib3"); 
}

Awaria aplikacji naSystem.loadLibrary() linie zjava.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

Podejście do rozwiązania

Zaczęliśmy uruchamiać niestandardową diagnostykę we wszystkich naszych instalacjach, aby sprawdzić, czy każda lib jest rozpakowana w/data/data/app_id/lib teczka.

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;
            }
        }
    }
}

Na każdym telefonie testowym, który mamynumberOfLibFiles == 3 isubFilesLarger0 == true. Chcieliśmy przetestować, czy wszystkie biblioteki są poprawnie rozpakowane i są większe niż 0 bajtów. Dodatkowo patrzymy nafreeSpace aby zobaczyć, ile miejsca na dysku jest dostępne.freeSpace pasuje do ilości pamięci, którą można znaleźć w Ustawieniach -> Aplikacje na dole ekranu. Myślą stojącą za tym podejściem było to, że gdy na dysku jest za mało miejsca, instalator może mieć problemy z rozpakowaniem APK.

Scenariusz świata rzeczywistego

Patrząc na diagnostykę, niektóre urządzenia tam sąNIE mieć wszystkie 3 libs w/data/data/app_id/lib folder, ale dużo wolnego miejsca. Zastanawiam się, dlaczego szuka się komunikatu o błędzie/data/app-lib/app_id-2. Wszystkie nasze telefony przechowują swoje biblioteki/data/data/app_id/lib. RównieżSystem.loadLibrary() powinien używać spójnej ścieżki w instalacji i ładowaniu bibliotek? Skąd mam wiedzieć, gdzie system operacyjny szuka bibliotek?

Pytanie

Czy ktoś ma problemy z instalacją rodzimych bibliotek? Jakie prace zakończyły się sukcesem? Jakiekolwiek doświadczenie w pobieraniu rodzimych bibliotek przez Internet, gdy nie istnieją, i przechowywanie ich ręcznie? Co może spowodować problem w pierwszej kolejności?

EDYTOWAĆ

Teraz mam także użytkownika, który napotkał ten problem po aktualizacji aplikacji. Poprzednia wersja działała dobrze na jego telefonie, po aktualizacji natywne biblioteki wydają się zaginione. Ręczne kopiowanie bibliotek również powoduje problemy. On jest na Androida 4.x z telefonem bez roota bez niestandardowej pamięci ROM.

EDYCJA 2 - Rozwiązanie

Po 2 latach spędzania czasu na tym problemie. Opracowaliśmy rozwiązanie, które działa teraz dobrze dla nas. Otwieramy je:https://github.com/KeepSafe/ReLinker

questionAnswers(4)

yourAnswerToTheQuestion