بدء تشغيل التطبيق جزء من Android Jetpack.

توفّر مكتبة App Startup طريقة مباشرة وفعّالة لإعداد المكوّنات عند بدء تشغيل التطبيق. يمكن لكل من مطوري المكتبات ومطوري التطبيقات استخدام App Startup لتبسيط تسلسلات الشركات الناشئة وتحديد ترتيب التهيئة بشكل صريح.

بدلاً من تحديد موفري محتوى منفصلين لكل مكون تحتاج إلى تهيئته، يسمح لك بدء تشغيل التطبيق بتحديد أدوات تهيئة المكونات التي تشترك في موفر محتوى واحد. يمكن أن يؤدي ذلك إلى تحسين وقت بدء تشغيل التطبيق بشكل ملحوظ.

ضبط إعدادات

لاستخدام Jetpack Startup في مكتبتك أو تطبيقك، أضِف ما يلي إلى ملف Gradle:

رائع

dependencies {
    implementation "androidx.startup:startup-runtime:1.1.1"
}

Kotlin

dependencies {
    implementation("androidx.startup:startup-runtime:1.1.1")
}

إعداد المكونات عند بدء تشغيل التطبيق

تعتمد التطبيقات والمكتبات غالبًا على تهيئة المكونات فورًا عند بدء تشغيل التطبيق. يمكنك تلبية هذه الحاجة باستخدام موفّري المحتوى من أجل إعداد كل تبعية، ولكن تكلفة إنشاء مثيل لموفري المحتوى قد تؤدي إلى إبطاء تسلسل بدء التشغيل بدون داعٍ. بالإضافة إلى ذلك، يقوم Android بإعداد موفري المحتوى بترتيب غير محدد. يوفّر App Startup طريقة أكثر أداءً لإعداد المكونات عند بدء تشغيل التطبيق وتحديد تبعياتها بشكل صريح.

لاستخدام App Startup لتهيئة المكونات تلقائيًا عند بدء التشغيل، يجب عليك تحديد مكون محدد لكل مكون يحتاج التطبيق للتهيئة.

تنفيذ أدوات إعداد المكوّنات

يمكنك تحديد كل مُعدّ للمكوِّن من خلال إنشاء فئة تنفّذ واجهة Initializer<T>. تحدد هذه الواجهة طريقتين مهمتين:

  • الطريقة create()، التي تحتوي على جميع العمليات اللازمة لإعداد المكوِّن وعرض مثيل T.
  • الطريقة dependencies() التي تعرض قائمة بكائنات Initializer<T> الأخرى التي يعتمد عليها المنظِّم. يمكنك استخدام هذه الطريقة للتحكم في الترتيب الذي يشغّل به التطبيق أدوات التهيئة عند بدء التشغيل.

على سبيل المثال، لنفترض أن تطبيقك يعتمد على WorkManager ويحتاج إلى تهيئته عند بدء التشغيل. حدد فئة WorkManagerInitializer تنفّذ Initializer<WorkManager>:

Kotlin

// Initializes WorkManager.
class WorkManagerInitializer : Initializer<WorkManager> {
    override fun create(context: Context): WorkManager {
        val configuration = Configuration.Builder().build()
        WorkManager.initialize(context, configuration)
        return WorkManager.getInstance(context)
    }
    override fun dependencies(): List<Class<out Initializer<*>>> {
        // No dependencies on other libraries.
        return emptyList()
    }
}

Java

// Initializes WorkManager.
class WorkManagerInitializer implements Initializer<WorkManager> {

    @Override
    public WorkManager create(Context context) {
        Configuration configuration = Configuration.Builder().build();
        WorkManager.initialize(context, configuration);
        return WorkManager.getInstance(context);
    }

    @Override
    public List<Class<Initializer<?>>> dependencies() {
        // No dependencies on other libraries.
        return emptyList();
    }

}

تعرِض الطريقة dependencies() قائمة فارغة لأنّ WorkManager لا تعتمد على أيّ مكتبات أخرى.

لنفترض أنّ تطبيقك يعتمد أيضًا على مكتبة تُسمى ExampleLogger، والتي تعتمد بدورها على WorkManager. تعني هذه التبعية أنك بحاجة إلى التأكد من أن بدء تشغيل التطبيق يهيئ WorkManager أولاً. تحديد فئة ExampleLoggerInitializer تنفّذ Initializer<ExampleLogger>:

Kotlin

// Initializes ExampleLogger.
class ExampleLoggerInitializer : Initializer<ExampleLogger> {
    override fun create(context: Context): ExampleLogger {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context))
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return listOf(WorkManagerInitializer::class.java)
    }
}

Java

// Initializes ExampleLogger.
class ExampleLoggerInitializer implements Initializer<ExampleLogger> {

    @Override
    public ExampleLogger create(Context context) {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context));
    }

    @Override
    public List<Class<Initializer<?>>> dependencies() {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return Arrays.asList(WorkManagerInitializer.class);
    }
}

بسبب تضمين WorkManagerInitializer في طريقة dependencies()، يهيئ App Startup WorkManager قبل ExampleLogger.

إعداد إدخالات البيان

يشتمل App Startup على موفّر محتوى خاص يُسمى InitializationProvider يستخدمه لاكتشاف أدوات تهيئة المكوّنات والاتصال بها. تكتشف ميزة App Startup أدوات تهيئة المكوّنات من خلال التحقق أولاً من إدخال <meta-data> ضمن إدخال البيان InitializationProvider. بعد ذلك، تستدعي App Startup طرق dependencies() لأي أدوات تم اكتشافها من قبل.

وهذا يعني أنّه يجب استيفاء أحد الشروط التالية لتكون أداة إعداد المكوّنات قابلة للاكتشاف من خلال ميزة App Startup:

  • يحتوي مشغِّل المكوِّن على إدخال <meta-data> مقابل ضمن إدخال البيان InitializationProvider.
  • يتم إدراج منظِّم المكوِّن في طريقة dependencies() من معدِّل يمكن اكتشافه.

ننصحك مرّة أخرى باستخدام المثال الذي يتضمّن WorkManagerInitializer وExampleLoggerInitializer. للتأكد من أن بدء تشغيل التطبيق يمكنه اكتشاف هذه المهيئات، أضف ما يلي إلى ملف البيان:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <!-- This entry makes ExampleLoggerInitializer discoverable. -->
    <meta-data  android:name="com.example.ExampleLoggerInitializer"
          android:value="androidx.startup" />
</provider>

لست بحاجة إلى إضافة إدخال <meta-data> لـ WorkManagerInitializer، لأن WorkManagerInitializer تعتمد على ExampleLoggerInitializer. هذا يعني أنّه إذا كان من الممكن العثور على علامة ExampleLoggerInitializer، سيكون WorkManagerInitializer كذلك.

تضمن السمة tools:node="merge" أن أداة دمج البيان تحل أي إدخالات متضاربة كما ينبغي.

تشغيل عمليات التحقّق من الوبر

تتضمن مكتبة App Startup مجموعة من قواعد الوبر التي يمكنك استخدامها للتحقق مما إذا كنت قد حددت أدوات تهيئة المكوِّنات بشكل صحيح. يمكنك إجراء عمليات التحقّق من الوبر هذه عن طريق تشغيل ./gradlew :app:lintDebug من سطر الأوامر.

إعداد المكونات يدويًا

عادةً عند استخدام App Startup، يستخدم الكائن InitializationProvider كيانًا يُسمى AppInitializer لاكتشاف أدوات إعداد المكوّنات وتشغيلها تلقائيًا عند بدء تشغيل التطبيق. ومع ذلك، يمكنك أيضًا استخدام AppInitializer مباشرةً لإعداد المكونات التي لا يحتاجها تطبيقك عند بدء التشغيل يدويًا. وتُعرف هذه العملية باسم الإعداد الكسول، ويمكن أن يساعد في تقليل تكاليف بدء التشغيل.

يجب أولاً إيقاف الإعداد التلقائي لأي مكوّنات تريد تهيئتها يدويًا.

إيقاف الإعداد التلقائي لمكوِّن فردي

لإيقاف الإعداد التلقائي لمكوِّن واحد، عليك إزالة الإدخال <meta-data> الخاص بموفِّر الإعداد من البيان.

على سبيل المثال، تؤدي إضافة ما يلي إلى ملف البيان إلى إيقاف الإعداد التلقائي لـ ExampleLogger:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data android:name="com.example.ExampleLoggerInitializer"
              tools:node="remove" />
</provider>

يمكنك استخدام tools:node="remove" في الإدخال بدلاً من إزالة الإدخال للتأكّد من أنّ أداة الدمج تزيل أيضًا الإدخال من جميع ملفات البيان المدمجة الأخرى.

إيقاف الإعداد التلقائي لجميع المكوّنات

لإيقاف الإعداد التلقائي بالكامل، يمكنك إزالة إدخال InitializationProvider بالكامل من البيان:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove" />

استدعاء مهيئات المكوّنات يدويًا

إذا تم إيقاف الإعداد التلقائي لأحد المكوّنات، يمكنك استخدام AppInitializer لإعداد هذا المكوِّن وتبعياته يدويًا.

على سبيل المثال، يستدعي الرمز التالي AppInitializer ويضبط ExampleLogger يدويًا:

Kotlin

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer::class.java)

Java

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer.class);

نتيجةً لذلك، يتولّى App Startup أيضًا إعداد WorkManager لأنّ WorkManager هي تابعة لـ ExampleLogger.

تقديم ملاحظات

يُرجى مشاركة ملاحظاتك وآرائك معنا من خلال الموارد التالية:

أداة تتبّع المشاكل
يمكنك الإبلاغ عن المشاكل حتى نتمكّن من إصلاح الأخطاء.