4 votos

Añadir servicio para ejecutar script en init.rc no se ejecuta

He investigado preguntas anteriores con este tema pero lamentablemente nada ha funcionado.

Estoy tratando de desactivar la barra de estado de los usuarios que se deslizan desde la parte superior del dispositivo al arrancar con este comando a la consola adb (que se volverá a activar si se reinicia el teléfono, los cambios se descartan después del reinicio):

service call activity 42 s16 com.android.systemui

para que cuando mi aplicación arranque, no puedan deslizarse desde arriba para ver la barra de estado. Puse esa línea en un script llamado init_remove.sh con líneas debajo:

#!/system/bin/sh
service call activity 42 s16 com.android.systemui 

cada vez que el usuario reinicie su teléfono, quiero que el archivo init.rc inicie un servicio para ejecutar ese script cada vez. He añadido estas líneas de código al final del archivo init.rc archivo:

# service to remove status bar
service init_remove /system/etc/init_remove.sh
     user root
     oneshot

A continuación, volví a compilar el uramdisk.img archivo y lo empujó a mi dispositivo rooteado. El nuevo init.rc se puede ver con los cambios añadidos, pero todavía puedo deslizar desde la parte superior para ver la barra de estado.

¿Qué estoy haciendo mal?

EDITAR: Ahora incluso probé esto en el archivo init.rc para iniciar mi servicio desde la sugerencia de abajo:

on property:init.svc.zygote=running
    start init_remove

on property:init.svc.servicemanager=running
    start init_remove
     .
     .
     .

pero sigue sin haber cambios... ¿están mal mis activadores de propiedades?

EDITAR 2 DÍAS DESPUÉS:

Así que ahora sé que mi servicio está siendo notado cuando init se está ejecutando, pero no puede ser ejecutado debido a los problemas de permisos que se ven a continuación:

init: cannot execve('/system/bin/myscript'): Permission denied

como se ve en la salida de la consola. Mi nuevo servicio actualizado en el init.rc:

on boot
    start myscript
service myscript /system/bin/myscript
    user system
    disabled
    oneshot

Ejecuto el servicio como system ya que supuestamente tiene rw, y permisos de ejecución: pero sigue sin poder ejecutarse. Lo que creo que podría ser el problema es que el punto de montaje para el sistema de archivos aparece como de sólo lectura, visto por el comando mount:

/ $ mount
rootfs / rootfs rw,relatime 0 0
tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
tmpfs /mnt/secure tmpfs rw,seclabel,relatime,mode=700 0 0
tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/shm tmpfs rw,seclabel,relatime,size=1024k,mode=775,uid=1013,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
pstore /sys/fs/pstore pstore rw,relatime 0 0
/dev/block/mmcblk3p1 /boot vfat rw,noatime,nodiratime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
/dev/block/mmcblk3p2 /recovery vfat rw,noatime,nodiratime,fmask=0000,dmask=0000,allow_utime=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 0
/dev/block/mmcblk3p5 /system ext4 ro,seclabel,relatime,data=ordered 0 0
/dev/block/mmcblk3p4 /data ext4 rw,seclabel,nosuid,nodev,noatime,nodiratime,noauto_da_alloc,errors=panic,data=ordered 0 0
/dev/block/mmcblk3p6 /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0
/dev/block/mmcblk3p7 /device ext4 ro,seclabel,nosuid,nodev,relatime,data=ordered 0 0
adb /dev/usb-ffs/adb functionfs rw,relatime 0 0
none /sys/kernel/debug debugfs rw,relatime 0 0
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/block/vold/179:1 /mnt/media_rw/extsd vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1023,gid=1023,fmask=0007,dmask=0007,allow_utime=0020,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/fuse /storage/extsd fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

Pero no puedo averiguar dónde en el archivo init.rc puedo establecer la partición que /system filesystem a rw (y ejecutar) cuando se monta.

2voto

Claire Puntos 11

No necesitas ni siquiera entrar en tu ordenador Sólo tienes que utilizar chmod 755 myscript Y voilá, eso es todo

1voto

Agu.Thade Puntos 58

Eso es sólo la declaración del servicio, tiene que haber algún medio para iniciar el servicio para que funcione. Hay que llamar a

start init_remove

en su evento desencadenante deseado para que el servicio se inicie, hay diferentes desencadenantes disponibles dependiendo de la posición de arranque, para su caso inicie su servicio "init_remove" después de que los servicios del sistema y zygote se hayan iniciado.

Alternativamente, también puede utilizar algunas clases de servicio que están en su init script y su script se ejecutará automáticamente junto con los servicios de su clase especificada sin necesidad de un inicio explícito.

Compruebe la sintaxis de init readme aquí

0 votos

Estoy tratando de buscar desencadenantes que ocurran después de los servicios de zygote y del sistema. No sé si debo usar post-init o algo así. Seguiré investigando...gracias por la respuesta, aceptaré cuando consiga solucionarlo.

0 votos

Por favor, vea mi edición anterior para lo que he intentado

0 votos

Encuentre un disparador más cercano a la finalización del arranque, que debería funcionar ya que todos los servicios del sistema se habrán iniciado en ese momento. Por ejemplo, si sus scripts de inicio tienen el disparador de propiedad sys.boot_completed=1 entonces podría ser un buen lugar para empezar

1voto

Eric Reyna Puntos 1

Como siempre, la respuesta era más sencilla (aunque requiere horas de investigación) de lo que pensaba.

Explicación

La respuesta era que init no veía el archivo como ejecutable. La llamada al sistema execve , he descubierto que devuelve errores de Permission denied porque no puede determinar que es el tipo de archivo correcto para ejecutar, entre otros errores que podrían causarlo. Desde que @Agu.Thade mencionó que si tenía permisos, investigué más al respecto. Después de unas 16 horas de intentar solucionar la mierda del sistema de archivos que pensaba que estaba causando el problema, me di cuenta de que todos los ejecutables de la carpeta /system/bin estaban en verde y mi script estaba en blanco (archivo normal). Así que usando el consejo chmod de @Agu.Thade, intenté chmod +x de adb que devuelve Bad mode .

Respuesta

Tres horas después, yo finalmente pensé que tal vez debería llevar el script a mi ordenador, chmod +x myscript y adb push myscript /system/bin/ . Lo hice, corrí ls y, por supuesto, el archivo se puso en verde (reconocido como ejecutable). Reinicié, y por supuesto, mi script se ejecutó.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X