Arbeiten mit cron für Android und Hinzufügen eines Shell-Skripts zum automatischen Ausführen, wenn das Gerät gestartet wird



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


  1. Installieren Sie adb , um über die Shell mit einem USB- Kabel auf das Gerät zuzugreifen.
  2. 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.
  3. 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.
  4. 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.
  5. Wir installieren BusyBox (es ist zum Beispiel auch auf w3bsit3-dns.com), da es nur ein Cron-Programm enthält.

Manuelle Starteinstellung


  1. 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.
  2. Wechseln Sie mit dem Befehl su in den Root-Modus
  3. Wir überprüfen das Vorhandensein des Cron-Programms und sehen die Einstellungen mit dem Befehl crond -h

Ausführungsergebnis
crond: 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 wird
Wir 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):

Shell-Skript
 #!/system/bin/sh #Script to enable init.d by Ryuinferno @ XDA error_msg(){ echo "You do not need this mod..." sleep 1 echo "If you are reapplying, please delete these files if present:" echo "/system/bin/sysinit" sleep 1 echo "/system/etc/install-recovery.sh" sleep 1 echo "/system/etc/install-recovery-2.sh" sleep 1 echo "And run again..." sleep 1 echo "If init.d is still not working, read the FAQ part in my thread..." sleep 1 echo "Aborting..." mount -o remount,ro -t auto /system echo "" echo "Ryuinferno @ XDA" exit 1 } echo "Init.d Enabler by Ryuinferno @ XDA" echo "" sleep 1 id=`id`; id=`echo ${id#*=}`; id=`echo ${id%%\(*}`; id=`echo ${id%% *}` if [ "$id" != "0" ] && [ "$id" != "root" ]; then echo "Script NOT running as root!" sleep 1 echo "Superuser access not granted!" sleep 1 echo "Please type 'su' first before running this script..." exit 1 else echo "Hello Supaa User! :P" echo "" sleep 1 fi if [ ! "'which busybox'" ]; then echo "busybox NOT INSTALLED!" sleep 1 echo "Please install busybox first!" exit 1 else echo "busybox found!" sleep 1 fi bbb=0 if [ ! "`which grep`" ]; then bbb=1 echo "grep applet NOT FOUND!" sleep 1 else echo "Awesome! grep found! :D" sleep 1 fi if [ ! "`which run-parts`" ]; then bbb=1 echo "run-parts applet NOT FOUND!" sleep 1 else echo "Good! run-parts found! :)" echo "" sleep 1 fi if [ $bbb -eq 1 ] ; then echo "" echo "Required applets are NOT FOUND!" echo "" sleep 1 echo "Please reinstall busybox!" exit 1 fi echo "Great! Let's proceed..." echo "" sleep 1 echo "Press enter to continue..." read enterKey clear sleep 1 echo "Mounting system as rewritable..." mount -o remount,rw -t auto /system sleep 1 echo "Removing old sysinit file" rm /system/bin/sysinit sleep 1 echo "" echo "Checking for the presence of sysinit in /system/bin..." sleep 1 if [ -e /system/bin/sysinit ]; then echo "sysinit found..." if [ -z "`cat /system/bin/sysinit | grep "init.d"`" ]; then echo "Adding lines to sysinit..." echo "" >> /system/bin/sysinit echo "# init.d support" >> /system/bin/sysinit echo "" >> /system/bin/sysinit echo "export PATH=/sbin:/system/sbin:/system/bin:/system/xbin" >> /system/bin/sysinit echo "run-parts /system/etc/init.d" >> /system/bin/sysinit echo "" >> /system/bin/sysinit else echo "" echo "Your sysinit should already be running the scripts in init.d folder at boot..." error_msg fi else echo "sysinit not found, creating file..." echo "#!/system/bin/sh" > /system/bin/sysinit echo "# init.d support" >> /system/bin/sysinit echo "" >> /system/bin/sysinit echo "export PATH=/sbin:/system/sbin:/system/bin:/system/xbin" >> /system/bin/sysinit echo "run-parts /system/etc/init.d" >> /system/bin/sysinit echo "" >> /system/bin/sysinit fi sleep 1 echo "Setting correct permissions and ownership for sysinit..." chmod 755 /system/bin/sysinit chown 0.2000 /system/bin/sysinit sleep 1 echo "" echo "Checking for the presence of install-recovery.sh..." sleep 1 if [ -f /system/etc/install-recovery.sh ] && [ -z "`cat /system/etc/install-recovery.sh | grep "daemon"`" ]; then if [ ! -z "`cat /system/etc/install-recovery.sh | grep "init.d"`" ];then echo "Your install-recovery.sh seems to be already modified for init.d..." error_msg fi echo "install-recovery.sh found, renaming it as install-recovery-2.sh..." mv /system/etc/install-recovery.sh /system/etc/install-recovery-2.sh echo "Recreating install-recovery.sh..." echo "#!/system/bin/sh" > /system/etc/install-recovery.sh echo "# init.d support" >> /system/etc/install-recovery.sh echo "" >> /system/etc/install-recovery.sh echo "/system/bin/sysinit" >> /system/etc/install-recovery.sh echo "" >> /system/etc/install-recovery.sh echo "# excecuting extra commands" >> /system/etc/install-recovery.sh echo "/system/etc/install-recovery-2.sh" >> /system/etc/install-recovery.sh echo "" >> /system/etc/install-recovery.sh elif [ -f /system/etc/install-recovery.sh ] && [ ! -z "`cat /system/etc/install-recovery.sh | grep "daemon"`" ]; then if [ -f /system/etc/install-recovery-2.sh ] && [ ! -z "`cat /system/etc/install-recovery-2.sh | grep "init.d"`" ];then echo "Your install-recovery-2.sh seems to be already modified for init.d..." error_msg fi echo "install-recovery.sh is used for superuser, using install-recovery-2.sh instead..." if [ -f /system/etc/install-recovery-2.sh ]; then echo "" >> /system/etc/install-recovery-2.sh echo "# init.d support" >> /system/etc/install-recovery-2.sh echo "/system/bin/sysinit" >> /system/etc/install-recovery-2.sh echo "" >> /system/etc/install-recovery-2.sh else echo "#!/system/bin/sh" > /system/etc/install-recovery-2.sh echo "# init.d support" >> /system/etc/install-recovery-2.sh echo "" >> /system/etc/install-recovery-2.sh echo "/system/bin/sysinit" >> /system/etc/install-recovery-2.sh echo "" >> /system/etc/install-recovery-2.sh fi if [ -z "`cat /system/etc/install-recovery.sh | grep "install-recovery-2.sh"`" ]; then echo "" >> /system/etc/install-recovery.sh echo "# extra commands" >> /system/etc/install-recovery.sh echo "/system/etc/install-recovery-2.sh" >> /system/etc/install-recovery.sh echo "" >> /system/etc/install-recovery.sh fi else echo "install-recovery.sh not found, creating it..." echo "#!/system/bin/sh" > /system/etc/install-recovery.sh echo "# init.d support" >> /system/etc/install-recovery.sh echo "" >> /system/etc/install-recovery.sh echo "/system/bin/sysinit" >> /system/etc/install-recovery.sh echo "" >> /system/etc/install-recovery.sh fi sleep 1 echo "Setting the correct permissions and ownership for install-recovery.sh..." echo "Also for install-recovery-2.sh if it exists..." chmod 755 /system/etc/install-recovery.sh chown 0.0 /system/etc/install-recovery.sh if [ -f /system/etc/install-recovery-2.sh ]; then chmod 755 /system/etc/install-recovery-2.sh chown 0.0 /system/etc/install-recovery-2.sh fi sleep 1 echo "" echo "Checking for the presence of the init.d folder..." sleep 1 if [ -d /system/etc/init.d ]; then echo "init.d folder found..." else echo "init.d folder not found, creating the folder..." mkdir /system/etc/init.d fi sleep 1 echo "" echo "Creating basic init.d scripts..." echo "#!/system/bin/sh" > /system/etc/init.d/08setperm echo "#set correct permissions to /system/etc/init.d folder" >> /system/etc/init.d/08setperm echo "" >> /system/etc/init.d/08setperm echo "mount -o remount,rw -t auto /system" >> /system/etc/init.d/08setperm echo "chmod -R 777 /system/etc/init.d" >> /system/etc/init.d/08setperm echo "mount -o remount,ro -t auto /system" >> /system/etc/init.d/08setperm echo "" >> /system/etc/init.d/08setperm echo "#!/system/bin/sh" > /system/etc/init.d/00test echo "#init.d test" >> /system/etc/init.d/00test echo "" >> /system/etc/init.d/00test echo "if [ -f /data/Test.log ]; then" >> /system/etc/init.d/00test echo "rm /data/Test.log" >> /system/etc/init.d/00test echo "fi" >> /system/etc/init.d/00test echo "" >> /system/etc/init.d/00test echo 'echo "Init.d is working !!!" >> /data/Test.log' >> /system/etc/init.d/00test echo 'echo "excecuted on $(date +"%d-%m-%Y %r" )" >> /data/Test.log' >> /system/etc/init.d/00test echo "" >> /system/etc/init.d/00test sleep 1 echo "Creating permissive SELinux script..." sleep 1 echo "#!/system/bin/sh" >> /system/etc/init.d/01permissive echo "#Init.d Permissive SELinux" >> /system/etc/init.d/01permissive echo "" >> /system/etc/init.d/01permissive echo "busybox mount -o remount,rw -t auto /system" >> /system/etc/init.d/01permissive echo "" >> /system/etc/init.d/01permissive echo "setenforce 0" >> /system/etc/init.d/01permissive echo "SELINUX=permissive" >> /system/etc/init.d/01permissive echo "" >> /system/etc/init.d/01permissive sleep 1 echo "Setting correct permissions and ownership for init.d folder and scipts..." chmod 777 /system/etc/init.d chmod 777 /system/etc/init.d/08setperm chmod 777 /system/etc/init.d/00test chmod 777 /system/etc/init.d/01permissive chown 0.0 /system/etc/init.d chown 0.0 /system/etc/init.d/08setperm chown 0.0 /system/etc/init.d/00test chown 0.0 /system/etc/init.d/01permissive sleep 1 echo "" echo "Mounting system as read-only..." mount -o remount,ro -t auto /system sleep 1 echo "" echo "Done!!!" sleep 1 echo "Please reboot at least twice before checking /data..." sleep 1 echo "If init.d is working, you will see a Test.log in /data..." sleep 1 echo "" echo "Enjoy!!! =)" echo "Ryuinferno @ XDA 2013" exit 


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 # -rwxr-xr-x root root u:object_r:system_file:s0 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 

Source: https://habr.com/ru/post/de468337/


All Articles