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