Cómo hacer que el sistema Android o la aplicación Android ejecute un script de shell
1 Cómo escribir servicios y scripts
Hay un 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 el siguiente en el archivo de script:
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:
En el directorio del dispositivo init.c (recuerde, no es system/core/init/init.rc)
En el directorio del dispositivo init.rc (recuerde, no es system/core/init/init.rcrc)
Hay una función handle_property_set_fd() en el bucle for (;;) del archivo principal función:
for (i = 0; i < fd_count; i++) {
if (ufds[i].fd == get_keychord_fd())
handle_keychord() ;
si no (ufds[i].fd == get_signal_fd())
handle_signal();
}
}
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 compruebe si uid tiene permisos. Inicie el servicio (msg.value es el nombre de su servicio) y devuelva 1 directamente si la aplicación es el usuario root o el usuario del sistema. 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);
}En caso contrario{
ERROR("mensaje de control desconocido '%s'\n", msg);
}
}
}
Coincide con la llamada de inicio msg_start. Así es como se inicia el servicio. Nuestra solución es "trabajar un poco más duro" donde verificamos los permisos. Como no estamos seguros del uid, permita que la función check_control_perms no verifique nuestro uid sino que verifique directamente el nombre de nuestro servicio. un vistazo a esta función:
static int check_control_perms(const char *name, unsigned int uid, unsigned int gid) {
int i;
if ( uid == AID_SYSTEM || uid == AID_ROOT)
Devuelve 1;
/* Buscar ACL */
para (i = 0; control_perms[i ].servicio; i++) {
if (strcmp(control_perms[i].servicio, nombre) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
retorno 1;
}
} p>
}
return 0;
}
la verificación de uid es obligatoria en esta función, simplemente la escribimos en para ciclo.
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.