স্ট্রং স্কিপিং হল কম্পোজ কম্পাইলারে উপলব্ধ একটি মোড। সক্রিয় করা হলে, এটি দুটি উপায়ে কম্পাইলারের আচরণ পরিবর্তন করে:
শক্তিশালী স্কিপিং মোড সক্ষম করুন
স্ট্রং স্কিপিং ডিফল্টরূপে Kotlin 2.0.20 এ সক্ষম করা আছে।
পূর্ববর্তী রিলিজে একটি গ্রেডল মডিউলের জন্য শক্তিশালী স্কিপিং সক্ষম করতে, আপনার গ্রেডল কনফিগারেশনের composeCompiler
ব্লকে নিম্নলিখিত বিকল্পটি অন্তর্ভুক্ত করুন:
android { ... }
composeCompiler {
enableStrongSkippingMode = true
}
কম্পোজেবল skippability
স্ট্রং স্কিপিং মোড স্কিপিং এবং কম্পোজেবল ফাংশনগুলির ক্ষেত্রে কম্পোজ কম্পাইলার দ্বারা সাধারণত প্রয়োগ করা কিছু স্থিতিশীলতা নিয়মকে শিথিল করে। ডিফল্টরূপে, কম্পোজ কম্পাইলার একটি কম্পোজযোগ্য ফাংশনকে স্কিপযোগ্য হিসাবে চিহ্নিত করে যদি এর সমস্ত আর্গুমেন্টের স্থিতিশীল মান থাকে। শক্তিশালী স্কিপিং মোড এটি পরিবর্তন করে।
শক্তিশালী স্কিপিং সক্ষম হলে, সমস্ত পুনঃসূচনাযোগ্য কম্পোজেবল ফাংশন এড়িয়ে যাবে। এটি তাদের অস্থির পরামিতি আছে কিনা তা প্রযোজ্য। অ-পুনঃসূচনাযোগ্য কম্পোজেবল ফাংশনগুলি এড়ানো যায় না।
কখন এড়িয়ে যাবেন
পুনর্গঠনের সময় একটি কম্পোজযোগ্য এড়িয়ে যাবেন কিনা তা নির্ধারণ করতে, কম্পোজ প্রতিটি প্যারামিটারের মানকে তাদের পূর্ববর্তী মানের সাথে তুলনা করে। তুলনার ধরন প্যারামিটারের স্থায়িত্বের উপর নির্ভর করে।
- অস্থির পরামিতিগুলি উদাহরণ সমতা ব্যবহার করে তুলনা করা হয় (
===
) - স্থিতিশীল পরামিতিগুলি বস্তুর সমতা ব্যবহার করে তুলনা করা হয় (
Object.equals()
)
যদি সমস্ত পরামিতি এই প্রয়োজনীয়তাগুলি পূরণ করে, কম্পোজ পুনর্গঠনের সময় কম্পোজযোগ্যকে এড়িয়ে যায়।
আপনি শক্তিশালী স্কিপিং থেকে অপ্ট আউট করার জন্য একটি কম্পোজেবল চাইতে পারেন। অর্থাৎ, আপনি একটি পুনঃসূচনা করতে পারেন কিন্তু না-ছাড়া যায় এমন কম্পোজেবল। এই ক্ষেত্রে, @NonSkippableComposable
টীকা ব্যবহার করুন।
@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}
স্থিতিশীল হিসাবে ক্লাস টীকা
আপনি যদি ইন্সট্যান্স ইকুয়ালিটির পরিবর্তে অবজেক্ট ইকুয়ালিটি ব্যবহার করে একটি অবজেক্ট চান, তাহলে @Stable এর সাথে প্রদত্ত ক্লাসটি টীকা করতে থাকুন। আপনাকে কখন এটি করতে হতে পারে তার একটি উদাহরণ হল অবজেক্টের একটি সম্পূর্ণ তালিকা পর্যবেক্ষণ করার সময়, রুম এর মতো ডেটা উত্সগুলি তালিকার প্রতিটি আইটেমের জন্য নতুন বস্তু বরাদ্দ করবে যখন তাদের মধ্যে একটি পরিবর্তন হবে।
ল্যাম্বডা স্মৃতিচারণ
শক্তিশালী স্কিপিং মোড কম্পোজেবলের ভিতরে ল্যাম্বডাসের আরও মেমোাইজেশন সক্ষম করে। শক্তিশালী স্কিপিং সক্ষম হলে, একটি কম্পোজযোগ্য ফাংশনের ভিতরে থাকা প্রতিটি ল্যাম্বডা স্বয়ংক্রিয়ভাবে মনে থাকবে।
উদাহরণ
শক্তিশালী স্কিপিং ব্যবহার করার সময় কম্পোজেবলের অভ্যন্তরে ল্যাম্বডাসের মেমোাইজেশন অর্জন করতে, কম্পাইলার আপনার ল্যাম্বডাকে remember
কল দিয়ে মুড়ে দেয়। এটা ল্যাম্বডা এর ক্যাপচার সঙ্গে চাবিকাঠি হয়.
নিম্নলিখিত উদাহরণের মতো আপনার ল্যাম্বডা আছে এমন একটি ক্ষেত্রে বিবেচনা করুন:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = {
use(unstableObject)
use(stableObject)
}
}
শক্তিশালী স্কিপিং সক্ষম করে, কম্পাইলার ল্যাম্বডাকে remember
কলে মোড়ানোর মাধ্যমে স্মরণ করে:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = remember(unstableObject, stableObject) {
{
use(unstableObject)
use(stableObject)
}
}
}
কীগুলি কম্পোজেবল ফাংশনের মতো একই তুলনা নিয়ম অনুসরণ করে। রানটাইম ইনস্ট্যান্স সমতা ব্যবহার করে অস্থির কীগুলির তুলনা করে। এটি বস্তুর সমতা ব্যবহার করে স্থিতিশীল কীগুলির তুলনা করে।
স্মৃতিকরণ এবং পুনর্গঠন
এই অপ্টিমাইজেশানটি কম্পোজেবলের সংখ্যাকে ব্যাপকভাবে বৃদ্ধি করে যা রানটাইম পুনর্গঠনের সময় এড়িয়ে যায়। মেমোাইজেশন ব্যতীত, রানটাইম যেকোন কম্পোজেবলের জন্য একটি নতুন ল্যাম্বডা বরাদ্দ করার সম্ভাবনা অনেক বেশি যা পুনর্গঠনের সময় একটি ল্যাম্বডা প্যারামিটার নেয়। ফলস্বরূপ, নতুন ল্যাম্বডায় পরামিতি রয়েছে যা শেষ রচনার সমান নয়। এর ফলে পুনর্গঠন হয়।
মুখস্থ করা এড়িয়ে চলুন
আপনার যদি একটি ল্যাম্বডা থাকে যা আপনি মেমোাইজ করতে চান না, তাহলে @DontMemoize
টীকাটি ব্যবহার করুন।
val lambda = @DontMemoize {
...
}
APK সাইজ
কম্পাইল করা হলে, স্কিপ করা যায় না এমন কম্পোজেবলের তুলনায় স্কিপযোগ্য কম্পোজেবল বেশি জেনারেটেড কোড তৈরি করে। শক্তিশালী স্কিপিং সক্ষম করার সাথে, কম্পাইলার প্রায় সমস্ত কম্পোজেবলকে স্কিপযোগ্য হিসাবে চিহ্নিত করে এবং সমস্ত ল্যাম্বডাকে একটি remember{...}
। এই কারণে, শক্তিশালী স্কিপিং মোড সক্ষম করা আপনার অ্যাপ্লিকেশনের APK আকারের উপর খুব কম প্রভাব ফেলে।
নাও ইন অ্যান্ড্রয়েডে শক্তিশালী স্কিপিং সক্ষম করে APK আকার 4kB বৃদ্ধি করেছে৷ আকারের পার্থক্য মূলত প্রদত্ত অ্যাপে উপস্থিত ছিল কিন্তু তুলনামূলকভাবে ছোট হওয়া উচিত পূর্বে এড়ানো যায় না এমন কম্পোজেবলের সংখ্যার উপর নির্ভর করে।