
Aufgrund der Tatsache, dass mobile Geräte seit langem über umfangreiche Funktionen verfügen, können Automatisierungsaufgaben problemlos auf diese übertragen werden. Und so gut wie möglich ist cron genauso gut, um sie auszuführen. Wenn cron in "normalen" Linux-Systemen etwas Zeit benötigt, erfordert die Konfiguration eines Android-Geräts kompliziertere Arbeiten.
Wenn Sie sich für das Thema Automatisierung interessieren und möchten, dass Ihre Shell-Skripte sofort nach dem Start des Geräts ausgeführt werden und sogar mit einem Timer gestartet werden können - willkommen bei der Katze!
Vorwort
Ich beschäftige mich mit der Automatisierung von Mobilgeräten für Android. Und während der Ausführung von automatischen Skripten treten viele unvorhergesehene Situationen auf, selbst wenn dieselben Geräte zum Testen verwendet werden.
Die beliebtesten Probleme:
0. Das Automatisierungsskript macht nicht das, was Sie wollten.
1. Die mobile Anwendung wird automatisch heruntergeladen
2. Automatischer Neustart des Telefons
3. Die mobile Anwendung wird nach einem Neustart nicht automatisch gestartet
4. Das Wi-Fi-Modul wird zufällig ausgeschaltet, findet das Netzwerk nicht und stellt keine Verbindung zum Netzwerk her
5. Das Mobilfunknetz verschwand plötzlich
6. Das Telefon ging in den Ruhemodus
7. Der Proxy wurde gelöscht oder der Server selbst oder der Server hat eine seltsame Antwort zurückgegeben
Aus diesem Grund müssen Sie das Gerät ständig überwachen und diese unvorhergesehenen Situationen erfassen.

Daher bin ich zu dem Schluss gekommen, dass Sie mit cron mit den "richtigen" Skripten Softwarefehler verfolgen und das Automatisierungsskript wiederherstellen oder erneut ausführen können. Aber wie sich herausstellte, gab es, obwohl Android den Linux-Kernel enthält, spezielle Nuancen, mit denen ich mich befassen musste. Beginnen wir also mit dem Einrichten!
Cron-Setup
Passen Sie die Umgebung an
- Installieren Sie adb , um über die Shell mit einem USB- Kabel auf das Gerät zuzugreifen.
- Wir öffnen den Bereich Für Entwickler . Gehen Sie dazu zum Abschnitt " Über Telefon " und klicken Sie ein paar Mal auf die Build-Nummer oder ähnliches.
- Wir gehen zum Abschnitt Für Entwickler und aktivieren ihn. Wir verbinden das Gerät mit dem Computer und erlauben auf diesem Computer den Zugriff auf dieses Gerät.
- Fügen Sie root für Ihr Gerät hinzu. Die häufigsten Optionen sind SuperSu , Magisk und Kingroot . Gehen Sie zu w3bsit3-dns.com und suchen Sie die Root-Option für Ihr Gerät. Leider gibt es keine universelle Wurzel.
- Wir installieren BusyBox (es ist zum Beispiel auch auf w3bsit3-dns.com), da es nur ein Cron-Programm enthält.
Manuelle Starteinstellung
- Wir stellen über die ADB-Shell eine Verbindung zum Telefon her (wenn ADB nicht in Ihrer Umgebungsvariablen registriert ist, fügen Sie den vollständigen Pfad hinzu.
- Wechseln Sie mit dem Befehl su in den Root-Modus
- Wir überprüfen das Vorhandensein des Cron-Programms und sehen die Einstellungen mit dem Befehl crond -h
Ausführungsergebniscrond: invalid option -- h BusyBox v1.29.2-Stericson (2018-08-12 11:19:12 EDT) multi-call binary. Usage: crond -fbS -l N -d N -L LOGFILE -c DIR -f Foreground -b Background (default) -S Log to syslog (default) -l N Set log level. Most verbose 0, default 8 -d N Set log level, log to stderr -L FILE Log to FILE -c DIR Cron dir. Default:/var/spool/cron/crontabs
Wie Sie in der letzten Zeile sehen können, sollten die Standardanweisungen im Verzeichnis
/ var / spool / cron / crontabs gespeichert werden , das nicht automatisch erstellt wird und wenn wir den Befehl ausführen
crond -b
und überprüfen Sie dann, ob der Prozess gestartet wurde
ps | grep crond
, dann kann es nicht da sein, weil er konnte keine Anweisungen bekommen. Führen wir also den Befehl aus
crond -b -fd0
und sehen, was der Grund ist. Höchstwahrscheinlich haben Sie einen ähnlichen Fehler:
crond: can't change directory to '/var/spool/cron/crontabs': No such file or directory
. In diesem Fall ist dies normal, weil In Zukunft werden wir selbst den Pfad zur ausführbaren Datei von crontab angeben.
4. Erstellen Sie eine einfache Crontab-Datei:
mkdir /data/crontab echo "*/1 * * * * echo 'text' >> /sdcard/test.txt" > /data/crontab/root
Jetzt haben wir eine Aufgabe, bei der jede Minute das Wort
Text zur Datei
/sdcard/test.txt hinzugefügt wirdWir starten:
crond -b -fd0 -c /data/crontab
und erhalten Sie das folgende Protokoll:
crond: crond (busybox 1.29.2-Stericson) started, log level 0 crond: ignoring file 'root' (no such user) ...
Es ist natürlich ein wenig überraschend, denn wenn wir den
whoami-Befehl ausführen
, wird als Ergebnis
root zurückgegeben .
5. Fügen Sie den Root-Benutzer hinzu, da crond fragt:
mount -o remount,rw /system; echo "root:x:0:0::/system/etc/crontabs:/system/bin/sh" >> /system/etc/passwd; mount -o remount,ro /system;
Aufgrund des Fehlens dieser Datei wurde mir klar, dass sie im Android-System überhaupt nicht beteiligt ist. Wenn Sie sicher sind, wo Sie Ihre Crontab-Dateien speichern werden, können Sie die Zeile
/ system / etc / crontabs durch die benötigte ersetzen. Führen Sie den Befehl erneut aus
crond -b -fd0 -c /data/crontab
Und wir bekommen folgendes:
crond: user:root entry:*/1 * * * * echo 'text' >> /sdcard/test.txt 111111111111111111111111111111111111111111111111111111111111 111111111111111111111111 11111111111111111111111111111111 111111111111 1111111 crond: wakeup dt=16 crond: file root: crond: line echo 'text' >> /sdcard/test.txt crond: job: 0 echo 'text' >> /sdcard/test.txt crond: can't change directory to '/system/etc/crontabs' crond: can't change directory to '/var/spool/cron': No such file or directory crond: USER root pid 12849 cmd echo 'text' >> /sdcard/test.txt
Laut Protokoll wurde die Aufgabe zwar in crond registriert, aber in meinem Fall wurde die Datei nicht erstellt. Das Problem kann sehr einfach gelöst werden:
mkdir -p /system/etc/crontabs
Nun, er möchte, dass dort ein Verzeichnis existiert. Wen sollen wir ihm verbieten? Wir fangen wieder an und sehen:
crond: user:root entry:*/1 * * * * echo 'text' >> /sdcard/test.txt 111111111111111111111111111111111111111111111111111111111111 111111111111111111111111 11111111111111111111111111111111 111111111111 1111111 crond: wakeup dt=12 crond: file root: crond: line echo 'text' >> /sdcard/test.txt crond: job: 0 echo 'text' >> /sdcard/test.txt crond: child running /system/bin/sh crond: USER root pid 13033 cmd echo 'text' >> /sdcard/test.txt
Die Fehler gingen weg und die Zeile
crond: child running / system / bin / sh erschien . Schließlich wurde cron erfolgreich abgewickelt und Sie können mit dem zweiten Teil fortfahren!
Automatischer Shell-Skript-Download
Das Linux-System verfügt über ein Verzeichnis
init.d , das unmittelbar nach dem Systemstart für den Autostart verantwortlich ist. Versuchen wir es also auf diese Weise!
1. Überprüfen Sie, ob dieses Verzeichnis auf Ihrem Gerät vorhanden ist (dies ist
/etc/init.d oder
/system/etc/init.d - dies ist dieselbe gemountete Partition usw.). In meinem Fall ist es nicht. Nun, dann erstellen Sie:
mount -o remount,rw /system mkdir /system/etc/init.d chmod 0755 /system/etc/init.d mount -o remount,ro /system
Fügen Sie dort nun ein einfaches Skript hinzu, zum Beispiel:
echo "echo 'Init.d is working !!!' >> /sdcard/init_test.log" > /system/etc/init.d/90my_script chmod 777 /system/etc/init.d/90my_script
Wir starten das Gerät neu und sehen, ob ein Wunder passiert ist ... Leider wurde meine Datei nicht angezeigt.
Wir untersuchen das System weiter und suchen nach einer Init-Datei, die nach dem Start Skripte ausführen kann. Ich hatte eine Datei in
/init.rc auf meinem Gerät. Versuchen wir es zu ändern und das Gerät neu zu starten:
mount -o remount,rw / echo "echo 'Init.d is working !!!' >> /sdcard/init_test.log" >> /init.rc mount -o remount,ro / reboot
Die Datei wurde jedoch nicht erneut erstellt. Wir schauen uns die Datei
/init.rc an und unser Datensatz ist verschwunden und die Datei schien sich nicht zu ändern, weil Das Erstellungsdatum ist ziemlich seltsam (in meinem Fall 1. Januar 70, 05:00:00 Uhr).
Wir verstehen weiterhin, und es stellt sich heraus, dass diese Datei in
boot.img gespeichert ist und jedes Mal, wenn sie herauskommt. Und um die Funktionalität der Datei
init.rc zu ändern,
müssen Sie dies alles tun.
Es gibt jedoch einen einfacheren Weg, um dieses Problem zu lösen. Für diese Methode können wir das folgende Shell-Skript verwenden (sagen wir danke an Ryuinferno):
Erste Schritte mit dem Skript! In meinem Fall heißt es init.sh.
1. Laden Sie die Datei auf die SD-Karte des Mobilgeräts herunter:
adb push /tmp/init.sh /sdcard
2. Kopieren Sie in den Speicher des Mobilgeräts und legen Sie die erforderlichen Rechte fest:
adb shell su cp /sdcard/init.sh /data/init.sh chmod 777 /data/init.sh
3. Zur Ausführung ausführen:
/data/init.sh
Und achten Sie auf das angezeigte Protokoll. Hier ist mein Log:
Führen Sie das Protokoll aus Init.d Enabler by Ryuinferno @ XDA Hello Supaa User! :P busybox found! Awesome! grep found! :D Good! run-parts found! :) Great! Let's proceed... Press enter to continue... Mounting system as rewritable... Removing old sysinit file rm: /system/bin/sysinit: No such file or directory Checking for the presence of sysinit in /system/bin... sysinit not found, creating file... Setting correct permissions and ownership for sysinit... Checking for the presence of install-recovery.sh... install-recovery.sh not found, creating it... Setting the correct permissions and ownership for install-recovery.sh... Also for install-recovery-2.sh if it exists... Checking for the presence of the init.d folder... init.d folder found... Creating basic init.d scripts... Creating permissive SELinux script... Setting correct permissions and ownership for init.d folder and scipts... Mounting system as read-only... Done!!! Please reboot at least twice before checking /data... If init.d is working, you will see a Test.log in /data... Enjoy!!! =) Ryuinferno @ XDA 2013
Wie Sie dem Protokoll entnehmen können, gibt es keine Fehler. Sie können das Gerät also neu starten! Vielleicht hat bereits jemand gearbeitet und Sie konnten die Datei
/data/Test.log finden, aber ich habe sie nicht. Überprüfen Sie das Verzeichnis
/system/etc/init.d mit dem
Befehl ls :
00test 01permissive 08setperm
Wie Sie sehen, wurden die Aufgaben erfolgreich erstellt. Möglicherweise müssen Sie noch
boot.img ändern, aber lassen Sie uns am Anfang überprüfen, wo sich die Datei
install-recovery.sh mit dem Befehl befindet
find / -name "install-recovery.sh" ... /system/bin/install-recovery.sh /system/etc/install-recovery.sh ...
Wie wir sehen können, haben wir 2 Dateien, die an verschiedenen Orten liegen. Zum Zeitpunkt der Erstellung können wir feststellen, dass das Skript die Datei im Verzeichnis
/system/etc/install-recovery.sh erstellt hat , obwohl es in einigen Fällen möglicherweise in
/ system / usw. erstellt werden sollte. Lassen Sie uns die Datei in bin umbenennen und die Datei von etc kopieren:
mount -o remount,rw /system mv /install-recovery.sh /system/bin/install-recovery2.sh cp /install-recovery.sh /system/bin/
UPD : Bitte beachten Sie, dass der Sicherheitskontext für beide Dateien übereinstimmen muss. Und wenn Sie beim Kopieren plötzlich verloren gegangen sind (obwohl dies theoretisch nicht der Fall sein sollte), müssen Sie es wiederherstellen (z. B. über das Dienstprogramm
chcon ). Siehe die vollständigen
Dateiinformationen mit
ls -lZ :
ls -lZ /system/etc/install-recovery.sh
Hier ist
u: object_r: system_file: s0 Sicherheitskontexte.
Und wieder starten wir das Gerät neu ... Und nun endlich der lang erwartete ERFOLG! Die Datei
/data/Test.log ist erschienen!
Wenn alles funktioniert, gehen Sie zu
/system/etc/init.d und erstellen Sie ein Shell-Skript. Und darin führen Sie einfach unsere Crond aus, um Folgendes auszuführen:
echo "#!/system/bin/sh crond -b -L /sdcard/error.log -c /data/crontab" > /system/etc/init.d/99cronstart chmod 777 /system/etc/init.d/99cronstart reboot
Überprüfen Sie nach dem Herunterladen, ob crond gestartet wurde:
ps | grep crond root 414 1 9532 236 hrtimer_na 000dcf90 S crond
Und wir könnten jetzt enden, aber lassen Sie uns eine Minute warten und sehen, ob unsere Akte eine Aufzeichnung enthält ... Nun, wie Sie bereits verstanden haben, hat wieder nichts funktioniert. Tatsache ist, dass dieser Prozess von einem Superuser ausgeführt werden muss. Ändern Sie das Skript in der
99cronstart- Datei:
echo "#!/system/bin/sh /su/bin/su -c crond -b -L /sdcard/error.log -c /data/crontab" > /system/etc/init.d/99cronstart reboot
UPD : Vielleicht hat
su in Ihrem Fall einen anderen Pfad. Verwenden Sie dann den Befehl
su und ersetzen Sie den Pfad durch Ihren.
Jetzt unterstützt unser Android-Gerät Cron-Aufgaben und enthält möglicherweise Shell-Skripte für den automatischen Start!
Und schließlich das Skript, mit dem unsere Anwendung ausgeführt wird, wenn es sich nicht in den Prozessen befindet, und Informationen darüber zu speichern, was vor dem Starten unserer Anwendung auf dem Hauptbildschirm angezeigt wurde:
proc=$(ps | grep "com.test.app") if [ "$proc" == "" ]; then dumpsys window | grep CurrentFocus > /sdcard/current_focus.dump sleep 1 am start -n com.test.app/com.test.app.activities.MainActivity fi