2012-05-21 25 views
7

Estoy tratando de instalar una aplicación del sistema desde mi código java, y hasta ahora, no he tenido ningún éxito.

que sigue es lo que he hecho hasta ahora:Android: copiar programáticamente apk a/system/app

  1. El dispositivo tiene sus raíces.
  2. Mi aplicación "instalador" está instalada como una aplicación del sistema. (lo copió manualmente a/system/app)
  3. He firmado el apk del instalador con la clave de la plataforma, y ​​tengo android:sharedUserId="android.uid.system" en el Manifiesto.
  4. He estado intentando (e intentando, y luego algo más) para Runtime.getRuntime.exec("su"). Tengo la intención de montar la partición del sistema como rw, hacer un cat para la apk, y luego hacer la partición del sistema ro. A continuación se muestra la lista de comandos:

    mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system<br> 
    cat /sdcard/application.apk > /system/app/application.apk<br> 
    mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system<br><br>The application.apk here is the app being installed from the installer app. This app is also signed with platform key, and has the sharedUserId configured. 
    
  5. He solicitado el permiso INSTALL_PACKAGES en el manifiesto.

me han tratado una serie de variaciones del formato (""), incluyendo el uso de exec 'su -c' con cada comando. Obtuve la excepción de Broken Pipe y la excepción de seguridad. A veces, no obtengo una excepción, pero el archivo no se copia.


Hágame saber lo que me falta aquí. ¿Alguien ha conseguido esto funcionando?

Gracias!

+0

en una nota relacionada, ¿cuál es la diferencia entre una aplicación firmada con la clave de la plataforma y que tiene sharedUserId = system; y una aplicación presente en/system/app? Las aplicaciones – Chaitanya

+0

en/system/app tienen acceso a permisos de nivel 2 (no 1 hasta donde yo sé). Independientemente de los permisos * otorgados *, las aplicaciones con un sharedUserId del sistema heredan los permisos otorgados a la aplicación "principal" y además se ejecutan en el mismo ID de proceso ya que es "principal". Varias API comprueban el ID de proceso de la aplicación y les niegan el acceso si no son de un tipo específico. Aunque los 2 están mayormente vinculados, no * siempre * van de la mano.Esta es la forma no tecnológica de describirlo, estoy seguro de que otras personas harían un mejor trabajo ... – slinden77

Respuesta

4

seguí cavando, y aquí están los resultados:

  • Android tiene este control en su.c: [ "raíz de la fuente de Android" /system/extras/su/su.c]
/* Until we have something better, only root and the shell can use su.*/ 
myuid = getuid(); 
if (myuid != AID_ROOT && myuid != AID_SHELL) { 
    fprintf(stderr,"su: uid %d not allowed to su\n", myuid); 
    return 1; 
} 

ChainsDD (superusuario) y mod cianógeno evitar esto mediante la aplicación de su propia su.c: https://github.com/CyanogenMod/android_system_su/blob/master/su.c

Acepto esto como respuesta por ahora.

+0

¿puede una aplicación copiarse a la carpeta del sistema en lugar de usar una aplicación externa? ¿Puedes aclarar los comandos utilizados para copiar la aplicación? Además, ¿cómo puedo obtener la clave de la plataforma? Gracias. – Dania

Cuestiones relacionadas