App Startup   Android Jetpack-এর অংশ।

অ্যাপ্লিকেশন স্টার্টআপে কম্পোনেন্ট শুরু করার জন্য অ্যাপ স্টার্টআপ লাইব্রেরি একটি সহজ, পারফরম্যান্স-ভিত্তিক উপায় প্রদান করে। লাইব্রেরি ডেভেলপার এবং অ্যাপ ডেভেলপার, দুজনেই স্টার্টআপ সিকোয়েন্স স্ট্রিমলাইন করতে এবং ইনিশিয়ালাইজেশনের ক্রম স্পষ্টভাবে সেট করতে অ্যাপ স্টার্টআপ ব্যবহার করতে পারেন।

আপনাকে শুরু করতে হবে এমন প্রতিটি কম্পোনেন্টের জন্য আলাদা কন্টেন্ট প্রোভাইডার সংজ্ঞায়িত করার পরিবর্তে, App Startup আপনাকে কম্পোনেন্ট ইনিশিয়ালাইজার সংজ্ঞায়িত করতে দেয় যা একটি একক কন্টেন্ট প্রোভাইডার শেয়ার করে। এটি অ্যাপ স্টার্ট-আপের সময় উল্লেখযোগ্যভাবে উন্নত করতে পারে।

সেটআপ

আপনার লাইব্রেরি বা অ্যাপে Jetpack Startup ব্যবহার করতে, আপনার Gradle ফাইলে নিম্নলিখিতগুলি যোগ করুন:

গ্রোভি

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

কোটলিন

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

অ্যাপ স্টার্টআপে কম্পোনেন্ট শুরু করুন

অ্যাপ চালু হওয়ার সাথে সাথেই কম্পোনেন্ট শুরু করার জন্য অ্যাপ ও লাইব্রেরি প্রায়শই নির্ভর করে। আপনি প্রতিটি ডিপেন্ডেন্সি ইনিশিয়ালাইজ করতে কন্টেন্ট প্রোভাইডার ব্যবহার করে এই প্রয়োজন পূরণ করতে পারেন, কিন্তু কন্টেন্ট প্রোভাইডার ইনস্ট্যানশিয়েট করা ব্যয়বহুল এবং এটি স্টার্টআপ সিকোয়েন্সকে অপ্রয়োজনীয়ভাবে ধীর করে দিতে পারে। এছাড়াও, Android অনির্ধারিত ক্রমে কন্টেন্ট প্রোভাইডার শুরু করে। অ্যাপ স্টার্টআপ, অ্যাপ স্টার্টআপে কম্পোনেন্ট শুরু করার আরও পারফর্ম্যান্স-ভিত্তিক উপায় প্রদান করে এবং স্পষ্টভাবে তাদের ডিপেন্ডেন্সি সংজ্ঞায়িত করে।

স্টার্টআপে অটোমেটিক কম্পোনেন্ট ইনিশিয়ালাইজ করার জন্য অ্যাপ স্টার্টআপ ব্যবহার করতে, আপনাকে অ্যাপের ইনিশিয়ালাইজ করার জন্য প্রয়োজনীয় প্রতিটি কম্পোনেন্টের জন্য কম্পোনেন্ট ইনিশিয়ালাইজার সংজ্ঞায়িত করতে হবে।

কম্পোনেন্ট ইনিশিয়ালাইজার প্রয়োগ করা

আপনি এমন একটি ক্লাস তৈরি করে প্রতিটি কম্পোনেন্ট ইনিশিয়ালাইজার সংজ্ঞায়িত করেন যা 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()
    }
}

জাভা

// 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 ইনিশিয়ালাইজ করে। Initializer<ExampleLogger> প্রয়োগ করে এমন একটি ExampleLoggerInitializer ক্লাস সংজ্ঞায়িত করুন:

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)
    }
}

জাভা

// 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);
    }
}

আপনি dependencies() পদ্ধতিতে WorkManagerInitializer অন্তর্ভুক্ত করেছেন বলে, অ্যাপ স্টার্টআপ ExampleLogger-এর আগে WorkManager ইনিশিয়ালাইজ করে।

ম্যানিফেস্ট এন্ট্রি সেট-আপ করুন

অ্যাপ স্টার্টআপে InitializationProvider নামের একটি বিশেষ কন্টেন্ট প্রোভাইডার অন্তর্ভুক্ত থাকে যা এটি আপনার কম্পোনেন্ট ইনিশিয়ালাইজার খুঁজে পেতে এবং কল করতে ব্যবহার করে। অ্যাপ স্টার্টআপ প্রথমে InitializationProvider ম্যানিফেস্ট এন্ট্রির অধীনে <meta-data> এন্ট্রি চেক করে কম্পোনেন্ট ইনিশিয়ালাইজার খুঁজে বের করে। তারপর, অ্যাপ স্টার্টআপ, আগে থেকে খুঁজে পাওয়া যেকোনও ইনিশিয়ালাইজারের জন্য 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>

WorkManagerInitializer-এর জন্য আপনাকে <meta-data> এন্ট্রি যোগ করতে হবে না, কারণ WorkManagerInitializer হল ExampleLoggerInitializer-এর উপর নির্ভরশীল। এর অর্থ হল, ExampleLoggerInitializer খুঁজে পাওয়া গেলে, WorkManagerInitializer-ও খুঁজে পাওয়া যাবে।

tools:node="merge" অ্যাট্রিবিউট নিশ্চিত করে যে ম্যানিফেস্ট মার্জার টুল যেকোনও বিরোধপূর্ণ এন্ট্রি সঠিকভাবে সমাধান করে।

লিন্ট চেক রান করুন

অ্যাপ স্টার্টআপ লাইব্রেরিতে লিন্ট নিয়মের একটি সেট অন্তর্ভুক্ত থাকে যা আপনি ব্যবহার করে চেক করতে পারেন যে আপনি কম্পোনেন্ট ইনিশিয়ালাইজার সঠিকভাবে সংজ্ঞায়িত করেছেন কিনা। আপনি কমান্ড লাইন থেকে ./gradlew :app:lintDebug রান করে এইসব লিন্ট চেক করতে পারবেন।

কম্পোনেন্ট ম্যানুয়ালি শুরু করুন

সাধারণত আপনি যখন অ্যাপ স্টার্টআপ ব্যবহার করেন, তখন 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)

জাভা

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

এর ফলে, অ্যাপ স্টার্টআপ WorkManager-কেও ইনিশিয়ালাইজ করে, কারণ WorkManager হল ExampleLogger-এর উপর নির্ভরশীল।

মতামত জানান

এইসব রিসোর্সের মাধ্যমে আপনার মতামত ও আইডিয়া আমাদের সাথে শেয়ার করুন:

ইস্যু ট্র্যাকার
সমস্যার ব্যাপারে অভিযোগ জানান যাতে আমরা বাগ ঠিক করতে পারি।