Das Hinzufügen eines Dienstes zum Ausführen des Skripts in init.rc wird nicht ausgeführt

Ich habe frühere Fragen zu diesem Thema recherchiert, aber leider hat nichts funktioniert.

Ich versuche, die Statusleiste von Benutzern zu deaktivieren, die beim Booten mit diesem Befehl vom oberen Rand des Geräts zur adb-Konsole gleiten (die beim Neustart des Telefons wieder aktiviert wird, Änderungen werden nach dem Neustart verworfen):

service call activity 42 s16 com.android.systemui

so dass sie beim Hochfahren meiner Anwendung nicht von oben gleiten können, um die Statusleiste anzuzeigen. Ich habe diese Zeile in ein Skript namens init_remove.sh mit folgenden Zeilen eingefügt:

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

Wenn der Benutzer sein Telefon neu startet, möchte ich, dass die Datei init.rc einen Dienst startet, um dieses Skript jedes Mal auszuführen. Ich habe diese Codezeilen am Ende der Datei init.rc hinzugefügt :

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

Ich habe dann die Datei uramdisk.img neu kompiliert und auf mein gerootetes Gerät geschoben. Die neue init.rc ist mit den hinzugefügten Änderungen zu sehen, aber ich kann immer noch von oben wischen, um die Statusleiste anzuzeigen.

Was mache ich falsch

BEARBEITEN: Ich habe dies jetzt sogar in der Datei init.rc versucht, um meinen Dienst aus dem folgenden Vorschlag zu starten:

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

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

aber immer noch keine Änderung ... sind meine Property-Trigger falsch?

2 TAGE SPÄTER BEARBEITEN:

Jetzt weiß ich also, dass mein Dienst bemerkt wird, wenn init ausgeführt wird, aber aufgrund von Berechtigungsproblemen, die unten zu sehen sind, nicht ausgeführt werden kann:

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

wie aus der Ausgabe auf der Konsole ersichtlich. Mein aktualisierter neuer Dienst in der init.rc:

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

Ich führe den Dienst als System aus, da er angeblich rw hat und Berechtigungen ausführt: aber er kann immer noch nicht ausführen. Was meiner Meinung nach das Problem sein könnte, ist, dass der Einhängepunkt für das Dateisystem als schreibgeschützt aufgeführt ist, was vom Befehl mount angezeigt wird:

/ $ 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

Aber ich kann nicht herausfinden, wo ich in der Datei init.rc die Partition dieses /system-Dateisystems auf rw setzen (und ausführen) kann, wenn es gemountet wird.

Antworten (3)

Sie müssen nicht einmal in Ihren Computer ziehen Sie müssen nur verwenden chmod 755 myscriptUnd voila, das ist alles

Das ist nur die Dienstdeklaration, es muss eine Möglichkeit geben, den Dienst zu starten, damit er funktioniert. Du musst anrufen

start init_remove

in Ihrem gewünschten Trigger-Ereignis für den zu startenden Dienst stehen je nach Boot-Position unterschiedliche Trigger zur Verfügung, für Ihren Fall starten Sie Ihren "init_remove"-Dienst, nachdem Systemdienste und Zygote gestartet wurden.

Alternativ können Sie auch einige Dienstklassen verwenden, die sich in Ihrem Init-Skript befinden, und Ihr Skript wird automatisch zusammen mit den Diensten in Ihrer angegebenen Klasse ausgeführt, ohne dass ein expliziter Start erforderlich ist.

Lesen Sie hier die Readme-Datei zur Init-Syntax

Ich habe versucht, nach Auslösern zu suchen, die nach Zygote und Systemdiensten auftreten. Ich weiß nicht, ob ich Post-Init oder ähnliches verwenden soll. Ich werde weiter forschen ... danke für die Antwort, ich werde akzeptieren, wenn ich es lösen kann.
Bitte sehen Sie meine Bearbeitung oben für das, was ich versucht habe
Suchen Sie einen Auslöser, der dem Abschluss des Startvorgangs am nächsten liegt, der funktionieren sollte, da bis dahin alle Systemdienste gestartet worden wären. Wenn Ihre Init-Skripte z. B. einen sys.boot_completed=1-Eigenschaftsauslöser haben, könnte dies ein guter Ausgangspunkt sein
Ich habe das versucht. aber ich bekomme diesen Fehler: init: cannot execve('/system/etc/init_remove.sh'): Permission deniedweil das gesamte Dateisystem nur gelesen wird. Ich müsste manuell remounten
Einige Fortschritte ... siehe meine aktualisierte Bearbeitung oben
Haben Sie die entsprechenden Berechtigungen für Ihr Skript geändert? Versuchen Sie, es zuerst über Emulator oder ADB auszuführen, während das System läuft
Ja, ich verstehe Bad Mode. Ich denke, ich muss es an einem anderen Ort platzieren?
Der Speicherort im System spielt keine Rolle, stellen Sie einfach sicher, dass es die entsprechenden Berechtigungen zum Ausführen hat und sich beim Testen wie erwartet verhält
Es läuft , wenn ich tippe, sh myscriptaber nicht, wenn ich es tue./myscript
Danke @Aug.Thade . Du hast mich in die richtige Richtung gelenkt. Ich habe es aufgrund deiner Aussage herausgefunden

Wie immer war die Antwort einfacher (obwohl es Stunden der Recherche erforderte), als ich dachte.

Erläuterung

Die Antwort war, dass init die Datei nicht als ausführbar betrachtete. execveIch fand heraus, dass der Systemaufruf Fehler von zurückgibt Permission denied, weil er nicht feststellen kann, dass es sich um den richtigen Dateityp handelt, der ausgeführt werden soll, inmitten anderer Fehler, die ihn verursachen könnten. Da @Agu.Thade erwähnte, ob ich Berechtigungen hätte, habe ich mehr darüber recherchiert. Nachdem ich ungefähr 16 Stunden lang versucht hatte, ro-Dateisystem-Mist zu umgehen, von dem ich dachte, dass er das Problem verursacht, stellte ich fest, dass alle ausführbaren Dateien im Ordner /system/bin grün waren und mein Skript weiß war (normale Datei). Also habe ich mit dem chmod-Rat von @Agu.Thade versucht, chmod +xvon adb zu kommen, was Bad mode.

Antworten

Drei Stunden später überlegte ich endlich , ob ich das Skript vielleicht auf meinen Computer holen sollte, chmod +x myscriptund adb push myscript /system/bin/. Ich tat dies, lief lsund SURE GENUG, die Datei wurde grün (als ausführbar erkannt). Habe einen Neustart durchgeführt und natürlich lief mein Skript.