Por que alguns telefones Android fazem com que nosso aplicativo envie um java.lang.UnsatisfiedLinkError?

Estamos experimentando umjava.lang.UnsatisfiedLinkError em alguns dos telefones Android que estão usando nosso aplicativo no mercado.

Descrição do Problema:

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

Coloca o aplicativo noSystem.loadLibrary() linhas com umjava.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

Abordagem de solução

Começamos a executar alguns diagnósticos personalizados em todas as nossas instalações para verificar se cada lib foi descompactado no/data/data/app_id/lib pasta.

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

Em todos os telefones de teste que temosnumberOfLibFiles == 3 esubFilesLarger0 == true. Queríamos testar se todas as libs são descompactadas corretamente e maiores que 0 byte. Além disso, estamos olhandofreeSpace para ver quanto espaço em disco está disponível.freeSpace corresponde à quantidade de memória que você pode encontrar em Configurações -> Aplicativos na parte inferior da tela. O pensamento por trás dessa abordagem era que, quando não há espaço suficiente no disco disponível, o instalador pode ter problemas para descompactar o APK.

Cenário do mundo real

Olhando para o diagnóstico, alguns dos dispositivos lá fora fazemNÃO tem todos os 3 libs no/data/data/app_id/lib pasta, mas tem muito espaço livre. Eu estou querendo saber porque a mensagem de erro está procurando/data/app-lib/app_id-2. Todos os nossos telefones armazenam suas libs em/data/data/app_id/lib. Também oSystem.loadLibrary() deve usar um caminho consistente na instalação e no carregamento das bibliotecas? Como posso saber onde o sistema operacional está procurando as bibliotecas?

Questão

Alguém está tendo problemas com a instalação de bibliotecas nativas? Que trabalho tem sido bem sucedido? Alguma experiência com apenas baixar bibliotecas nativas pela internet quando elas não existem e armazená-las manualmente? O que poderia causar o problema em primeiro lugar?

EDITAR

Agora também tenho um usuário que se depara com esse problema após uma atualização do aplicativo. A versão anterior funcionou bem em seu telefone, e após uma atualização, as bibliotecas nativas parecem estar faltando. Copiar as libs manualmente também parece causar problemas. Ele está no android 4.x com um telefone não enraizado sem ROM personalizado.

EDIT 2 - Solução

Após 2 anos de tempo gasto com este problema. Nós criamos uma solução que funciona bem para nós agora. Nós abrimos a fonte:https://github.com/KeepSafe/ReLinker

questionAnswers(4)

yourAnswerToTheQuestion