permiso denegado con Android Q ffmpeg ": error = 13, permiso denegado

9

Quiero obtener los cuadros del video RTSP usando ffmpeg. Pero para Android 10 anterior recibo un error como el siguiente.

 E/FFmpeg: Exception while trying to run: [Ljava.lang.String;@55e447f
java.io.IOException: Cannot run program "/data/user/0/com.example.downloadimagefromurl/files/ffmpeg": error=13, Permission denied
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
    at java.lang.Runtime.exec(Runtime.java:698)
    at java.lang.Runtime.exec(Runtime.java:563)
    at com.github.hiteshsondhi88.libffmpeg.ShellCommand.run(ShellCommand.java:10)
    at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:38)
    at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:10)
    at android.os.AsyncTask$3.call(AsyncTask.java:378)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:919)
 Caused by: java.io.IOException: error=13, Permission denied
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)

Como la respuesta proporcionada por @Saurabh Thorat, Google no permite que las aplicaciones ejecuten archivos binarios desde el directorio / data / user.

Una mala solución que conozco es cambiar compileSdkVersion y targetSdkVersion a 28 o menos y volver a lanzar mi aplicación, lo cual no es recomendable.

Por lo tanto, estoy buscando soluciones más viables para futuras versiones también.

Cualquier sugerencia, enlace o sugerencia sería muy apreciada. Gracias por adelantado.

gowthami
fuente
quizás relacionado con este stackoverflow.com/questions/8854359/…
Priyankagb
No @Priyankagb ya le di permisos de almacenamiento externo a mi aplicación
gowthami
use esta biblioteca, he creado github.com/PratikVekariya4445/FFmpegAndroid , el mismo problema que he enfrentado con un problema más de soporte de 64 bits, después de algunas investigaciones no encontré ninguna solución y he creado mi propia biblioteca y solucioné problemas. Avíseme si tiene alguna duda o algún problema
pratik vekariya
para su muestra también recibo el mismo error 2020-02-24 12: 38: 16.934 2817-3054 / com.techdorid.ffmpegandroid.demo W / System.err: java.io.IOException: No se puede ejecutar el programa "/ data / user /0/com.techdorid.ffmpegandroid.demo/files/ffmpeg ": error = 13, Permiso denegado
gowthami
en esta línea obtengo un error (FFmpegExecuteAsyncTask.java:44)
gowthami

Respuestas:

4

Desde Android Q en adelante, no puede ejecutar archivos binarios en el directorio de datos privados de su aplicación.

Del rastreador de problemas: https://issuetracker.google.com/issues/128554619

El cambio para bloquear exec () en los archivos de datos de la aplicación para targetAPI> = Q está funcionando según lo previsto. Consulte https://android-review.googlesource.com/c/platform/system/sepolicy/+/804149 para obtener información sobre este cambio. Llamar a exec () en archivos de aplicaciones grabables es una violación de W ^ X ( https://en.wikipedia.org/wiki/W%5EX ) y representa una práctica de aplicación insegura. El código ejecutable siempre debe cargarse desde la aplicación APK.

Si bien exec () ya no funciona en archivos dentro del directorio de inicio de la aplicación, continúa siendo compatible con archivos dentro del directorio de solo lectura / data / app. En particular, debería ser posible empaquetar los binarios en el directorio libs nativo de su aplicación y habilitar android: extractNativeLibs = true, y luego llamar a exec () en los artefactos / data / app. Se realiza un enfoque similar con la funcionalidad wrap.sh, documentada en https://developer.android.com/ndk/guides/wrap-script#packaging_wrapsh .

Además, tenga en cuenta que los ejecutables ejecutados a través de exec () no se administran de acuerdo con el ciclo de vida del proceso de Android, y en general, exec () no se recomienda desde las aplicaciones de Android. Si bien no es documentación de Android, el uso de "exec ()" con NDK cubre esto con cierto detalle. Confiar en exec () puede ser problemático en futuras versiones de Android.

Saurabh Thorat
fuente
¿Me puede decir qué debo agregar? Para trabajar este código de identificación de Android 10
gowthami
@gowthami, ¿has resuelto esto?
Chitrang
@Chitrang no, no recibí ninguna respuesta. Si tienes algo Por favor comparte conmigo
gowthami
Es por eso que comencé esta recompensa, esperemos lo mejor.
Chitrang
Siempre me pasa lo mismo y exactamente lo mismo con bravobit ffmpeg ... Cada vez que Google lanza una nueva versión de Android, debe cruzar los dedos para que su aplicación no deje de funcionar de ninguna manera: ((
Diego Pérez,
4

Cambie solo en el archivo Build.gradle targetSdkVersion 29 a 28 y vuelva a instalar su aplicación en su dispositivo

Ashwin Vavaliya
fuente
2
Gracias. Esto en realidad fue una gran solución. No estoy seguro de por qué te rechazaron.
Painor
Gran solución, gracias!
dgcipp
2

La respuesta anterior explica correctamente el problema al que te estás enfrentando. Este es también un tema abierto planteado en septiembre pasado, discutido en el foro de la biblioteca que está utilizando (por lo que puedo ver en el seguimiento de la pila).

La solución para compilar para el SDK 29 sería dejar de colocar archivos binarios en el directorio / data / y asegurarse de que están en el directorio libs nativo. Eso no se puede lograr después de que el APK esté instalado y desempaquetado en dispositivos no rooteados, por lo que debe hacerse correctamente al preparar el proyecto de Android (por ejemplo, a través de la configuración de Gradle), y para asegurarse de que después de la instalación, el contenido se desempaquete correctamente: android:extractNativeLibs=true.

En su caso, este código mueve los archivos binarios que se empaquetan como 'activos' en el directorio de datos de los usuarios:

https://github.com/WritingMinds/ffmpeg-android-java/blob/master/FFmpegAndroid/src/main/java/com/github/hiteshsondhi88/libffmpeg/FileUtils.java

Esa es una preocupación de seguridad que ejecuta cualquier ejecutable en una ubicación que sea de lectura / escritura. Ese código fuente al que me vinculé anteriormente debería eliminarse, en su lugar, los binarios nativos empaquetados en / libs. El cambio es más seguro ya que la ubicación / libs dentro del directorio de instalación de sus aplicaciones es ejecutable pero no se puede escribir.

En resumen, la biblioteca de terceros debe abordarlo, o puede hacerlo y contribuir con una solicitud de extracción. O bifurca el tuyo y recompílalo por ti mismo.

Todavía hay un problema, si su aplicación realmente descarga contenido después de que se instala, y espera ejecutar cualquier descarga. Eso es ahora imposible hasta donde puedo decir en Android 10.

La solución a prueba de futuro es dejar de usar binarios externos y compilar las dependencias como proyectos NDK. Necesitarán envoltorios jni alrededor del código nativo (un poco de trabajo). Hay un proyecto relacionado que sé que podrías investigar.

dr_g
fuente
1
Implica un poco de trabajo, todavía estoy luchando con la biblioteca que mencionaste.
Rohan Bojja