פתרון בעיות נפוצות בביצועים

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

במדריכים שבקטע הזה מוסבר על ההתנהגות הבסיסית של פלטפורמת Android בכל סוג של בעיה, ומוסבר איך לאבחן, ליצור פרופיל ולתקן את הבעיות באמצעות כלים כמו Android Studio Profiler,‏ Perfetto,‏ Logcat ו-ApplicationExitInfo.

יציבות

  • שגיאות ANR: ניתוח ותיקון של שגיאות מסוג 'האפליקציה לא מגיבה' (ANR) שנגרמות בגלל שרשורי UI חסומים, קלט/פלט בשרשור הראשי, מחלוקת על נעילה או מקלטי שידור איטיים.
  • קריסות: קוראים את עקבות המחסנית, בודקים את הפלט של Logcat ומונעים חריגות לא מטופלות ואותות מקוריים.

רינדור והפעלה

  • רינדור איטי: זיהוי ותיקון של פריימים של ממשק משתמש שהושמטו או נתקעו (>16ms ו->700ms) בגלל פריסות יקרות, העברות של נתוני קישור או עצירות בשרשור הראשי.
  • סשנים איטיים (משחקים בלבד): מדידת קצב הפריימים באמצעות SurfaceFlinger ואופטימיזציה של קצב הפריימים במשחק באמצעות Android Frame Pacing‏ (Swappy),‏ Vulkan ו-Android Dynamic Performance Framework‏ (ADPF).
  • זמן ההפעלה של האפליקציה: הבנה של הפעלה קרה, חמה ומהירה, מדידה של הזמן עד להצגה הראשונית (TTID) והזמן עד להצגה מלאה (TTFD), ואופטימיזציה של עבודת ההפעלה.

ניהול זיכרון

  • תהליכי Low memory killers‏ (LMK): הסבר על האופן שבו תהליך ה-daemon של Low Memory Killer‏ (lmkd) ב-Android נותן עדיפות לתהליכים באמצעות oom_adj_score, ועל פרופיל הזיכרון שבשימוש ב-Android Studio, ב-Unity וב-Unreal Engine.
  • שימוש בזיכרון (RSS אנונימי + החלפה): מדידה והפחתה של הזיכרון שבשימוש של קבוצת התושבים האנונימית (RSS) ושל החלפת הזיכרון של האפליקציה במצבי חזית, שירות ורקע.
  • שימוש בזיכרון של מפת הסיביות (bitmap): אבחון הקצאות של מפות סיביות גדולות מדי או של מפות סיביות שנוצרו דליפות זיכרון, ושחרור מאגרי גרפיקה כשמרכיבי ממשק המשתמש עוברים לרקע.

סוללה ועבודה ברקע

  • חסימות ממושכות מדי של מצב השינה: אל תשתמשו בחסימות חלקיות של מצב השינה למשך תקופות ארוכות, והעבירו משימות ברקע אל WorkManager או אל JobScheduler.
  • חסימות חלקיות ממושכות של מצב שינה: צריך לוודא שכל חסימת מצב שינה חלקית שנרכשה משוחררת בצורה תקינה בכל נתיבי ההרצה והשגיאות.
  • יותר מדי אירועי wakeup: כדאי לצמצם את מספר משימות ברגע מדויק של השעון המעורר, ולבצע עבודות רקע מתוזמנות בקבוצות או לדחות אותן.
  • חיפוש יתר של נקודות Wi-Fi ברקע: כדאי לצמצם את התדירות של חיפוש נקודות Wi-Fi ברקע ולהשתמש בממשקי API פסיביים או כאלה שפועלים באצווה למיקום ולקישוריות.
  • שימוש יתר ברשת ברקע: העברות של נתונים ברקע ברשת סלולרית מתבצעות באצווה ונדחות באמצעות WorkManagerהגבלות.
  • שימוש מופרז בסוללה: אבחון של התרוקנות הסוללה גבוהה במכשירים ניידים ובמכשירי Wear OS באמצעות פרופיל של פעילות המעבד, החיישן והרדיו.

הרשאות ואופטימיזציה של בנייה

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