¿Por qué algunos teléfonos Android hacen que nuestra aplicación lance un java.lang.UnsatisfiedLinkError?
Estamos experimentando unjava.lang.UnsatisfiedLinkError
en algunos de los teléfonos Android que utilizan nuestra aplicación en el mercado.
Descripción del problema:
static
{
System.loadLibrary("stlport_shared"); // C++ STL
System.loadLibrary("lib2");
System.loadLibrary("lib3");
}
Se bloquea la aplicación en una de lasSystem.loadLibrary()
líneas con unjava.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
Enfoque de solución
Comenzamos a ejecutar algunos diagnósticos personalizados en todas nuestras instalaciones para verificar si cada lib está desempaquetada en el/data/data/app_id/lib
carpeta.
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;
}
}
}
}
En cada teléfono de prueba que tengamosnumberOfLibFiles == 3
ysubFilesLarger0 == true
. Queríamos probar si todas las libretas están desempaquetadas correctamente y son más grandes que 0 bytes. Además estamos viendofreeSpace
para ver cuánto espacio en disco está disponible.freeSpace
coincide con la cantidad de memoria que puede encontrar en Configuración -> Aplicaciones en la parte inferior de la pantalla. El pensamiento detrás de este enfoque fue que cuando no hay suficiente espacio en el disco disponible, el instalador podría tener problemas para desempaquetar el APK.
Escenario del mundo real
En cuanto a los diagnósticos, algunos de los dispositivos que hay por ahí hacenNO tener los 3 libs en el/data/data/app_id/lib
carpeta pero tiene un montón de espacio libre. Me pregunto por qué el mensaje de error está buscando./data/app-lib/app_id-2
. Todos nuestros teléfonos almacenan sus librerías en/data/data/app_id/lib
. También elSystem.loadLibrary()
¿Debería usar una ruta consistente en la instalación y carga de las librerías? ¿Cómo puedo saber dónde está el sistema operativo en busca de las librerías?
Pregunta
¿Alguien está experimentando problemas con la instalación de librerías nativas? ¿Qué trabajo ha tenido éxito? ¿Alguna experiencia con solo descargar bibliotecas nativas en Internet cuando no existen y almacenarlas manualmente? ¿Qué podría causar el problema en primer lugar?
EDITAR
Ahora también tengo un usuario que se encuentra con este problema después de una actualización de la aplicación. La versión anterior funcionó bien en su teléfono y, después de una actualización, parece que faltan las librerías nativas. Copiar las libretas manualmente parece causar problemas también. Él está en Android 4.x con un teléfono no rooteado sin ROM personalizada.
EDIT 2 - Solución
Después de 2 años de pasar tiempo en este problema. Se nos ocurrió una solución que nos funciona bien ahora. Lo abrimos de fuente:https://github.com/KeepSafe/ReLinker