
نظرًا لحقيقة أن الأجهزة المحمولة تتمتع بوظائف طويلة ، يمكن نقل مهام التشغيل الآلي إليها بسهولة. وكذلك ، بقدر الإمكان ، يعد cron مفيدًا لتنفيذها. ولكن إذا استغرق cron بعض الوقت في أنظمة Linux "العادية" ، فإن جهاز Android يتطلب عملًا أكثر تعقيدًا لتكوينه.
إذا كنت مهتمًا بموضوع الأتمتة وتريد أن يتم تشغيل البرامج النصية الخاصة بالصدفة فور بدء تشغيل الجهاز ، وحتى يمكن تشغيلها بواسطة المؤقت - مرحبًا بك في القطة!
مقدمة
أنا منخرط في أتمتة الأجهزة المحمولة لنظام التشغيل Android. وأثناء تنفيذ البرامج النصية التلقائية ، تحدث العديد من المواقف غير المتوقعة ، حتى لو تم استخدام نفس الأجهزة للاختبار.
المشاكل الأكثر شعبية:
0. البرنامج النصي للتشغيل الآلي لا يفعل ما تريد.
1. يتم تنزيل تطبيق الهاتف المحمول تلقائيًا
2. إعادة تشغيل الهاتف التلقائي
3. لا يبدأ تطبيق الهاتف المحمول تلقائيًا بعد إعادة التشغيل
4. وحدة Wi-Fi تنطفئ عشوائيا ، لا تجد الشبكة ، لا تتصل بالشبكة
5. شبكة المحمول اختفت فجأة
6. ذهب الهاتف إلى وضع السكون
7. انخفض الخادم الوكيل أو قام الخادم نفسه أو الخادم بإرجاع استجابة غريبة
لهذا السبب ، يجب عليك مراقبة الجهاز باستمرار والتقاط هذه المواقف غير المتوقعة.

وهكذا ، توصلت إلى استنتاج مفاده أن cron باستخدام البرامج النصية "الصحيحة" سيتيح لك تتبع فشل البرامج واستعادة البرنامج النصي للتشغيل الآلي أو تشغيله مرة أخرى. ولكن كما اتضح فيما بعد ، على الرغم من أن Android يحتوي على نواة Linux ، إلا أنه توجد فروق دقيقة خاصة كان علي التعامل معها. لذلك دعونا نبدأ في الإعداد!
الإعداد كرون
تخصيص البيئة
- قم بتثبيت adb للوصول إلى الجهاز من خلال shell باستخدام سلك USB.
- نفتح قسم للمطورين . للقيام بذلك ، انتقل إلى قسم " حول الهاتف" وقم ببضع نقرات على رقم البنية أو شيء مشابه.
- نذهب إلى قسم للمطورين وتشغيله. نقوم بتوصيل الجهاز بالكمبيوتر ونسمح بالوصول على هذا الكمبيوتر بهذا الجهاز.
- إضافة الجذر لجهازك. الخيارات الأكثر شيوعًا هي SuperSu و Magisk و Kingroot . انتقل إلى w3bsit3-dns.com وابحث عن خيار الجذر لجهازك. لسوء الحظ ، لا يوجد جذر عالمي.
- نقوم بتثبيت BusyBox (وهو أيضًا على w3bsit3-dns.com ، على سبيل المثال) ، لأنه يحتوي فقط على برنامج cron.
دليل بدء الإعداد
- نحن نتصل بالهاتف باستخدام قذيفة adb (إذا لم يتم تسجيل بنك التنمية الآسيوي في متغير البيئة الخاص بك ، ثم أضف المسار الكامل.
- انتقل إلى وضع الجذر باستخدام الأمر su
- نتحقق من وجود برنامج cron ونرى الإعدادات باستخدام الأمر crond -h
نتيجة التنفيذ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
كما ترى من السطر الأخير ، يجب تخزين التعليمات الافتراضية في الدليل
/ var / spool / cron / crontabs ، الذي لم يتم إنشاؤه تلقائيًا وإذا قمنا بتشغيل الأمر
crond -b
ثم تحقق مما إذا كانت العملية قد بدأت
ps | grep crond
، ثم قد لا يكون هناك ، ل لم يستطع الحصول على أي تعليمات. لذلك دعونا ننفذ الأمر
crond -b -fd0
ونرى ما هو السبب. على الأرجح سيكون لديك خطأ مماثل:
crond: can't change directory to '/var/spool/cron/crontabs': No such file or directory
. في هذه الحالة ، هذا طبيعي ، لأنه في المستقبل ، سنشير إلى المسار إلى الملف القابل للتنفيذ crontab.
4. قم بإنشاء ملف crontab بسيط:
mkdir /data/crontab echo "*/1 * * * * echo 'text' >> /sdcard/test.txt" > /data/crontab/root
الآن لدينا مهمة ستضيف كل دقيقة
نص الكلمة إلى الملف /
sdcard/test.txtنطلق:
crond -b -fd0 -c /data/crontab
والحصول على السجل التالي:
crond: crond (busybox 1.29.2-Stericson) started, log level 0 crond: ignoring file 'root' (no such user) ...
بالطبع ، الأمر يثير الدهشة بعض الشيء ، لأنه إذا قمنا بتنفيذ
أمر whoami ، فسوف يعود إلى
الجذر نتيجة لذلك.
5. أضف مستخدم الجذر ، حيث يسأل crond:
mount -o remount,rw /system; echo "root:x:0:0::/system/etc/crontabs:/system/bin/sh" >> /system/etc/passwd; mount -o remount,ro /system;
نظرًا لعدم وجود هذا الملف ، أدركت أنه في نظام Android لا يشارك على الإطلاق. إذا كنت متأكدًا من المكان الذي ستخزن فيه ملفات crontab ، فيمكنك استبدال الخط
/ النظام / etc / crontabs بالذي تحتاجه. قم بتشغيل الأمر مرة أخرى
crond -b -fd0 -c /data/crontab
ونحصل على ما يلي:
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
على الرغم من أنه وفقًا للسجل ، تم تسجيل المهمة في crond ، ولكن في حالتي ، لم يتم إنشاء الملف. يمكن حل المشكلة ببساطة شديدة:
mkdir -p /system/etc/crontabs
حسنًا ، يريد أن يكون هناك دليل ، من نحن لنمنعه! نبدأ من جديد ونرى:
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
اختفت الأخطاء
وشرط الخط
: ظهر الطفل قيد التشغيل / system / bin / sh . أخيرًا ، تم إنهاء cron بنجاح ، ويمكنك الانتقال إلى الجزء الثاني!
قذيفة التلقائي تنزيل البرنامج النصي
يحتوي نظام Linux على دليل
init.d مسؤول عن التشغيل التلقائي فور بدء تشغيل النظام ، لذلك دعونا نحاول بهذه الطريقة!
1. تحقق من وجود هذا الدليل على جهازك (هذا هو
/etc/init.d أو
/system/etc/init.d - هذا هو نفس القسم المثبت وما إلى ذلك). في حالتي ، الأمر ليس كذلك. حسنًا ، قم بإنشاء:
mount -o remount,rw /system mkdir /system/etc/init.d chmod 0755 /system/etc/init.d mount -o remount,ro /system
أضف الآن نصًا بسيطًا هناك ، على سبيل المثال:
echo "echo 'Init.d is working !!!' >> /sdcard/init_test.log" > /system/etc/init.d/90my_script chmod 777 /system/etc/init.d/90my_script
نقوم بإعادة تشغيل الجهاز ومعرفة ما إذا كانت المعجزة قد حدثت ... لسوء الحظ ، لم يظهر ملفي.
نقوم بفحص النظام بشكل أكبر والبحث عن بعض ملفات init التي يمكنها تشغيل البرامج النصية بعد الإطلاق. كان لدي ملف في
/init.rc على جهازي. حسنًا ، دعنا نحاول تغييره وإعادة تشغيل الجهاز:
mount -o remount,rw / echo "echo 'Init.d is working !!!' >> /sdcard/init_test.log" >> /init.rc mount -o remount,ro / reboot
ولكن لم يتم إنشاء الملف مرة أخرى. نذهب إلى إلقاء نظرة على الملف
/init.rc وقد اختفى سجلنا ولم يتغير الملف ، لأن تاريخ الإنشاء غريب جدًا (في حالتي ، 1 يناير ، 70 05:00:00).
ما زلنا نفهم ، واتضح أن هذا الملف مخزّن في
boot.img ، وفي كل مرة يخرج منه. ولتغيير وظيفة ملف
init.rc ، تحتاج إلى القيام بكل
هذا .
ولكن هناك طريقة أسهل للمساعدة في حل هذه المشكلة. لهذه الطريقة ، يمكننا استخدام البرنامج النصي shell التالي (قل بفضل Ryuinferno):
البدء في البرنامج النصي! في حالتي ، سيتم استدعاؤها init.sh.
1. قم بتنزيل الملف على بطاقة sdcard الخاصة بالجهاز المحمول:
adb push /tmp/init.sh /sdcard
2. انسخ إلى ذاكرة الجهاز المحمول وتعيين الحقوق اللازمة:
adb shell su cp /sdcard/init.sh /data/init.sh chmod 777 /data/init.sh
3. الترشح للتنفيذ:
/data/init.sh
وانتبه إلى السجل الذي يتم عرضه. هنا سجل بلدي:
تشغيل السجل 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
كما ترى من السجل ، لا توجد أية أخطاء ، لذلك لا تتردد في إعادة تشغيل الجهاز! ربما كان شخص ما يعمل بالفعل ويمكنك العثور على ملف
/data/Test.log ، لكنني لا
أمتلكه . تحقق من الدليل
/system/etc/init.d باستخدام
الأمر ls :
00test 01permissive 08setperm
كما ترون ، تم إنشاء المهام بنجاح. ربما لا يزال يتعين عليك تغيير
boot.img ، ولكن دعونا نتحقق من البداية ، حيث يوجد ملف
install-recovery.sh مع الأمر
find / -name "install-recovery.sh" ... /system/bin/install-recovery.sh /system/etc/install-recovery.sh ...
كما نرى ، لدينا ملفان موجودان في أماكن مختلفة. بحلول تاريخ الإنشاء ، يمكننا أن نلاحظ أن البرنامج النصي أنشأ الملف في الدليل
/system/etc/install-recovery.sh ، على الرغم من أنه ربما في بعض الحالات يجب أن
ينشئه في
/ system / إلخ. دعونا إعادة تسمية الملف إلى bin ونسخ الملف من etc:
mount -o remount,rw /system mv /install-recovery.sh /system/bin/install-recovery2.sh cp /install-recovery.sh /system/bin/
محدث : يرجى ملاحظة أن سياق الأمان لكلا الملفين يجب أن يتطابق. وإذا ضاعت فجأة أثناء النسخ (على الرغم من أنه لا ينبغي أن يكون ذلك من الناحية النظرية) ، فستحتاج إلى استعادته (على سبيل المثال ، من خلال الأداة المساعدة
chcon ). راجع معلومات الملف الكامل مع
ls -lZ :
ls -lZ /system/etc/install-recovery.sh
هنا
u: object_r: system_file: s0 هو سياقات الأمان.
ومرة أخرى ، أعدنا تشغيل الجهاز ... والآن ، أخيرًا ، النجاح الذي طال انتظاره!
لقد ظهر الملف / البيانات /
الاختبار.بمجرد عمل كل شيء ، انتقل إلى
/system/etc/init.d وقم بإنشاء نص برمجي. وفيه ، فقط قم بتشغيل مجموعتنا لتنفيذ:
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
بعد التنزيل ، تحقق مما إذا كانت crond قد بدأت:
ps | grep crond root 414 1 9532 236 hrtimer_na 000dcf90 S crond
يمكن أن ننتهي الآن ، ولكن دعنا ننتظر لحظة ونرى ما إذا كان هناك سجل في ملفنا ... حسنًا ، كما فهمت بالفعل ، مرة أخرى ، لم ينجح شيء. والحقيقة هي أن هذه العملية تحتاج إلى تشغيل من مستخدم سوبر. تغيير البرنامج النصي في ملف
99cronstart :
echo "#!/system/bin/sh /su/bin/su -c crond -b -L /sdcard/error.log -c /data/crontab" > /system/etc/init.d/99cronstart reboot
محدث : ربما في
سو حالتك سيكون لها مسار مختلف ، ثم استخدم الأمر
الذي سو واستبدل المسار بك.
الآن يدعم جهاز Android الخاص بنا مهام cron وقد يحتوي على برامج نصية للإنطلاق التلقائي!
وأخيرًا ، البرنامج النصي الذي سيشغل تطبيقنا ، إذا لم يكن في العمليات وحفظ المعلومات حول ما كان على الشاشة الرئيسية قبل بدء تشغيل التطبيق لدينا:
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