Desarrollo de Android RecoverySystem.installPackage () no puede escribir en / cache / recovery / command permission denied

Se me ha pedido que escriba una pequeña aplicación sencilla 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 sólo una prueba de concepto en la que cuando se hace clic en un botón, se utiliza el sistema de recuperación para reemplazar el sistema operativo actual con una de las imágenes.

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

yo suelo

RecoverySystem.installPackage(context, packageFile); 

( Ver aquí como referencia ) para reemplazar el sistema operativo por 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 el método RecoverySystem.installPackage no puede parecer tener acceso 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, estoy asumiendo que no tengo el permiso adecuado para acceder a este archivo. Aunque aquí está el permiso 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 el RecoverySystem . 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 averigüé. Los permisos eran correctos después de todo. Todo estaba bien.

Cuando estaba configurando la aplicación como una aplicación de sistema al mover el archivo apk a / system / app no ​​había puesto todos los permisos en todavía. Cuando ejecuté el código más reciente en mi dispositivo, lo instaló en / data / app y lo reconoció como una actualización de la aplicación del sistema. Debido a eso, sólo se reconocieron los permisos de la aplicación del sistema original.

Después de volver a configurar mi código más reciente 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 este post ayude a cualquiera con el mismo problema. Estaré encantado de contestar cualquier pregunta también.

Antes de que mi aplicación estuviera instalada en / system / app estaba recibiendo un error por debajo de:

 07-20 10:52:46.512 933-951/? W/RecoverySystem﹕ !!! REBOOTING TO INSTALL /storage/emulated/legacy/Download/Update.zip !!! 07-20 10:52:46.512 933-951/? W/System.err﹕ java.io.FileNotFoundException: /cache/recovery/command: open failed: EACCES (Permission denied) 07-20 10:52:46.512 933-951/? W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:409) 07-20 10:52:46.512 933-951/? W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:88) 07-20 10:52:46.512 933-951/? W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:73) 07-20 10:52:46.512 933-951/? W/System.err﹕ at java.io.FileWriter.<init>(FileWriter.java:42) 07-20 10:52:46.512 933-951/? W/System.err﹕ at android.os.RecoverySystem.bootCommand(RecoverySystem.java:389) 07-20 10:52:46.522 933-951/? W/System.err﹕ at android.os.RecoverySystem.installPackage(RecoverySystem.java:337) 

Había intentado todos los permisos que se requerían pero no podría continuar.

Así que desde que estaba usando API por encima de 4.2 he intentado poner mi aplicación en /system/priv-app y funcionó para mí.

Tengo problema iguales con usted cuando crea la aplicación de OtaUpdate de encargo en androide 5.0.2 y lo he resuelto. Voy a compartir con usted con 2 pasos a continuación:

  1. Añadir android: sharedUserId = "com.google.uid.shared" en AndroidManifest.xml
  2. Empuje su apk a sistema / aplicación o sistema / priv-app

Para Android 4.1.2 :

  1. Añadir android: sharedUserId = "android.uid.system" en AndroidManifest.xml
  2. Empuje su apk a sistema / aplicación

Para Android 5.1.0
1. Agregar android: sharedUserId = "android.uid.system" en AndroidManifest.xml
2. Empuje su apk a system / priv-app
3. y luego

 adb root adb shell setenforce 0 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.