Cómo hacer que el sistema Android o la aplicación Android ejecute un script de shell
1 Cómo escribir servicios y scripts
Existe el archivo /device/tegatech/tegav2/init.rc en el directorio raíz de Android Código fuente. Creo que todos están familiarizados con este archivo (si no, estudie detenidamente el proceso de inicio de Android). Si agrega algún contenido a este archivo de secuencia de comandos, puede usarlo para crear una nueva secuencia de comandos. Si agrega un servicio como:
servicio usblp_test /data/setip/init.usblpmod.sh
oneshot
disabled
NOTA: Cada dispositivo tendrá su propio archivo de script init.rc. onehot deshabilitado indica que el servicio no se iniciará automáticamente al iniciar el sistema. El propósito de este servicio es ejecutar el script /data/setip/init.usblpmod.sh. Siempre que se ajuste a la sintaxis del shell, puedes escribir lo que quieras. Por ejemplo, el script podría ser tan simple como configurar eth0:
#! /system/bin/sh // El comienzo del script debe escribirse así.
Ifconfig eth0 172.16.100.206 netmask 255.255.0.0 up // Comando para configurar ip
2. Cómo iniciar el servicio en la aplicación
1) Primero , Comprenda el proceso de inicio del servicio
1. Deje que el servicio agregado en init.rc se inicie en su aplicación.
Primero comprenda el proceso en el inicio del servicio:
init.c en el directorio del dispositivo (recuerde, no es system/core/init/init.rc)
Proceso en el inicio del servicio:
init.crc en el directorio del dispositivo)
Hay una función handle_property_set_fd() en el bucle for (;;) de la función principal:
for (i = 0; i lt; fd_count; i ) {
if (ufds[i].fd == get_keychord_fd())
handle_keychord ();
else if (ufds[i].fd == get_signal_fd())
handle_signal();
}< / p>
}
La implementación de esta función también se encuentra en el directorio system/core/init, función check_control_perms(msg.value, cr.uid, cr.gid), que se utiliza para verificar uid Si tiene permiso para iniciar el servicio (msg.value es el nombre de su servicio), si la aplicación es el usuario root o el usuario del sistema, devolverá directamente 1. A esto le sigue llamando a handle_control_message((char *) msg.name 4, (char *) msg.value). Los parámetros de esta función son Iniciar después de eliminar 1.ctl y 2. nombre del servicio.
Detalles de esta función:
void handle_control_message(const char *msg, const char *arg)
{
if (!strcmp(msg, "start " )) {
msg_start( arg);
} else if (! strcmp(msg, "stop")) {
msg_stop(arg); /p>
} else if (!strcmp(msg, "restart")) {
msg_stop(arg);
msg_start(arg); p> } else {
ERROR("mensajes de control desconocidos'\n", msg
}
}
< p); >}El servicio se inicia después de hacer coincidir el inicio y llamar a msg_start. Nuestra solución es "trabajar un poco más duro" donde verificamos los permisos, ya que no estamos seguros del uid, así que dejemos que la función check_control_perms no verifique nuestro uid, sino que verifique directamente el nombre de nuestro servicio, mire esta función: p>
static int check_control_perms(const char *nombre, unsigned int uid, unsigned int gid) {
int i;
if (uid == AID_SYSTEM || uid = = AID_ROOT)
return 1;
/* Buscar en la ACL */
para (i = 0; control_perms[i].service; i) {
if (strcmp(control_perms[i].servicio, nombre) == 0) {
if ((uid amp; amp; control_perms[i].uid == uid) || p>
(gid amp; amp; control_perms[i].gid == gid)) {
return
}
}
}
}
Devuelve 0;
}
el uid debe marcarse en este función, solo la escribimos en un bucle for.
if (strcmp("usblp_test",name)==0)//usblp_test es el nombre de nuestro servicio.
return 1;
Esto no destruye la estructura original de Android y no tiene ningún efecto secundario.
init.c e init.rc se han modificado para que ahora pueda compilar el código fuente y cargarlo en la placa de desarrollo de la máquina.