יום ראשון, 9 בנובמבר 2014

אנדרואיד - ההתחלה.


אחד הכלים החשובים שמפתח אנדרואיד יכול לרכוש לעצמו היא היכולת לקרוא קוד פתוח, יכולת אשר תחסוך ימים של תסכולים בחיפושי באגים ותפתח את הדרך לקוד ברור, נקי, יעיל ונכון. ישנן כתבות רבות העוסקות בצורך בקוד ספרותי ובחובה לדעת לקרוא קוד, בסדרת הכתבות הבאה נחקור לעומק ונכיר את הקוד מאחורי אנדרואיד - מהקריאה הראשונה ל-public static void main ועד להרצת אנימציות והצגת אובייקטים על המסך.

התמונה לקוחה מכתבה של Coding Horror המסבירה את הצורך בקריאת קוד

אנדרואיד - ההתחלה.


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

איך רובוטים מתחילים את חייהם?

במהלך הפעלת מכשיר האנדרואיד, יקרא תהליך ה-init, אשר בתורו יקרא ל-init‪.‬rc (אחראי לאיתחולים גנרים באנדרואיד) ו-init.<machine_name>.rc (אחראי לאיתחולים ספציפים לפי סוג המכשיר), כאשר machine‪_‬name היא מילת קוד המתארת את דגם המכשיר, למשל בנקסוס 5 הקובץ יקרא init.hammerhead.rc, באמולטור ניתן למצוא את הקובץ בשם init‪.‬goldfish‪.‬rc.

במבט על קובץ ה-init.rc של המכשיר שלי‫,‬ אני מוצא את השורה הבאה
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

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

שלא כמו מערכות לינוקס אחרות, באנדרואיד אין Swap space, הזכרון אשר זמין למכשיר הוא הזכרון המובנה בלבד וכאן הזיגוטה תעזור לנו לנהל את הזכרון בצורה אפקטיבית.

הזיגוטה תפעיל תהליך חדש הנקרא ZygoteInit - הוא ה-VM, התהליך ידאג לעלות מחלקות Java בסיסיות לזכרון - כאלה הדרושות לכל אפליקציה ולאחר מכן ימתין לשעת כושר. בעת הפעלת אפליקציה חדשה, הזיגוטה תשתעתק (Fork) וכל המחלקות אשר הזיגוטה העלתה לזכרון תהיינה זמינות לאפליקציה החדשה, לזיגוטה ולכל האפליקציות העתידיות לפעול בהעתק אחד בלבד, בזכרון אשר מוגן מכתיבה. ה-Thread בתהליך החדש אשר נוצר יפסיק לחכות ויקרא ל-ActivityThread.main - נקודת הפתיחה של כל אפליקציית אנדרואיד, זו הנקודה הנכונה להתחיל להכיר את הקוד מאחורי ה-SDK.

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

החידה לקוחה מתוך הבלוג של Square - The Corner
מה ירשם ב-Log של האפליקציה הבאה, בהנחה שהפעלנו אותה במצב Portrait ?



public class MainActivity extends Activity {

    private static final String TAG = "my_tag";
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            Handler handler = new Handler();
            handler.post(new Runnable() {
                public void run() {
                    Log.d(TAG, "Posted before requesting orientation change");
                }
            });
            Log.d(TAG, "Requesting orientation change");
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            handler.post(new Runnable() {
                public void run() {
                    Log.d(TAG, "Posted after requesting orientation change");
                }
            });
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}




לקריאה נוספת:

תגובה 1:

  1. אהבתי את ההקבלה לביולוגיה, מעשיר את שני התחומים

    השבמחק