למי שלא מכיר, בעולם החרדי והדתי, שלא רוצים להשתמש בסמארטפונים, מקובלים מכשירי “נטו וויז” לצורך נסיעות. (הרבה פעמים הם כוללים גם קצת מעבר לוויז, למשל מוביט ופנגו\סלופארק) ביקשו ממני לפתח קושחה כזו עבור גמ”ח, וביצעתי את זה בצורה יצירתית.

המכשיר שעבדתי עליו בפרוייקט הזה הוא Qin 3 Ultra, מכשיר עם מעבד MTK ואנדרואיד 12. אבל לא נתעמק בו כי אני לא רוצה לרדת כאן לרזולוציות, רק להציג כמה דברים יצירתיים שעשיתי כאן.

אז, מה שגרם לי בפרוייקט הזה ללכת לכיוון של סקריפטים שרצים בהפעלת המכשיר היו 2 דרישות:

  1. שאפליקציית סלופארק תתאפס בכל הפעלה מחדש של המכשיר (כדי שלא תשמור פרטים בין משתמש למשתמש במכשירי הגמ”ח)
  2. אפליקציית MDM כדי שתהיה עוד שכבת הגנה - ואם כן, צריך שהיא תוגדר בהפעלה הראשונה של המכשיר. ורציתי לחסוך חיבור לADB או סריקת QR. שהכל יהיה משולב מראש בקושחה.

הארכתי יותר על המנגנון של סקריפטים בהפעלה של המכשיר במאמר שלי בDigital Whisper, כאן אני רק אסביר על שני הסקריפטים ששילבתי בפרוייקט הנוכחי:

סקריפט ראשון - פקודות שירוצו רק בהפעלה הראשונה:

#!/system/bin/sh
set -e

FIRST_BOOT_FLAG=/data/adb/.first_boot_done

# First-time setup: set NoPhone as default dialer, and grant DeviceOwner to MDM app
if [ ! -f "$FIRST_BOOT_FLAG" ]; then
  LOGFILE=/data/local/tmp/first_boot.log
  exec >>"$LOGFILE" 2>&1

  echo "---- First boot script started at $(date) ----"
  echo "---- Set up MDM at $(date) ----"
  dpm set-device-owner com.example.mdmfrp/.MyDeviceAdminReceiver
  echo "Set up default dialer..."
  cmd role add-role-holder android.app.role.DIALER org.fossify.phone.debug
  echo "Installing waze..."
  pm install /system/waze/waze.apk

  echo "Done."
  touch "$FIRST_BOOT_FLAG"
  exit 0
fi

הפקודה set -e עוצרת את הסקריפט בכל מקרה של שגיאה - וזה כדי שה”דגל” שאומר שהסקריפט בוצע בהצלחה לא ישמר אם יש איזו תקלה, ובהפעלה הבאה הסקריפט ירוץ שוב.

כפי שאפשר לראות, אם הדגל לא קיים - ירוצו כמה פקודות:

  1. הגדרת הרשאות הDeviceOwner לאפליקציית הMDM שכתבתי עבור הפרוייקט ונמצאת כבר בsystem.

  2. כדי שלא יהיו כלל שיחות, לא נכנסות ולא יוצאות, לא מספיק למחוק את אפליקציית הDialer מהמכשיר: קבלת שיחות עדיין אפשרית (אם כי אין איך לנתק אותם. הן פשוט יצלצלו…). לשם כך, כבר בפרוייקט נטו וויז קודם לקחתי את Fossify Phone וערכתי את קוד המקור ככה שידחה כל שיחה בצורה אוטומטית ולא יוצג כלל. הבעיה שבניגוד לאפליקציות אחרות כמו לאונצ’ר, כשמוחקים את הDialer המקורי ושמים אחר - הוא לא מוגדר אוטומטית כחייגן ברירת מחדל. בטוח אפשר לערוך את זה איפשהו במרחבי הקושחה, אבל פשוט הוספתי בסקריפט פקודה שתגדיר אותו כחייגן ברירת המחדל.

  3. בניגוד לשאר האפליקציות, כגון מוביט וסלופארק שהכנסתי מראש לקושחה, בוויז יש בעיה (לפחות כשבדקתי את זה בפעם הקודמת שעבדתי על נטו וויז, לפני קצת פחות משנה) - הוא לא עובד כשהוא נמצא במערכת. ולכן, הוספתי כאן פקודה שתתקין אותו בעליה הראשונה של המכשיר.

אחר כך פשוט נוצר קובץ הדגל שהסקריפט בודק בתחילתו - כדי שהסקריפט לא ירוץ בהפעלה הבאה של המכשיר. אם המכשיר יאופס, הקובץ הזה גם הוא ימחק, וככה בהפעלה הראשונה אחרי האיפוס הסקריפט ירוץ.

הסקריפט השני פשוט מריץ פקודת pm clear לאפליקציית סלו (סלופארק) כדי לאפס אותה. הוא רץ בכל הפעלה מחדש, לא רק אחרי איפוס.

זה היה פרוייקט קצת מסקרן, יותר מעניין מהרגיל.