আপনি ডিফল্ট সেটিংস সহ অ্যাপ অপ্টিমাইজেশন চালু করলে, R8 আপনার পারফর্ম্যান্স সংক্রান্ত সুবিধা সর্বাধিক করার জন্য ব্যাপক অপ্টিমাইজেশন করে। R8 কোডে উল্লেখযোগ্য পরিবর্তন করে, যার মধ্যে ক্লাস, ফিল্ড ও মেথডের নাম পরিবর্তন করা, সরানো ও মুছে ফেলা অন্তর্ভুক্ত। আপনি যদি লক্ষ্য করেন যে এই পরিবর্তনগুলির কারণে সমস্যা হচ্ছে, তাহলে আপনাকে কোডের কোন অংশগুলি R8-এর পরিবর্তন করা উচিত নয় তা নির্দিষ্ট করতে হবে সেগুলি রাখার নিয়মে ঘোষণা করে।
সাধারণ পরিস্থিতি যেখানে 'কিপ' নিয়ম প্রযোজ্য
R8 আপনার কোডে সব ডাইরেক্ট কল শনাক্ত করে ও সংরক্ষণ করে। তবে, R8 পরোক্ষ কোড ব্যবহার দেখতে পারে না, যার ফলে এটি আপনার অ্যাপের জন্য প্রয়োজনীয় কোড সরিয়ে দিতে পারে, যার ফলে ক্র্যাশ হতে পারে। এই ধরনের পরোক্ষভাবে ব্যবহৃত কোড সংরক্ষণ করার জন্য R8-কে বলতে, কিপ রুল ব্যবহার করুন। কয়েকটি সাধারণ পরিস্থিতি যেখানে আপনাকে নিয়ম মেনে চলতে হতে পারে, সেগুলি নিচে দেওয়া হল:
- রিফ্লেকশনের মাধ্যমে অ্যাক্সেস করা কোড: R8, ক্লাস, ফিল্ড বা
মেথড রিফ্লেকশনের মাধ্যমে অ্যাক্সেস করা হলে তা শনাক্ত করতে পারে না। যেমন, R8,
Class.getDeclaredMethod()ব্যবহার করে নাম দিয়ে খোঁজা কোনও মেথড বাClass.getAnnotation()ব্যবহার করে পাওয়া কোনও অ্যানোটেশন শনাক্ত করতে পারে না। এইসব ক্ষেত্রে, R8 এইসব পদ্ধতি ও অ্যানোটেশনের নাম পরিবর্তন করতে পারে অথবা সেগুলি সম্পূর্ণভাবে সরিয়ে দিতে পারে, এর ফলে রানটাইমেClassNotFoundExceptionঅথবাNoSuchMethodExceptionহতে পারে। - Java Native Interface (JNI) থেকে কল করা কোড: নেটিভ (C বা C++) কোড যখন কোনও Java বা Kotlin মেথড কল করে অথবা Java বা Kotlin কোড যখন JNI-এর মাধ্যমে C++ কোড কল করে, তখন মেথডের নামের ডায়নামিক স্ট্রিং লুক-আপের উপর ভিত্তি করে কল করা হয়। R8 ডায়নামিক স্ট্রিং-ভিত্তিক মেথড কল দেখতে পায় না, তাই এর অপ্টিমাইজেশন আপনার কোড ভেঙে দিতে পারে।
এটি সেইসব পরিস্থিতির সম্পূর্ণ তালিকা নয় যেখানে 'কীপ' নিয়ম প্রয়োজন, তবে এই পরিস্থিতিগুলি বেশিরভাগ ক্ষেত্রে কভার করে যেখানে আপনার 'কীপ' নিয়ম প্রয়োজন হতে পারে।
আপনার কোড রিফ্লেকশন ব্যবহার করলে বা JNI থেকে কল করা হলে, আপনি ম্যানুয়ালি কিপ করার নিয়ম লেখার পরিবর্তে Jetpack Keep অ্যানোটেশন দিয়ে সেই কোড অ্যানোটেট করতে পারবেন। এটির Gradle প্লাগ-ইন বিল্ড করার সময় অ্যানোটেশন থেকে নিয়ম রাখার বিষয়টি জেনারেট করে।
আপনার অ্যাপে কীভাবে রাখার নিয়ম যোগ করবেন
আপনার ব্যবহার করা AGP-এর ভার্সনের উপর নির্ভর করে আপনার কিপ রুল কনফিগারেশন।
বড় অ্যাপে সাধারণত একাধিক লাইব্রেরি মডিউলে কোড থাকে। এই ধরনের ক্ষেত্রে,
নির্দিষ্ট লাইব্রেরি মডিউলের মধ্যে যে কোডের উপর নিয়ম প্রয়োগ করা হয়, তার সাথে রাখার নিয়ম যোগ করা
প্রায়শই ভাল হয়। লাইব্রেরির জন্য কীপ নিয়ম বজায় রাখার ক্ষেত্রে
গুরুত্বপূর্ণ পার্থক্য হল, আপনার লাইব্রেরি মডিউলের
build.gradle.kts (বা build.gradle) ফাইলের মধ্যে কীভাবে এই নিয়ম ঘোষণা করেন। আরও জানতে লাইব্রেরি লেখকদের জন্য
অপ্টিমাইজেশন দেখুন।
AGP ভার্সন 9.3 এবং তার পরবর্তী যেকোনও ভার্সনের জন্য
.keep সাফিক্স সহ ফাইলটি
src/<variant>/keepRules ডিরেক্টরিতে যোগ করুন। যেমন,
src/main/keepRules/custom-rules.keep. মনে রাখবেন, AGP 9.3 ও তার পরবর্তী ভার্সনের জন্য আপডেট করা DSL ব্যবহার করলে, কোড ও রিসোর্স অপ্টিমাইজেশন, দুটিই চালু হয় এবং আপনাকে স্পষ্টভাবে ডিফল্ট Android-এর নিয়ম ফাইল (proguard-android-optimize.txt) রাখার কথা উল্লেখ করতে হয় না, কারণ স্পষ্টভাবে বাদ না দিলে, এটি ডিফল্ট হিসেবে অন্তর্ভুক্ত থাকে।
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
গ্ৰুভি
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
ডিফল্ট Android প্ল্যাটফর্মের কীপ সংক্রান্ত নিয়ম বাদ দিন (উন্নত)
AGP ডিফল্ট Android প্ল্যাটফর্মের নিয়মের একটি সেট প্রদান করে। আপনার প্রজেক্টের কনফিগারেশন থেকে
এইসব নিয়ম বাদ দিতে এবং সবকটি 'কিপ' নিয়ম নিজে ম্যানেজ করতে, optimization.keepRules.includeDefault-এর মান false হিসেবে সেট করুন।
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
গ্ৰুভি
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
৯.৩-এর থেকে পুরনো AGP ভার্সনের জন্য লিগ্যাসি DSL
অ্যাপ মডিউলের রুট
ডিরেক্টরিতে থাকা proguard-rules.pro ফাইলে আপনার নিয়ম যোগ করুন—ফাইলটি হয়ত আগেই আছে, কিন্তু না থাকলে, এটি তৈরি করুন। ফাইলে নিয়ম প্রয়োগ করতে, আপনাকে অবশ্যই আপনার মডিউল-লেভেল
build.gradle.kts (বা build.gradle) ফাইলে ফাইলটি ঘোষণা করতে হবে।
ডিফল্ট হিসেবে, আপনার বিল্ড ফাইলে proguard-android-optimize.txt
ফাইলও অন্তর্ভুক্ত থাকে। এই ফাইলে এমন নিয়ম আছে যা বেশিরভাগ Android প্রোজেক্টের জন্য প্রয়োজন, তাই
আপনার উচিত এটি বিল্ড ফাইলে রেখে দেওয়া। এই ফাইলটি proguard-common.txt ফাইলের উপর ভিত্তি করে তৈরি এবং
এটির সাথে কন্টেন্ট শেয়ার করে।
পুরনো DSL (Kotlin)
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
// Default file with default optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
}
}
}
পুরনো DSL (Groovy)
android {
buildTypes {
release {
minifyEnabled = true
shrinkResources = true
// Default file with default optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
রাখার নিয়ম যোগ করুন
আপনি যখন 'কীপ' নিয়ম যোগ করেন, তখন আপনি গ্লোবাল বিকল্প অন্তর্ভুক্ত করতে পারেন এবং নিজের কীপ নিয়মও নির্ধারণ করতে পারেন।
গ্লোবাল বিকল্প: গ্লোবাল বিকল্প হল সাধারণ নির্দেশিকা যা আপনার সম্পূর্ণ কোডবেসে R8 কীভাবে কাজ করে তা প্রভাবিত করে। আরও জানতে, গ্লোবাল বিকল্প দেখুন।
কিপ রুল: কিপ রুল খুব সাবধানে ডিজাইন করতে হবে, যাতে আপনি অ্যাপের কোনও ক্ষতি না করেই কোড অপ্টিমাইজেশনের সঠিক ভারসাম্য বজায় রাখতে পারেন। কিপ রুল কীভাবে লিখতে হয় তা জানতে, কিপ রুল যোগ করুন বিকল্প দেখুন।
লাইব্রেরি লেখকদের জন্য নিয়ম মেনে চলুন
কিপ রুলের গ্লোবাল বিকল্প ও সিনট্যাক্স সম্পর্কে জানার পরে, আরও বিবরণের জন্য লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।