Nous vivons à une java.lang.UnsatisfiedLinkError
sur certains téléphones Android, qui sont à l'aide de notre application dans le marché.
Description du problème:
static
{
System.loadLibrary("stlport_shared"); // C++ STL
System.loadLibrary("lib2");
System.loadLibrary("lib3");
}
Bloque l'application sur de l' System.loadLibrary()
lignes 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
Approche de la Solution
Nous avons commencé l'exécution de certains diagnostics personnalisés sur tous nos installe pour vérifier si tous les lib est décompressé dans l' /data/data/app_id/lib
le dossier.
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;
}
}
}
}
Sur chaque téléphone de test que nous avons numberOfLibFiles == 3
et subFilesLarger0 == true
. Nous avons voulu tester si toutes les libs installés correctement et qu'ils sont supérieurs à 0 octet. En outre, nous sommes à la recherche à l' freeSpace
pour voir combien d'espace disque est disponible. freeSpace
correspond à la quantité de mémoire que vous pouvez trouver dans Paramètres --> Applications au bas de l'écran. L'idée derrière cette approche est que lorsqu'il n'y a pas assez d'espace sur le disque disponible que le programme d'installation peut avoir des problèmes déballage de l'APK.
Scénario réel
En regardant les diagnostics, certains appareils ne PAS avoir toutes les 3 libs dans l' /data/data/app_id/lib
le dossier mais ont beaucoup d'espace libre. Je me demandais pourquoi le message d'erreur est à la recherche d' /data/app-lib/app_id-2
. Tous nos téléphones stocker leurs libs en /data/data/app_id/lib
. Aussi l' System.loadLibrary()
doit être constante chemin à travers l'installation et le chargement de la libs? Comment puis-je savoir d'où l'OS est à la recherche pour les libs?
Question
Toute personne éprouvant des problèmes avec l'installation natif libs? Quelles solutions ont été couronnés de succès? Une expérience avec juste de le télécharger native libs sur internet lorsqu'ils ne sont pas inexistants et de les stocker manuellement? Ce qui pourrait causer le problème en premier lieu?
MODIFIER
J'ai maintenant aussi un utilisateur qui exécute ce problème après une mise à jour d'application. La version précédente a bien fonctionné sur son téléphone, après une mise à jour de la native libs semblent manquants. La copie de la libs manuellement semblent causer des problèmes ainsi. Il est sur android 4.x avec un non enraciné de téléphone sans ROM personnalisé.