Warum verursachen einige Android-Telefone, dass unsere App einen java.lang.UnsatisfiedLinkError auslöst?

Wir erleben einejava.lang.UnsatisfiedLinkError auf einigen der Android-Handys, die unsere App auf dem Markt nutzen.

Problembeschreibung:

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

Stürzt die App in einer derSystem.loadLibrary() Zeilen mit einemjava.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

Lösungsansatz

Wir haben begonnen, einige benutzerdefinierte Diagnosen für alle unsere Installationen durchzuführen, um zu überprüfen, ob alle Bibliotheken im entpackt sind/data/data/app_id/lib Mappe.

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

Auf jedem Testtelefon, das wir habennumberOfLibFiles == 3 undsubFilesLarger0 == true. Wir wollten testen, ob alle Bibliotheken ordnungsgemäß entpackt wurden und größer als 0 Byte sind. Außerdem schauen wir uns anfreeSpace um zu sehen, wie viel Speicherplatz verfügbar ist.freeSpace Entspricht der Speicherkapazität, die Sie unter Einstellungen -> Anwendungen am unteren Bildschirmrand finden. Der Gedanke hinter diesem Ansatz war, dass der Installer möglicherweise Probleme beim Entpacken des APK hat, wenn nicht genügend Speicherplatz auf der Festplatte verfügbar ist.

Szenario der realen Welt

Bei der Diagnose sehen Sie, dass einige der Geräte da draußen funktionierenNICHT habe alle 3 libs in der/data/data/app_id/lib Ordner, aber viel freien Speicherplatz. Ich frage mich, warum die Fehlermeldung gesucht wird/data/app-lib/app_id-2. Alle unsere Telefone speichern ihre Bibliotheken in/data/data/app_id/lib. Auch dieSystem.loadLibrary() sollte ein konsistenter Pfad für die Installation und das Laden der Bibliotheken verwendet werden? Woher kann ich wissen, wo das Betriebssystem nach den Bibliotheken sucht?

Frage

Hat jemand Probleme mit der Installation nativer Bibliotheken? Welche Workarounds waren erfolgreich? Gibt es Erfahrungen damit, native Bibliotheken einfach über das Internet herunterzuladen, wenn sie nicht vorhanden sind, und sie manuell zu speichern? Was könnte das Problem überhaupt verursachen?

BEARBEITEN

Ich habe jetzt auch einen Benutzer, der nach einem Anwendungsupdate auf dieses Problem stößt. Die Vorgängerversion funktionierte auf seinem Handy einwandfrei, und nach einem Update scheinen die nativen Bibliotheken zu fehlen. Das manuelle Kopieren der Bibliotheken scheint ebenfalls Probleme zu bereiten. Er ist auf Android 4.x mit einem nicht gerooteten Telefon ohne benutzerdefiniertes ROM.

EDIT 2 - Lösung

Nach 2 Jahren der Beschäftigung mit diesem Problem. Wir haben eine Lösung gefunden, die jetzt für uns gut funktioniert. Wir öffnen es:https://github.com/KeepSafe/ReLinker

Antworten auf die Frage(4)

Ihre Antwort auf die Frage