4 votes

L'ajout d'un service pour exécuter le script dans init.rc ne fonctionne pas

J'ai fait des recherches sur les questions précédentes concernant ce sujet, mais malheureusement rien n'a fonctionné.

J'essaie de désactiver la barre d'état des utilisateurs qui glissent du haut de l'appareil au démarrage avec cette commande à la console adb (qui sera réactivée si vous redémarrez le téléphone, les changements sont abandonnés après le redémarrage) :

service call activity 42 s16 com.android.systemui

de sorte que lorsque mon application démarre, ils ne peuvent pas glisser du haut vers le bas pour voir la barre d'état. J'ai placé cette ligne dans un script appelé init_remove.sh avec des lignes en dessous :

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

A chaque fois que l'utilisateur redémarre son téléphone, je veux que le fichier init.rc démarre un service pour exécuter ce script à chaque fois. J'ai ajouté ces lignes de code à la fin du fichier init.rc fichier :

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

J'ai ensuite recompilé le uramdisk.img et l'a poussé sur mon appareil enraciné. Le nouveau init.rc peut être vu avec les changements ajoutés mais je peux toujours glisser du haut vers le bas pour voir la barre d'état.

Qu'est-ce que je fais mal ?

EDIT : J'ai même essayé ceci dans le fichier init.rc pour démarrer mon service à partir de la suggestion ci-dessous :

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

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

mais toujours pas de changement... mes déclencheurs de propriété sont-ils mauvais ?

MODIFIER 2 JOURS PLUS TARD :

Maintenant, je sais que mon service est remarqué lorsque init est en cours d'exécution, mais qu'il ne peut pas être exécuté en raison de problèmes de permissions, comme indiqué ci-dessous :

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

comme le montre la sortie sur la console. Mon nouveau service mis à jour dans le init.rc :

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

J'ai exécuté le service en tant que système puisqu'il est censé avoir les permissions rw, et execute : mais il ne peut toujours pas s'exécuter. Ce que je pense être le problème est que le point de montage du système de fichiers est listé en lecture seule, vu par la commande 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

Mais je n'arrive pas à trouver où dans le fichier init.rc je peux définir la partition que le système de fichiers /system à rw (et exécuter) quand il se monte.

2voto

Fadlullah Points 21

Vous n'avez même pas besoin de vous connecter à votre ordinateur. Il vous suffit d'utiliser chmod 755 myscript Et voilà, c'est tout

1voto

dennyac Points 207

C'est juste la déclaration de service, il faut qu'il y ait des moyens de démarrer le service pour que cela fonctionne. Vous devez appeler

start init_remove

dans l'événement déclencheur que vous souhaitez pour le service à démarrer, différents déclencheurs sont disponibles en fonction de la position de démarrage, dans votre cas, démarrez votre service "init_remove" après que les services système et zygote aient démarré.

Vous pouvez également utiliser certaines classes de services qui se trouvent dans votre script init et votre script sera exécuté automatiquement avec les services de la classe spécifiée sans avoir besoin d'un démarrage explicite.

Vérifiez le readme de la syntaxe init ici

1voto

Eric Reyna Points 41

Comme toujours, la réponse est plus simple (même si elle nécessite des heures de recherche) que je ne le pensais.

Explication

La réponse était qu'init ne considérait pas le fichier comme exécutable. L'appel système execve j'ai découvert des erreurs de retour de Permission denied parce qu'il ne peut pas déterminer que c'est le bon type de fichier à exécuter, parmi d'autres erreurs qui pourraient le provoquer. Puisque @Agu.Thade a mentionné si j'avais des permissions, j'ai fait des recherches supplémentaires. Après environ 16 heures à essayer de contourner les problèmes de système de fichiers que je pensais être la cause du problème, j'ai réalisé que tous les exécutables du dossier /system/bin étaient verts et que mon script était blanc (fichier normal). Donc, en utilisant le conseil chmod de @Agu.Thade, j'ai essayé de chmod +x de adb qui a retourné Bad mode .

Réponse :

Trois heures plus tard, je enfin Je me suis dit que je devrais peut-être transférer le script sur mon ordinateur, chmod +x myscript y adb push myscript /system/bin/ . Je l'ai fait, j'ai couru ls et ENCORE, le fichier est devenu vert (reconnu comme exécutable). J'ai redémarré, et bien sûr, mon script s'est exécuté.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X