Android RecoverySystem.installPackage () no puede escribir en / cache / recovery / command permiso denegado

Me han pedido que escriba una aplicación pequeña y simple para un producto basado en Android. El dispositivo viene con dos imágenes del sistema Android con diferentes características. La aplicación que estoy escribiendo es solo una prueba de concepto en la que cuando hace clic en un botón, utiliza el Sistema de recuperación para reemplazar el sistema operativo actual con una de las imágenes.

El dispositivo está rooteado y la aplicación se ejecuta como una aplicación del sistema.

yo suelo

RecoverySystem.installPackage(context, packageFile);

(ver aquí para referencia) para reemplazar el sistema operativo con una de las imágenes. Esto debería reiniciar el sistema e inicializar el sistema de recuperación para instalar la imagen.

El problema que tengo es que esta llamada falla porque laRecoverySystem.installPackage Parece que el método no puede acceder al archivo / cache / recovery / command. Supongo que intenta escribir algunos comandos para que el sistema de recuperación se ejecute al reiniciar, pero falla. Aquí está la excepción que estoy recibiendo:

02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439): java.io.FileNotFoundException: /cache/recovery/command: open failed: EACCES (Permission denied)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439):  at libcore.io.IoBridge.open(IoBridge.java:416)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439):  at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439):  at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439):  at java.io.FileWriter.<init>(FileWriter.java:42)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439):  at android.os.RecoverySystem.bootCommand(RecoverySystem.java:381)
02-27 16:44:39.463: E/BroadSign Resolution Switcher(4439):  at android.os.RecoverySystem.installPackage(RecoverySystem.java:330)

Por lo tanto, asumo que no tengo el permiso adecuado para acceder a este archivo. Aunque aquí están los permisos que he puesto en mi manifiesto:

<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
<uses-permission android:name="android.permission.DELETE_CACHE_FILES" />

Sé que necesito el permiso REBOOT para elRecoverySystem. Sin embargo, no sé si los otros dos son relevantes. Ni siquiera sé si necesito algún otro permiso para crear / escribir en archivos en la partición / cache.

¿Alguien sabe lo que podría faltar?

ACTUALIZAR:

Bueno, parece que lo descubrí. Los permisos eran correctos después de todo. Todo estaba bien.

Cuando estaba configurando la aplicación como una aplicación de sistema moviendo el archivo apk a / system / app, todavía no había puesto todos los permisos. Cuando ejecuté el último código en mi dispositivo, lo instalé en / data / app y lo reconocí como una actualización de la aplicación del sistema. Debido a eso, solo se reconocieron los permisos de la aplicación del sistema original.

Después de volver a configurar mi último código para ejecutar desde / system / app directamente, funcionó.

Ahora, el único problema que tengo es que cuando se reinicia no instala la imagen y termino con un robot verde muerto con un signo de exclamación. Voy a seguir investigando.

Espero que esta publicación ayude a cualquiera con el mismo problema. Estaré encantado de responder cualquier pregunta también.

Respuestas a la pregunta(3)

Su respuesta a la pregunta