היסטוריה חדשה

זה לא חוקי אנדרואיד האק יעשה אותך הורה טוב יותר

על ידי Sergei Shaikin14m2025/04/16
Read on Terminal Reader

יותר מדי זמן; לקרוא

פרדוקס השינה הדיגיטלית הוא בעיה שאף אחד לא מדבר עליה.מיליוני אנשים נרדמים עכשיו לווידאו של YouTube, פודקאסטים או אפליקציות סטרימינג.
featured image - זה לא חוקי אנדרואיד האק יעשה אותך הורה טוב יותר
Sergei Shaikin HackerNoon profile picture

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

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

הבעיה שאף אחד לא מדבר עליה

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


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


אפליקציות חינם בחנות Google Play, כגון Volume Limiter, Volume Control היו כישלון: הם התרסקו, לא היו הגדרות, או היו מפריעים מדי. ייתכן אפליקציות מסחריות היו טובות יותר, אבל ניסיתי את זה מאז הם העלו כסף, לעתים קרובות קצת.

The Hack (Totally Illegal...ish)

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


כן, מבחינה טכנית, הוא משתמש ב- ADB (אנדרואיד Debug Bridge) על-ידי Wi-Fi, שהוא כלי מפתחים שאינו מיועד להורים לפני השינה.

הגדרת סביבת הפיתוח שלך

הגדרת סביבת פיתוח וחיבור היא קריטית לפני צלילה לתוך הקוד.This will ensure you have all the necessary tools and libraries, streamlining the development process.


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

הנה חלוקה מפורטת יותר:

  1. Download and Extract Platform Tools:

    1. Go to the official Android Developers website:

      1. Navigate to Android SDK Platform-Tools.
    2. Download the SDK Platform Tools:

      1. Download the latest version for your operating system (Windows, macOS, or Linux).
      2. Extract the ZIP file: Extract the downloaded ZIP file to a location of your choice (e.g., C:\adb on Windows).
    C:\adb
    
  2. Add Platform Tools to your System's PATH:

    1. Windows:

      1. Open the "Environment Variables" settings (search for "Environment Variables" in the Start menu).
      2. Click "Edit the system environment variables".
      3. Click "Environment Variables".
      4. In the "System variables" section, find the "Path" variable, select it, and click "Edit".
      5. Click "New" and add the path to the platform-tools directory (e.g., C:\adb).
    2. macOS/Linux:

      1. Open your terminal.

      2. Add the path to the platform-tools directory to your shell's configuration file (e.g., ~/.bashrc, ~/.zshrc).

        For example: export PATH=$PATH:/path/to/platform-tools.

        export PATH=$PATH:/usr/local/bin/adb
        echo $PATH | tr ":" "\n"
        

        In my case, it’ll be something like this:

        Export PATH (first command) and check that PATH has been added (second command)

      3. Restart your terminal or source the configuration file (e.g., source ~/.bashrc).

        From now on, we will work only in the command line. In my case, it will be the terminal.


  3. Verify ADB Installation:

    1. Open a command line interface (CLI):

      1. Using the Windows Search Bar (Windows OS):
        • Click the Start button or the magnifying glass icon in the taskbar.
        • Type "cmd" (without quotes) in the search bar.
        • Click on the "Command Prompt" result.
        • To run as administrator, right-click on "Command Prompt" in the search results and select "Run as administrator".
      2. Using Spotlight Search (macOS):
        • Click the magnifying glass icon in the menu bar (or press Cmd+Space).
        • Type "Terminal" and double-click it to open.
    2. Type adb and press Enter.

      adb
      
    3. If adb is installed correctly, you should see the ADB help message.

      Help has a lot of lines (I show a couple of them)


  4. Enable USB Debugging on your Android Device:

    1. Go to "Settings" on your Android device.
    2. Scroll down and select "About Phone".
    3. Find "Build Number" and tap it 7 or more times to unlock Developer Options.
    4. Go back to the main "Settings" page, and now you'll see "Developer Options".
    5. Select "Developer Options".
    6. Scroll down to "USB Debugging" and toggle it on.

כעת נוכל לעבוד רק בשורת הפקודה.במקרה שלי, זה יהיה הטרמינל.

הגדרת החיבור שלך

השלב הבא יהיה חיבור המכשיר הנייד שלך למחשב שלך.


  • חיבור אלחוטי;
  • חיבור אלחוטי.

חיבור חשמלי:

אתה צריך לחבר את המכשיר הנייד שלך למחשב באמצעות הכבל (USB A/USB C או USB A/micro USB, וכו ').


לאחר מכן, פתחו את הטרמינל והזינו את הפקודה הבאה:

adb devices

You see my device, which is connected by wire to my personal computer. In your case, this "RF8T60M9SBF" number will be a completely different number.


עד כה, אנחנו מוכנים להפעיל את מצב TCP/IP עם הפקודה הבאה:

adb tcpip 5555


אם אנחנו כבר בטרמינל, אז אנחנו יכולים לבדוק את כתובת ה- IP של המכשיר הנייד ברשת ה- Wi-Fi שלנו מבלי להסתכל על המכשיר הנייד.

adb -d shell "ip route | awk '/wlan0/ {print \$9}'"

My IP address is 10.0.0.108. In your case it will be another one.

חיבור אלחוטי:

כעת יש לך את כתובת ה-IP של המכשיר שלך, הגיע הזמן להתחבר באופן אלחוטי. אין יותר צורך בחיבור חיצוני. לאחר שתפעיל adb tcpip 5555, תוכל לפתוח בבטחה את כבל ה-USB.


בואו לוודא שהמחשב והסמארטפון שלכם נמצאים באותו רשת Wi-Fi.

adb connect <DEVICE_IP>:5555


לדוגמה, אם כתובת ה-IP של המכשיר שלך היא 10.0.0.108, תוכל להזין:


adb connect 10.0.0.108:5555


אם הכל הולך כמו שצריך, תראה הודעה כמו:

Here we are.

בואו נדבר על הבעיה שוב

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

ארכיטקטורה במבט

הנה תרשים מהיר שמראה כיצד הכל מחובר:


מחשב שלך (מפעיל את התסריט Python) מתחבר למכשיר האנדרואיד באמצעות ADB דרך Wi-Fi, מפקח על נפח באופן קבוע ומפחית אותו במידת הצורך.

מחשב שלך (מפעיל את התסריט Python) מתחבר למכשיר Android באמצעות ADB דרך Wi-Fi, מפקח על הקול מעת לעת ומפחית אותו במידת הצורך.

This minimalistic setup allows for seamless automation:Python Script runs on your laptop or mini PC.


הסרט שעושה את הקסם

הבסיס של הפתרון הוא סקריפט Python שמתקשר עם המכשיר Android שלך באמצעות ADB דרך Wi-Fi.


כל 30 שניות, הוא בודק את נפח הזרם המוסיקלי הנוכחי.אם נפח הוא מעל 5 (אנדרואיד בדרך כלל משתמש בסולם של 15 נקודות), התסריט מוריד אותו בעדינות - צעד אחד בכל פעם, עם הפסקות קצרות.


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

The Script's Evolution: From Tiny Hack to Reliable Tool

כשהתחלתי לכתוב את התסריט זה היה בקושי כמה שורות ארוכות.


זה נראה קצת כמו זה:

import subprocess
import time
import re

def get_stream_volume():
    cmd = "adb shell dumpsys audio | awk '/- STREAM_MUSIC:/{flag=1; count=0} flag && count<=5 {print; count++} /^$/{flag=0}'"
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    match = re.search(r'streamVolume:(\d+)', result.stdout)
    return int(match.group(1)) if match else None

def set_volume(level):
    cmd = f"adb shell cmd media_session volume --stream 3 --set {level}"
    subprocess.run(cmd, shell=True)
    print(f"Volume set to {level}")

def monitor_volume():
    while True:
        volume = get_stream_volume()
        if volume is None:
            print("Failed to get volume level. Retrying...")
            time.sleep(5)
            continue

        print(f"Current volume: {volume}")
        
        if volume == 15:
            for vol in range(14, 4, -1):
                set_volume(vol)
                time.sleep(30)
        
        while get_stream_volume() == 5:
            print("Volume is at 5, monitoring every 60 seconds...")
            time.sleep(60)

if __name__ == "__main__":
    monitor_volume()
os.system("adb shell dumpsys audio | grep -i 'streamVolume'")


מה קורה אם המכשיר מתנתק באמצע הלילה? מה אם ADB זורק זמן? מה אם הטלפון אינו מצויד? מה אם התסריט מתרסק בזמן שכולם ישנים?



אז התוכנית התפתחה.

  • לפעמים, המכשיר לא היה מחובר. אז הוספתי adb connect ip:port.
  • לפעמים ADB התרסק באמצע הלילה. הוספתי טיפול חריג ושובות.
  • Logging? כן, הוספתי את זה גם.
  • File logging and console logging? כמובן.
  • Volume changes mid-sleep? Now, the script tracks that too - and only intervenes when needed.
  • Monitoring frequency? Different intervals for high vs. low volume levels.


    מה שהתחיל בכמה שורות של תסריט הפך לכלב שומר קטן שמשגיח על הטלפון שלך - אז אתה לא צריך.

    import subprocess
    import time
    import re
    import logging
    from datetime import datetime
    
    logging.basicConfig(
        filename='volume_control.log',
        level=logging.INFO,
        format='[%(asctime)s] %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    ADB_DEVICE = "10.0.0.108:5555"
    
    def log(message):
        timestamp = get_timestamp()
        print(f'[{timestamp}] {message}')
        logging.info(message)
    
    def get_timestamp():
        return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    
    def connect_adb():
        subprocess.run(f"adb connect {ADB_DEVICE}", shell=True)
        log(f"Reconnected to ADB at {ADB_DEVICE}")
    
    def get_stream_volume():
        cmd = "adb shell dumpsys audio | awk '/- STREAM_MUSIC:/{flag=1; count=0} flag && count<=5 {print; count++} /^$/{flag=0}'"
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
        match = re.search(r'streamVolume:(\d+)', result.stdout)
        return int(match.group(1)) if match else None
    
    def safe_get_stream_volume(retries=3, delay=5):
        for attempt in range(retries):
            volume = get_stream_volume()
            if volume is not None:
                return volume
            log(f"Attempt {attempt + 1}: Failed to get volume. Retrying after reconnect...")
            connect_adb()
            time.sleep(delay)
        log("All attempts failed. Giving up temporarily.")
        return None
    
    def set_volume(level):
        cmd = f"adb shell cmd media_session volume --stream 3 --set {level}"
        subprocess.run(cmd, shell=True)
        log(f"Volume set to {level}, waiting 30 seconds...")
    
    def monitor_volume():
        while True:
            volume = safe_get_stream_volume()
            if volume is None:
                log("Initial volume read failed. Retrying in 30 seconds...")
                time.sleep(30)
                continue
    
            log(f"Current volume: {volume}")
    
            while volume > 5:
                set_volume(volume - 1)
                time.sleep(30)
                volume = safe_get_stream_volume()
                if volume is None:
                    log("Failed to read volume during decreasing.")
                    break 
    
            while True:
                volume = safe_get_stream_volume()
                if volume is None:
                    log("Failed to read volume during monitoring.")
                    time.sleep(30)
                    break
                if volume > 5:
                    log(f"Volume increased to {volume}, restarting decreasing")
                    break
                log(f"Volume is at {volume}, monitoring every 60 seconds...")
                time.sleep(60)
    
    if __name__ == "__main__":
        try:
            monitor_volume()
        except KeyboardInterrupt:
            log("Script stopped by user (Ctrl+C)")
        except Exception as e:
            log(f"Unexpected error: {e}")
        finally:
            log("Script exited.")
    


    היום, התסריט הוא ברמה הייצור - וקורס פתוח. אבל ודא לשנות את השורה הזו ADB_DEVICE = "10.0.0.108:5555" בתסריט עם כתובת ה-IP שלך מ "הגדרת החיבור שלך".

    פעולת התסריט: שתי אפשרויות קלות כמו גם Cron

    יש לך שתי דרכים עיקריות להפעיל את התסריט:

    1. ישירות עם Python


    אם יש לך Python 3 מותקן, אתה יכול פשוט להפעיל:

    python3 reduce_volume.py
    


    זה יתחיל מיד ויעשה את עבודתו בשקט ברקע.

    1. כמנהל עצמאי


    אתה רוצה לשתף אותו עם מישהו שאין לו Python מותקן?


    אתה יכול להמיר את התסריט לתוך .app עצמאי עבור macOS או .exe עבור Windows, באמצעות PyInstaller:

    pyinstaller --onefile reduce_volume.py
    

    זה יצר אפליקציה ניידת שיכולה להתחיל בלחיצה כפולה – אין צורך ב-Python.


    1. אפילו תזמן את זה עם משימה cron או לוח זמנים של משימות אם אתה אוהב.

    One More Thing: גבולות ADB מרחוק

    חשוב לציין כי ADB על Wi-Fi יכול להיות חלש.


    הקשר הרחוק שלך ייפסק אם:

    • הטלפון מתחיל מחדש.
    • רשת ה- Wi-Fi משתנה.
    • מצב developer או USB Debugging מופעל.
    • התקן נמשך זמן רב מדי ללא פעילות ADB (מערכות מסוימות פותחות באופן אוטומטי חיבורים לא פעילים).
    • ואחרים רבים ...


    אז אם התסריט מפסיק לעבוד, פשוט לחזור על השלבים מ "הגדרת החיבור שלך":

    1. Connect the mobile device with a wire to your personal computer.

    2. Run the command adb tcpip 5555

      adb tcpip 5555
      
    3. And run adb connect <DEVICE_IP>:5555

    adb connect 10.0.0.108:5555
    

    ואתה תהיה בחזרה בעסקים.

    מחשבות אחרונות

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


    זה יכול להיות תסריט קטן, אבל עבור המשפחה שלי ואני, זה היה שינוי חיים. לא יותר 2 AM YouTube התעוררות. לא יותר בוקר כועס. רק לילות שלווים קצת אוטומציה של ההורים.


    • האם זה קצת פגיעה? בטוח.
    • האם זה עובד אמין? לחלוטין.
    • האם זה חוקי? טכנית כן, אבל זה פועל באזור אפור (הגישה ADB ושליטה אוטומטית אינם נתמכים רשמית על ידי Google למשתמשים סופיים).
    • אבל אתה יודע מה? כל עוד זה עוזר להורים עייפים (או אפילו לעצמם) לישון טוב יותר - זה שווה את זה.
    • זה עדין.
    • זה בלתי נראה.
    • And it works.


    תן לי לדעת אם אתה רוצה את קוד המקור, התקנה בלחיצה אחת, או גרסה משופרת.



    And hey — sleep well. You’ve earned it.

    P.S. פתרון זה ניתן לשפר ולהרחיב - למשל, להגדיר לוח זמנים, להתאים פרופילים שונים, לעקוב אחר פעילות המכשיר, וכו 'אבל גם בצורתו הבסיסית, זה כבר פותר את הבעיה העיקרית: זה עוזר לך להירדם - וללכת לישון בשלום.

    P.S. פתרון זה ניתן לשפר ולהרחיב - לדוגמה, להגדיר לוח זמנים, להתאים פרופילים שונים, לעקוב אחר פעילות המכשיר, וכו 'אבל גם בצורתו הבסיסית, זה כבר פותר את הבעיה העיקרית: זה עוזר לך להירדם - וללכת לישון בשלום.


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks