যখন আপনি ডিফল্ট সেটিংস ব্যবহার করে অ্যাপ অপ্টিমাইজেশন সক্ষম করেন , তখন R8 আপনার কর্মক্ষমতা সুবিধা সর্বাধিক করার জন্য ব্যাপক অপ্টিমাইজেশন সম্পাদন করে। R8 কোডে উল্লেখযোগ্য পরিবর্তন করে, যার মধ্যে রয়েছে ক্লাস, ক্ষেত্র এবং পদ্ধতির নাম পরিবর্তন, স্থানান্তর এবং অপসারণ। যদি আপনি লক্ষ্য করেন যে এই পরিবর্তনগুলি ত্রুটির কারণ হয়, তাহলে আপনাকে R8 কোডের কোন অংশগুলিকে Keep নিয়মে ঘোষণা করে পরিবর্তন করা উচিত নয় তা নির্দিষ্ট করতে হবে।
সাধারণ পরিস্থিতি যেখানে নিয়ম মেনে চলা প্রয়োজন
R8 আপনার কোডের সকল ডাইরেক্ট কল শনাক্ত করে এবং সংরক্ষণ করে। তবে, R8 পরোক্ষ কোড ব্যবহার দেখতে পারে না, যার ফলে এটি আপনার অ্যাপের প্রয়োজনীয় কোডটি সরিয়ে ফেলতে পারে, যার ফলে ক্র্যাশ হতে পারে। Keep নিয়ম ব্যবহার করে R8 কে এই ধরনের পরোক্ষভাবে ব্যবহৃত কোড সংরক্ষণ করতে বলুন। কিছু সাধারণ পরিস্থিতিতে যেখানে আপনার Keep নিয়মের প্রয়োজন হতে পারে তা নিম্নরূপ:
- প্রতিফলন দ্বারা অ্যাক্সেস করা কোড: প্রতিফলনের মাধ্যমে কখন ক্লাস, ফিল্ড বা পদ্ধতি অ্যাক্সেস করা হয় তা R8 সনাক্ত করতে পারে না। উদাহরণস্বরূপ, R8
Class.getDeclaredMethod()ব্যবহার করে তার নামের দ্বারা অনুসন্ধান করা পদ্ধতি বাClass.getAnnotation()ব্যবহার করে পুনরুদ্ধার করা একটি অ্যানোটেশন সনাক্ত করতে পারে না। এই ক্ষেত্রে, R8 এই পদ্ধতি এবং অ্যানোটেশনগুলির নাম পরিবর্তন করতে পারে বা সম্পূর্ণরূপে মুছে ফেলতে পারে, যার ফলে রানটাইমেClassNotFoundExceptionবাNoSuchMethodExceptionতৈরি হয়। - জাভা নেটিভ ইন্টারফেস (JNI) থেকে কল করা কোড: যখন নেটিভ (C বা C++) কোড একটি জাভা বা কোটলিন পদ্ধতিতে কল করে, অথবা জাভা বা কোটলিন কোড JNI দিয়ে C++ কোডে কল করে, তখন কলটি পদ্ধতির নামের একটি গতিশীল স্ট্রিং লুকআপের উপর ভিত্তি করে করা হয়। R8 গতিশীল স্ট্রিং-ভিত্তিক পদ্ধতি কলটি দেখতে পারে না, এবং তাই এর অপ্টিমাইজেশনগুলি আপনার কোডটি ভেঙে ফেলতে পারে।
এটি এমন পরিস্থিতির একটি সম্পূর্ণ তালিকা নয় যেখানে নিয়ম মেনে চলার প্রয়োজন হয়, তবে এই পরিস্থিতিগুলি বেশিরভাগ ক্ষেত্রেই প্রযোজ্য যেখানে আপনার নিয়ম মেনে চলার প্রয়োজন হতে পারে।
আপনার অ্যাপে কীভাবে রাখার নিয়ম যোগ করবেন
অ্যাপ মডিউলের রুট ডিরেক্টরিতে অবস্থিত একটি proguard-rules.pro ফাইলে আপনার নিয়মগুলি যুক্ত করা উচিত—ফাইলটি ইতিমধ্যেই সেখানে থাকতে পারে, কিন্তু যদি না থাকে, তাহলে এটি তৈরি করুন। ফাইলে নিয়মগুলি প্রয়োগ করতে, আপনাকে নিম্নলিখিত কোডে দেখানো হিসাবে আপনার module-level build.gradle.kts (অথবা build.gradle ) ফাইলে ফাইলটি ঘোষণা করতে হবে:
কোটলিন
android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile("proguard-android-optimize.txt"), // File with your custom rules "proguard-rules.pro" ) // ... } } // ... }
খাঁজকাটা
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile('proguard-android-optimize.txt'), // File with your custom rules. 'proguard-rules.pro' ) // ... } } // ... }
ডিফল্টরূপে, আপনার বিল্ড ফাইলে proguard-android-optimize.txt ফাইলটিও থাকে। এই ফাইলটিতে বেশিরভাগ অ্যান্ড্রয়েড প্রোজেক্টের জন্য প্রয়োজনীয় নিয়মগুলি অন্তর্ভুক্ত রয়েছে, তাই আপনার এটিকে বিল্ড ফাইলে থাকতে দেওয়া উচিত। এই ফাইলটি proguard-common.txt ফাইলের উপর ভিত্তি করে তৈরি এবং এর সাথে কন্টেন্ট শেয়ার করে।
বড় অ্যাপগুলিতে সাধারণত একাধিক লাইব্রেরি মডিউলে কোড থাকে। এই ধরনের ক্ষেত্রে, নির্দিষ্ট লাইব্রেরি মডিউলের মধ্যে প্রযোজ্য কোডের পাশাপাশি keep নিয়মগুলি রাখা প্রায়শই ভাল। লাইব্রেরির জন্য keep নিয়মগুলি বজায় রাখার ক্ষেত্রে গুরুত্বপূর্ণ পার্থক্য হল আপনি কীভাবে আপনার লাইব্রেরি মডিউলের build.gradle.kts (অথবা build.gradle ) ফাইলের মধ্যে এই নিয়মগুলি ঘোষণা করেন। আরও জানতে লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।
একটি রাখার নিয়ম যোগ করুন
যখন আপনি কিপ রুলস যোগ করেন, তখন আপনি গ্লোবাল অপশন অন্তর্ভুক্ত করতে পারেন এবং আপনার নিজস্ব কিপ রুলস সংজ্ঞায়িত করতে পারেন।
গ্লোবাল অপশন : গ্লোবাল অপশন হল সাধারণ নির্দেশিকা যা আপনার সম্পূর্ণ কোডবেসে R8 কীভাবে কাজ করে তা প্রভাবিত করে। আরও জানতে, গ্লোবাল অপশন দেখুন।
Keep নিয়ম : Keep নিয়মগুলি সাবধানে ডিজাইন করা প্রয়োজন, যাতে আপনি অসাবধানতাবশত আপনার অ্যাপটি ভেঙে না ফেলে কোড অপ্টিমাইজেশন সর্বাধিক করার মধ্যে সঠিক ভারসাম্য পান। Keep নিয়মগুলি কীভাবে লিখতে হয় তা শিখতে, Add keep নিয়মগুলি দেখুন।
স্ট্যান্ডার্ড নিয়ম ছাড়াও, আপনি শর্তসাপেক্ষ keep নিয়ম সংজ্ঞায়িত করতে পারেন। এই নিয়মগুলি, যা শুধুমাত্র নির্দিষ্ট শর্ত পূরণ হলেই প্রযোজ্য, বিশেষ করে প্রতিফলনের মতো পরিস্থিতিতে কার্যকর। এগুলি আপনাকে keep নিয়মের পরিধি শুধুমাত্র একটি নির্দিষ্ট শ্রেণী বা সদস্য উপস্থিত থাকলে সীমাবদ্ধ করতে দেয়, আরও সুনির্দিষ্ট নিয়ন্ত্রণ প্রদান করে এবং অপ্রয়োজনীয় কোড ধরে রাখা কমাতে সাহায্য করে।
লাইব্রেরি লেখকদের জন্য নিয়ম মেনে চলুন
কিপ রুলসের গ্লোবাল অপশন এবং সিনট্যাক্স সম্পর্কে জানার পর, আরও বিস্তারিত জানার জন্য লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।