Android non può eseguire il processo per Android API 29 (Android 10) da / lib / <arch>
Nell'API 29 di Android, non possiamo eseguire un processo dalla cartella dei dati a causa della violazione di W ^ X. Google sembra consigliare di eseguirli dalla cartella / lib / [arch]. Tuttavia, verranno installati solo i file nel formato lib [nome] .so, anche se inclusi nell'APK lì. Inoltre, quando si tenta di eseguire un file a cui è stato semplicemente assegnato un nome con quel formato, restituisce solo il codice di uscita 1 senza eccezioni quando lo fa. Il programma non viene eseguito.
Questa risposta indica qualcosa di simile, ma non menziona un file "con nome errato" in esecuzione: https://stackoverflow.com/a/62394766/449722
Da quello che posso dire, l'esecuzione di eseguibili nativi inclusi in un APK è ora impossibile, piuttosto che chiamare semplicemente le librerie condivise quando si sceglie l'API 29. È corretto o c'è qualcosa di specifico che dobbiamo fare.
Risposte
Google è consapevole del fatto che dobbiamo rinominare in modo controintuitivo i nostri eseguibili in modo che corrispondano al lib….somodello, ma sembrano essere a loro agio e in diverse occasioni hanno espresso la determinazione a non interrompere il supporto per l'esecuzione di eseguibili nativi Runtime.exec(). In realtà, probabilmente è troppo tardi per aspettarsi che cambino la convenzione di denominazione che è stata emanata da Android Cupcake.
Detto questo, ci sono pochi extra di cui occuparsi:
Assicurati che i file vengano estratti (per impostazione predefinita,
android:extractNativeLibs="false"quando crei un bundle).Assicurati che l'eseguibile non abbia dipendenze non soddisfatte (es. C ++ _ shared ).
Se il tuo eseguibile necessita di librerie non di sistema (al caricamento o tramite
dlopen()), devi fornire il fileLD_LIBRARY_PATHalla tua directory lib (a differenzaSystem.loadLibrary(), questo non è risolto per te).Non codificare il percorso per
exec(), usagetApplicationInfo().nativeLibraryDir.