ملفات تعريف بدء التشغيل والأساس
ابدأ تشغيل التطبيق بسرعة أكبر
ملفات تعريف بدء التشغيل والأساس درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
الانطباع الأول: بدء تشغيل التطبيق
زمن بدء التشغيل هو أول ما يختبره كل مستخدم. بل إن Google Play يعرض بطء بدء التشغيل كمشكلة في الجودة. يجعل البدء البارد السريع التطبيق يبدو متميزًا، بينما يدفع البدء البطيء المستخدمين إلى مغادرته.
في هذا الدرس ستتعلّم أنواع بدء التشغيل الثلاثة، وما الذي يجعله بطيئًا، والأدوات الحديثة — App Startup وBaseline Profiles — التي تجعل البدء البارد أسرع بكثير.
البدء البارد والدافئ والساخن
يعرّف Android ثلاثة سيناريوهات لبدء التشغيل، من الأبطأ إلى الأسرع:
- البدء البارد: لا تكون العملية موجودة. ينشئها Android، ثم يشغّل
Application، وبعد ذلك شاشتك الأولى. وهو الأبطأ والأهم من حيث التحسين. - البدء الدافئ: تكون العملية حيّة، لكن يجب إعادة إنشاء Activity.
- البدء الساخن: تبقى Activity في الذاكرة؛ ويكفي إحضارها إلى الواجهة. ويكاد يكون فوريًا.
تركّز جهود التحسين على البدء البارد، لأنه ما يواجهه المستخدمون الجدد والعائدون غالبًا.
قياس زمن بدء التشغيل
لا يمكنك تحسين ما لا تقيسه. إليك طريقتان سهلتان:
- Logcat: يسجّل النظام سطر
Displayedالذي يوضح الزمن حتى الإطار الأول. - Macrobenchmark: يوفّر
StartupTimingMetricأرقامًا مستقرة وقابلة للتكرار لبدء التشغيل البارد.
شغّل أمر adb أدناه، وراقب ظهور سطر Displayed.
# Cold-start the app and log time to first frame
adb shell am start -W -S com.example.app/.MainActivity
# Output includes:
# TotalTime: 412 <- ms to first frame
# Or filter logcat:
adb logcat | grep "Displayed com.example.app"أبقِ Application.onCreate خفيفًا
يُنفّذ كل ما يوجد في Application.onCreate() على الخيط الرئيسي قبل الإطار الأول. ولذلك يؤخر التهيئة الثقيلة هنا بدء التشغيل مباشرةً.
تُهيّئ النسخة السيئة أدناه عدة مكتبات بشكل فوري. أجّل أي شيء لا تحتاج إليه الشاشة الأولى، أو شغّله في الخلفية.
// SLOW: blocks the first frame with eager init
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
Analytics.init(this) // network, disk
ImageLoader.preload(this) // heavy
Database.warmUp(this) // disk I/O
}
}
// Each of these adds milliseconds before the user sees anything.مكتبة Jetpack App Startup
تستبدل مكتبة App Startup عدة موفّري محتوى للمكتبات (يتسبب كل منهم في تكلفة زمنية) بموفّر مشترك واحد، وتتيح لك التعبير عن ترتيب التهيئة واعتمادياتها بطريقة واضحة.
تنفّذ Initializer لكل مكوّن؛ وتشغّل App Startup هذه المكوّنات مرة واحدة وفق ترتيب الاعتماديات.
class AnalyticsInitializer : Initializer<Analytics> {
override fun create(context: Context): Analytics {
return Analytics.init(context.applicationContext)
}
// Runs after Logger is ready
override fun dependencies() = listOf(LoggerInitializer::class.java)
}
// Registered via a single merged provider in the manifest,
// avoiding one ContentProvider per library.التهيئة الكسولة وتلك التي تعمل في الخلفية
الأفضل من ترتيب العمل الفوري هو تنفيذ قدر أقل منه عند بدء التشغيل. إليك أسلوبين:
- كسولة: أنشئ الكائنات الثقيلة عند أول استخدام باستخدام
by lazyفي Kotlin. - في الخلفية: انقل التهيئة غير المتعلقة بواجهة المستخدم خارج الخيط الرئيسي.
وبذلك لا يحجب العمل الذي لا يحتاج إليه المستخدم بعد الإطار الأول.
class MyApp : Application() {
// Built only when first accessed, not during onCreate
val imageLoader by lazy { ImageLoader.build(this) }
override fun onCreate() {
super.onCreate()
// Push non-critical setup off the main thread
CoroutineScope(Dispatchers.Default).launch {
Analytics.init(applicationContext)
}
}
}AOT مقابل JIT: لماذا يكون التشغيل الأول بطيئًا
بشكل افتراضي، يشغّل Android الرمز الثانوي لتطبيقك بمزيج من التفسير والترجمة في الوقت المناسب (Just-In-Time أو JIT). عند تشغيل الرمز الساخن للمرة الأولى، يكون مفسّرًا (بطيئًا)، ولا تُترجم بيئة التشغيل هذا الرمز إلى رمز أصلي إلا لاحقًا.
ولهذا تحديدًا يبدو البدء البارد والتمرير الأول أبطأ. تعالج Baseline Profiles ذلك بإخبار الجهاز بترجمة الرمز المهم مسبقًا Ahead-Of-Time (AOT) عند التثبيت.
ما هو Baseline Profile
إن Baseline Profile قائمة بالفئات والطرائق التي تُستخدم أثناء المسارات المهمة (بدء التشغيل والتمرير الأول). تشحنها مع التطبيق؛ وعند التثبيت يترجم الجهاز هذه الطرائق مسبقًا AOT، فتعمل بالسرعة الأصلية منذ التشغيل الأول.
تفيد تقارير Google بحدوث تحسينات في بدء التشغيل غالبًا ضمن نطاق 20–40%، من دون أي تغييرات على رمز ميزاتك — فالملف وحده يكفي.
// build.gradle.kts
plugins { id("androidx.baselineprofile") }
dependencies {
baselineProfile(project(":baselineprofile"))
}
// The generated profile ships as
// assets/dexopt/baseline.prof
// and is applied automatically at install.إنشاء Baseline Profile
تنشئ الملف بكتابة اختبار صغير يقود المسار المهم على جهاز؛ إذ تسجّل الأدوات الطرائق التي تم تشغيلها وتكتب ملف التعريف. ثم تودعه في المشروع وتعيد البناء.
إليك مولّدًا نموذجيًا يلتقط بدء التشغيل والتمرير.
@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
@get:Rule val rule = BaselineProfileRule()
@Test
fun generate() = rule.collect(packageName = "com.example.app") {
pressHome()
startActivityAndWait()
// exercise the critical journey
device.findObject(By.res("feed")).fling(Direction.DOWN)
}
}
// Run the generateBaselineProfile Gradle task to produce the file.التحقق من المكسب
احرص دائمًا على تأكيد التحسين باستخدام اختبار معياري، مع مقارنة بدء التشغيل عند تطبيق الملف وبدونه (CompilationMode.None مقابل Partial مع الملف).
إذا لم تقس، فلن تتمكن من إثبات أن الملف أفادك — بل قد يضر الملف القديم بالأداء. أعد إنشاءه كلما تغيّرت المسارات الساخنة بشكل ملحوظ.
@Test
fun startupWithProfile() = rule.measureRepeated(
packageName = "com.example.app",
metrics = listOf(StartupTimingMetric()),
iterations = 10,
startupMode = StartupMode.COLD,
compilationMode = CompilationMode.Partial() // uses the baseline profile
) {
pressHome()
startActivityAndWait()
}خطة لتحسين بدء التشغيل
حوّل ذلك إلى خطة قابلة للتكرار:
- قِس البدء البارد باستخدام Macrobenchmark و
adb am start -W. - خفّف
Application.onCreate: أجّل التهيئة باستخدامby lazy، وانقل العمل خارج الخيط الرئيسي. - استخدم App Startup لدمج موفّري المحتوى وترتيب التهيئة.
- اشحن Baseline Profile للترجمة المسبقة AOT للمسار المهم.
- تحقق باستخدام اختبار معياري، وحافظ على حداثة الملف.
والنتيجة: إطار أول سريع يستحق ملاحظة المستخدمين.
اختبار سريع
لقد أرفقت Baseline Profile مع تطبيقك. ما الذي يفعله بشكل أساسي لتحسين بدء التشغيل؟
مراجعة: سرعة منذ الإطار الأول
تعلّمت كيفية تحسين بدء التشغيل، وهو مقياس الأداء الأكثر وضوحًا:
- حسّن البدء البارد، وقِسه باستخدام Macrobenchmark و
adb am start -W. - أبقِ
Application.onCreateخفيفًا: استخدم التهيئة الكسولة وشغّل العمل غير المتعلق بواجهة المستخدم في الخلفية. - استخدم مكتبة App Startup لدمج الموفّرين وترتيب المهيئات.
- اشحن Baseline Profile كي يُترجم الرمز الساخن مسبقًا AOT عند التثبيت، فيعمل بالسرعة الأصلية في التشغيل الأول.
- احرص دائمًا على التحقق من المكسب باستخدام اختبار معياري، وحافظ على حداثة الملف.
وبذلك يكتمل موضوع تحسين الأداء والتنميط: يمكنك الآن القياس، والحد من إعادة التركيب، وإصلاح التسرّبات، وتحقيق بدء تشغيل سريع.
الأسئلة الشائعة
هل درس «ملفات تعريف بدء التشغيل والأساس» مجاني؟
نعم — نص درس «ملفات تعريف بدء التشغيل والأساس» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «ملفات تعريف بدء التشغيل والأساس»؟
ابدأ تشغيل التطبيق بسرعة أكبر تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «ملفات تعريف بدء التشغيل والأساس»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قياس الأداء
- السيطرة على إعادة التركيب
- تسرّبات الذاكرة وإصلاحها
- ملفات تعريف بدء التشغيل والأساس