Wie führe ich ein Skript beim Booten in CM12.1 aus?

Die meisten Fragen, die ich diesbezüglich finden kann, stammen aus dem Jahr 2011 und so, daher ist es vielleicht nicht allzu überraschend, dass sich die Dinge seitdem geändert haben. Ich habe eine ganze Reihe von Dingen ausprobiert, ohne jegliche Ergebnisse.

Es gibt einige Skripte in /system/etc/init.d(die auch unter /etc/init.dauf meinem Gerät erscheinen). Insbesondere gibt es ein 00bannerSkript, das eine Willkommensnachricht protokollieren soll. Die Willkommensnachricht erscheint nie in Logcat.

Ich habe hier mein eigenes Skript platziert, das schließlich auf nichts anderes reduziert wurde:

#!/system/bin/sh
log -t mytest Testing

Gar nichts. Erscheint nie in Logcat, es sei denn, es wird manuell über das Terminal ausgeführt. Dann funktioniert es.

Es gibt hier auch eine 90userinitDatei, die aufgerufen wird, /data/local/userinit.shfalls sie existiert. Ich habe es mit dem gleichen Inhalt wie oben erstellt. Auch hier wird in logcat nie etwas angezeigt. Was eigentlich nicht verwunderlich ist, denn wenn 00banneres nicht läuft, würde dies auch nicht funktionieren.

Ich habe nach etwas namens "init.rc" gesucht, aber auf meinem Gerät existiert nichts dergleichen.

Alle meine Skripte haben 755-Berechtigungen.

Was kann ich noch versuchen? (außer Apps, die Skripte für mich ausführen)

Welches Skript möchten Sie ausführen und warum?
Leider führte die kleine Menge an Graben, die ich tat, zu "Funktioniert nicht mit benutzerdefinierten Roms". Anscheinend hat CM seine eigene Art, Dinge zu tun. Nicht sicher, ob Sie damit herumspielen wollen. Aber anscheinend können Sie Ihre eigene boot.img-Datei erstellen und Ihre benutzerdefinierten Skripte hinzufügen. Vielleicht funktioniert das bei dir.
@jer3my Ich akzeptiere das gerne als eigentliche Antwort und weise das Kopfgeld zu, wenn Sie Links haben, die ich überzeugend / maßgeblich finde.
Ich werde die Antwort in einer Sekunde posten, habe auch etwas anderes gefunden, das Ihnen helfen könnte.
Die init.rc ist Teil des initramfs, sie ist nicht in der boot.img enthalten. Sie können ein Tool wie unmkbootimg verwenden, um sie zu extrahieren, bearbeiten und dann mit mkbootimg neu erstellen. Die beiden Tools sind im cm-Projekt verfügbar. Sagen Sie mir, welches Betriebssystem Sie verwenden verwenden, werde ich sie für Sie zusammenstellen :D
@lord-ralf-adolf danke dafür, wird es überleben, wenn ich einen neuen Build von CM flashe? Wenn nicht, wird das bei mir nicht funktionieren.
Leider wird es nicht neu blinken. CM wird neu boot.img blinken, aber nichts ist unmöglich. Was ist Ihre Geräte-CPU-Architektur und -Revision? ? hat es funktioniert ? Wenn es funktioniert hat, kann ich ein zusätzliches Skript hinzufügen, um Ota überleben zu lassen. Es wird einfacher sein, als den Kernel bei jedem Systemupdate zu bearbeiten.
@lord-ralf-adolf Ich habe es getan, ich bin derjenige, der dafür gestimmt hat. Vielen Dank für Ihre Hilfe, aber ich möchte nicht mit dem mkbootimg-Ansatz fortfahren.
OK, aber wenn meine Methode funktioniert, kann ich ein Skript erstellen, das die Funktion init.d jedes Mal sichert, wenn Sie eine neue nächtliche Version automatisch flashen, wenn Sie sie flashen, ohne dass Sie es bemerken. Sie müssen es nur unter /system/adon.d ablegen

Antworten (6)

Es gibt eine einfache Methode, um init.d-Unterstützung zu jedem gerooteten Android für die Versionen 4.0 und höher hinzuzufügen. Google hat ein Skript erstellt, das beim Booten als Superuser ausgeführt wird. Das Skript wird install-recovery.shverwendet, um die Bestandswiederherstellung bei jedem Start neu zu flashen, den sie für gut hielten Sicherheit, um benutzerdefinierte Wiederherstellungen zu verhindern, aber es öffnete eine neue Lücke, die von Benutzern ausgenutzt werden kann, um die init.d-Funktion zu fälschen. Abhängigkeiten : Damit diese Methode funktioniert, benötigen Sie Folgendes

  1. Beschäftigte Box mit installiertem run-partsSymlink zu Ihrem Pfad wie/system/xbin
  2. Offensichtlich benötigen Sie ein gerootetes Telefon mit der /systemFähigkeit, als zu mountenrw
  3. Kernel-Version spielt keine Rolle.

Methode I: (Der einfachste Weg!)

  1. Laden Sie dieses APK herunter (kostenlos, nicht spiegeln, danke @Ryuinferno von XDA).
  2. Installieren Sie die apk wie jede normale App.
  3. Starten Sie die App.
  4. klicken Sie auf Aktivieren! Das war's schon. setinit.d wird jetzt unterstützt. Sie können auf die Testschaltfläche klicken oder Ihr Telefon neu starten, um zu sehen, ob Ihre init.d-Skripte beendet wurden
  5. Sie können die Anwendung deinstallieren, dies hat keine Auswirkungen auf die init.d-Unterstützung

Methode II : (Schwierigkeit: mittel)

  1. Laden Sie diese Zip -Datei herunter, entpacken Sie sie und legen Sie init.sh auf Ihrer SD-Karte ab (in diesem Beispiel /sdcardkann sie sich von Gerät zu Gerät ändern.

  2. Öffnen Sie jetzt ein Terminal oder verwenden Sie adb shelles vom Computer und führen Sie das Skript aus.
    su
    cp /sdcard/init.sh /data/tmp/init.sh
    chmod 777 /data/tmp/init.sh
    /data/tmp/init.sh

Das Skript wird ausgeführt und fordert Sie auf, zweimal neu zu starten. Das ist es, was Sie offiziell init.d-Unterstützung haben: D

Referenz: [MOD][APK+SCRIPT+ZIP] Init.d für alle Telefone aktivieren, ohne dass benutzerdefinierte Kernel benötigt werden!!!

Da die ZIP-Datei bei XDA gehostet wird, muss es ein Tutorial geben, dem Sie gefolgt sind oder das Sie irgendwie kennengelernt haben. Kannst du den Link dazu nennen? Da muss ich noch was suchen. :)
@Firelord ja, das Skript gehört nicht mir, es wurde für andere Zwecke verwendet, ich habe es von hier aus der Einzelpostansicht > forum.xda-developers.com/… genommen , das vollständige Tutorial handelt von xposed und Nexus 6 >> forum.xda -developers.com/nexus-6/general/…
@Firelord finden Sie einen neuen Referenzlink, der in der Antwort enthalten ist :)
Danke, ich gebe dir wahrscheinlich das Kopfgeld, es sei denn, es kommt etwas noch Einfacheres. Aber ich dachte ehrlich, das Hinzufügen eines Shell-Skripts, das beim Booten ausgeführt wird, wäre das Einfachste, was man jemals auf etwas wie CM tun könnte. Offensichtlich ist es nicht; Es ist komplizierter, als eine boot_completed-App zu codieren, die das tut, was ich will, also mache ich das stattdessen einfach.
@romkyns alter cm unterstützt standardmäßig init.d, aber seit es ein Unternehmen wurde, haben sich ihre Wege geändert, obwohl das init.d-Problem auf der neuen Lollipop-Version mit strenger Selinux-Richtlinie liegt /boot_completed ist eine Möglichkeit, dies auch und wie Sie zu tun sagte, es wird einfacher sein
Der zweite Weg ist für mich einfacher und sauberer. Vielen Dank.
Ist /etc nicht Teil der Ramdisk? Wenn ja, wie kann das Skript diesen Ordner ändern?
@ransh usw. ist kein Teil der Ramdisk, es befindet sich unter der Systempartition /system/etc
@lord-ralf-adolf kann ich Methode 1 sicher auf einer Android 11 TV Box ausprobieren? Ich habe es geschafft, die bootanimation.zip mit viel Rätselraten zu ersetzen. Aber ich kann keine einfachen Schritte finden, um das Grafik-Splash-Image wie "X98plus" (ich glaube, sie bezeichnen es als Kernel-Splash) zu ersetzen, wenn Sie einen Zeiger haben, wo Sie diese Grafik finden und wie Sie sie ersetzen können. TIA. Diese "chinesischen" Kisten gehen davon aus, dass sie verwurzelt sind.

Bearbeiten: Ich habe das Ende des Beitrags gesehen. Auf diese Weise werde ich versuchen, so schnell wie möglich ohne Apps hinzuzufügen (nicht zu Hause, Veröffentlichung mit dem Handy), aber Sie können dies verwenden, wenn etwas anderes nicht funktioniert.

Sie können versuchen, die App Tasker zu verwenden .

Es kostet 3,29 $ und erfordert Root-Zugriff, kann aber Shell-Skripte ausführen. Außerdem gibt es eine Testversion, damit Sie es vor dem Kauf ausprobieren können.

Erstellen Sie zuerst eine Aufgabe. Gehen Sie zur Registerkarte Aufgabe, tippen Sie auf + Zeichen, geben Sie den Namen der Aufgabe ein. Gehen Sie jetzt erneut + Zeichen und geben Sie shellFilter ein. Sie finden die Option Run Shell, wählen sie aus und konfigurieren sie nach Ihren Bedürfnissen.

Gehen Sie danach zurück zum ersten Tab - Profile, tippen Sie auf + Zeichen, um ein neues zu erstellen. Wählen Sie Ereignis als Typ, gehen Sie zu System und wählen Sie Gerätestart. Gehen Sie zurück und Sie werden aufgefordert, eine Aufgabe auszuwählen. Wählen Sie nun die zuvor erstellte Aufgabe aus und Sie können loslegen!

Dies erfordert, dass Sie eine Zip-Datei flashen, aber dann können Sie Ihre Skripte in /system/etc/startup ablegen, und dann sollten sie automatisch mit dem Telefon gestartet werden.

http://forum.xda-developers.com/showthread.php?t=2664645

Auch aus meinem Kommentar unter der Frage. Ich habe versucht, in meinem Verlauf zu suchen, aber ich konnte den Link nicht finden, wo Leute behaupteten, dass CM ihre eigene Art hatte, Skripte beim Booten auszuführen.

Bearbeiten. Nach einigem mehr Graben ist es nicht CM, sagen wir, das macht sein eigenes Ding für Skripte. Es ist der Kernel. Nicht alle Kernel unterstützen init.d für Android. Wenn Sie posten, welches Gerät Sie verwenden. Ich kann mich nach einem Kernel umsehen, der benutzerdefinierte Skripte beim Booten für Sie unterstützt.

Ich habe auch das gleiche Problem beim Ausführen der Skriptdatei im Terminal in CM12.1. Die Lösung besteht darin, das Skript in den /dataOrdner zu kopieren und auszuführen. Ich denke also, CM 12 erlaubt nur Skripts, die von bestimmten Orten ausführbar sind.

Einfacher Weg (Arbeiten):

  1. Bereiten Sie Ihre Post-Boot-Befehle in einem Skript vor, sagen Sie /system/xbin/post-boot (set exec perm)

  2. Fügen Sie den obigen benutzerdefinierten Skriptpfad am Ende von /system/etc/init.qcom.post_boot.sh hinzu

Z.B:

echo /system/xbin/post-boot >> /system/etc/init.qcom.post_boot.sh

Getan!

(Wenn Sie qcom post_boot (Qualcomm-Geräte) nicht finden können, suchen Sie nach post_boot-Skripten.)

Befolgen Sie die Schritte zum Ausführen von Skripts beim Booten. (erforderlich)

  1. Adb-Stamm
  2. adb remount
  3. adb pull /init.rc
  4. Bearbeiten Sie init.rc, fügen Sie eine Zeile hinzu, um ein Skript wie sh test.sh auszuführen
  5. adb push init.rc /
  6. ADB Shell
  7. chmod 755 init.rc
  8. ADB-Neustart

es funktioniert für mich. Ich hoffe, das hilft Ihnen.

Diese Methode sollte überhaupt nicht funktionieren. Der Inhalt der anfänglichen Rootfs wie init.rc ist Teil der Ramdisk, die bei jedem Start von Ihrem Geräte-Flash wiederhergestellt wird. Sie müssen die Ramdisk direkt in der richtigen Partition des Flash-Speichers Ihres Geräts ändern
Dann können Sie in /system/etc/init.qcom.wifi.sh hinzufügen
Diese Methode funktioniert nicht, init.d kann nicht gepusht werden! Es ist Teil des initramfs, sie müssen auf dem boot.img bearbeitet und dann erneut geflasht werden, und für init.qcom.wifi.sh ist es gerätespezifisch, Sie können daraus keine allgemeine Regel machen