O Android não pode executar o processo para Android API 29 (Android 10) de / lib / <arch>
Na API 29 do Android, não podemos executar um processo da pasta de dados devido à violação de W ^ X. O Google parece recomendar que devemos executá-los da pasta / lib / [arch]. No entanto, apenas arquivos no formato lib [nome] .so serão instalados, mesmo se incluídos no APK. Além disso, ao tentar executar um arquivo que por acaso foi nomeado com esse formato, ele apenas retorna o código de saída 1 sem exceção ao fazer isso. O programa não é executado.
Esta resposta indica algo semelhante, mas não menciona um arquivo com "nome incorreto" em execução: https://stackoverflow.com/a/62394766/449722
Pelo que eu posso dizer, executar executáveis nativos incluídos com um APK agora é impossível, em vez de apenas chamar bibliotecas compartilhadas ao direcionar a API 29. Isso está correto ou há algo específico que precisamos fazer.
Respostas
O Google está ciente de que precisamos renomear de forma não intuitiva nossos executáveis para corresponder ao lib….sopadrão, mas eles parecem se sentir confortáveis com isso e, em várias ocasiões, expressaram determinação em não interromper o suporte à execução de executáveis nativos Runtime.exec(). Na verdade, provavelmente é tarde demais para esperar que eles mudem a convenção de nomenclatura que foi promulgada desde o Android Cupcake.
Dito isso, existem alguns extras para cuidar:
Certifique-se de que os arquivos sejam extraídos (por padrão,
android:extractNativeLibs="false"ao construir um pacote).Certifique-se de que o executável não tenha dependências insatisfeitas (por exemplo, c ++ _ shared ).
Se o seu executável precisar de bibliotecas não pertencentes ao sistema (durante o carregamento ou por meio
dlopen()), você deve fornecer oLD_LIBRARY_PATHao seu diretório lib (ao contrárioSystem.loadLibrary(), isso não é resolvido para você).Não codifique o caminho para
exec(), usegetApplicationInfo().nativeLibraryDir.