¿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

Respuestas a la pregunta(4)

Su respuesta a la pregunta