নিয়ম রাখা সম্পর্কে

আপনি যখন ডিফল্ট সেটিংস সহ অ্যাপ অপ্টিমাইজেশন চালু করেন , তখন R8 আপনার পারফরম্যান্সের সুবিধা সর্বাধিক করার জন্য ব্যাপক অপ্টিমাইজেশন করে থাকে। R8 কোডে উল্লেখযোগ্য পরিবর্তন করে, যার মধ্যে ক্লাস, ফিল্ড এবং মেথডের নাম পরিবর্তন, স্থানান্তর এবং অপসারণ অন্তর্ভুক্ত। যদি আপনি লক্ষ্য করেন যে এই পরিবর্তনগুলির কারণে ত্রুটি হচ্ছে, তাহলে আপনাকে 'keep rules'-এর মধ্যে কোডের কোন অংশগুলি ঘোষণা করে নির্দিষ্ট করে দিতে হবে যে R8 সেগুলি পরিবর্তন করবে না

সাধারণ পরিস্থিতি যেখানে নিয়ম বজায় রাখা প্রয়োজন

R8 আপনার কোডের সমস্ত সরাসরি কল শনাক্ত করে এবং সংরক্ষণ করে। তবে, R8 পরোক্ষ কোড ব্যবহার দেখতে পায় না, যার ফলে এটি আপনার অ্যাপের প্রয়োজনীয় কোড মুছে ফেলতে পারে এবং অ্যাপ ক্র্যাশ করতে পারে। এই ধরনের পরোক্ষভাবে ব্যবহৃত কোড সংরক্ষণ করার জন্য R8-কে নির্দেশ দিতে 'keep rules' ব্যবহার করুন। কয়েকটি সাধারণ পরিস্থিতি যেখানে আপনার 'keep rules'-এর প্রয়োজন হতে পারে, তা নিচে দেওয়া হলো:

  • রিফ্লেকশনের মাধ্যমে অ্যাক্সেস করা কোড: রিফ্লেকশনের মাধ্যমে কখন ক্লাস, ফিল্ড বা মেথড অ্যাক্সেস করা হচ্ছে, তা R8 শনাক্ত করতে পারে না। উদাহরণস্বরূপ, Class.getDeclaredMethod() ব্যবহার করে নাম দিয়ে খোঁজা কোনো মেথড অথবা Class.getAnnotation() দিয়ে পাওয়া কোনো অ্যানোটেশন R8 শনাক্ত করতে পারে না। এইসব ক্ষেত্রে, R8 এই মেথড ও অ্যানোটেশনগুলোর নাম পরিবর্তন করে দিতে পারে অথবা সেগুলোকে পুরোপুরি মুছে ফেলতে পারে, যার ফলে রানটাইমে একটি ClassNotFoundException বা একটি NoSuchMethodException দেখা দিতে পারে।
  • জাভা নেটিভ ইন্টারফেস (JNI) থেকে কল করা কোড: যখন নেটিভ (C বা C++) কোড কোনো জাভা বা কোটলিন মেথডকে কল করে, অথবা জাভা বা কোটলিন কোড JNI ব্যবহার করে C++ কোডকে কল করে, তখন সেই কলটি মেথডের নামের একটি ডাইনামিক স্ট্রিং লুকআপের উপর ভিত্তি করে করা হয়। R8 এই ডাইনামিক স্ট্রিং-ভিত্তিক মেথড কলটি দেখতে পায় না, এবং তাই এর অপটিমাইজেশন আপনার কোডকে নষ্ট করে দিতে পারে।

এটি এমন সব পরিস্থিতির একটি সম্পূর্ণ তালিকা নয় যেখানে কিপ রুলস প্রয়োজন হয়, তবে এই পরিস্থিতিগুলো এমন বেশিরভাগ ক্ষেত্রকে অন্তর্ভুক্ত করে যেখানে আপনার কিপ রুলস দরকার হতে পারে।

আপনার অ্যাপে কিপ নিয়ম কীভাবে যোগ করবেন

আপনার কিপ রুলস কনফিগারেশন নির্ভর করে আপনি AGP-এর কোন সংস্করণ ব্যবহার করছেন তার উপর।

বড় অ্যাপগুলিতে সাধারণত একাধিক লাইব্রেরি মডিউলে কোড থাকে। এই ধরনের ক্ষেত্রে, নির্দিষ্ট লাইব্রেরি মডিউলের মধ্যে যে কোডের উপর কিপ রুলগুলো প্রযোজ্য, সেগুলোর পাশেই সেগুলোকে রাখা প্রায়শই শ্রেয়। লাইব্রেরির জন্য কিপ রুল রক্ষণাবেক্ষণের ক্ষেত্রে মূল পার্থক্যটি হলো, আপনি আপনার লাইব্রেরি মডিউলের build.gradle.kts (বা build.gradle ) ফাইলে এই রুলগুলো কীভাবে ঘোষণা করেন। আরও জানতে লাইব্রেরি লেখকদের জন্য অপটিমাইজেশন (Optimization for library authors) দেখুন।

AGP সংস্করণ 9.3 এবং তার উচ্চতর সংস্করণের জন্য

আপনার নিয়মগুলো src/<variant>/keepRules ডিরেক্টরিতে .keep সাফিক্স সহ একটি ফাইলে যোগ করুন। উদাহরণস্বরূপ, src/main/keepRules/custom-rules.keep । মনে রাখবেন যে, AGP 9.3 এবং তার উচ্চতর সংস্করণের জন্য আপডেট করা DSL ব্যবহার করলে কোড এবং রিসোর্স উভয় অপটিমাইজেশনই সক্রিয় হয়, এবং এর জন্য আপনাকে ডিফল্ট অ্যান্ড্রয়েড কিপ রুলস ফাইল ( proguard-android-optimize.txt ) স্পষ্টভাবে সংজ্ঞায়িত করার প্রয়োজন হয় না , কারণ এটি ডিফল্টরূপে অন্তর্ভুক্ত থাকে, যদি না স্পষ্টভাবে বাদ দেওয়া হয়।

কোটলিন

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

গ্রুভি

android {
    buildTypes {
        release {
            optimization {
                enable = true // Enables code and resource optimizations.
            }
        }
    }
}

ডিফল্ট অ্যান্ড্রয়েড প্ল্যাটফর্মের রাখার নিয়মগুলি বাদ দিন (উন্নত)

AGP কিছু ডিফল্ট অ্যান্ড্রয়েড প্ল্যাটফর্ম রুল প্রদান করে। আপনার প্রোজেক্টের কনফিগারেশন থেকে এই রুলগুলো বাদ দিতে এবং সমস্ত কিপ রুল নিজে পরিচালনা করতে, optimization.keepRules.includeDefault কে 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.
                }
            }
        }
    }
}

গ্রুভি

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 9.3-এর চেয়ে নিম্ন সংস্করণগুলির জন্য লিগ্যাসি ডিএসএল

আপনার নিয়মগুলো অ্যাপ মডিউলের রুট ডিরেক্টরিতে অবস্থিত একটি proguard-rules.pro ফাইলে যোগ করুন—ফাইলটি হয়তো আগে থেকেই সেখানে থাকতে পারে, কিন্তু যদি না থাকে, তবে এটি তৈরি করুন। ফাইলের নিয়মগুলো প্রয়োগ করার জন্য, আপনাকে অবশ্যই আপনার মডিউল-স্তরের build.gradle.kts (বা build.gradle ) ফাইলে ফাইলটি ডিক্লেয়ার করতে হবে।

ডিফল্টরূপে, আপনার বিল্ড ফাইলে proguard-android-optimize.txt ফাইলটিও অন্তর্ভুক্ত থাকে। এই ফাইলে এমন কিছু নিয়ম রয়েছে যা বেশিরভাগ অ্যান্ড্রয়েড প্রোজেক্টের জন্য প্রয়োজনীয়, তাই এটিকে বিল্ড ফাইলে রেখে দেওয়া উচিত। এই ফাইলটি proguard-common.txt ফাইলের উপর ভিত্তি করে তৈরি এবং এর সাথে এর বিষয়বস্তুও মিলে যায়।

লিগ্যাসি ডিএসএল (কোটলিন)

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true

            proguardFiles(
                // Default file with default optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),
                ...
            )
        }
    }
}

লিগ্যাসি ডিএসএল (গ্রুভি)

android {
    buildTypes {
        release {
            minifyEnabled = true
            shrinkResources = true

            // Default file with default optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
            ...
        }
    }
}

একটি রাখার নিয়ম যোগ করুন

যখন আপনি কিপ রুল যোগ করেন, তখন আপনি গ্লোবাল অপশন অন্তর্ভুক্ত করার পাশাপাশি আপনার নিজস্ব কিপ রুলও নির্ধারণ করতে পারেন।

  • গ্লোবাল অপশন : গ্লোবাল অপশন হলো সাধারণ নির্দেশাবলী যা আপনার সম্পূর্ণ কোডবেসে R8 কীভাবে কাজ করবে তা প্রভাবিত করে। আরও জানতে, গ্লোবাল অপশন দেখুন।

  • কিপ রুলস : কিপ রুলস সতর্কতার সাথে ডিজাইন করা প্রয়োজন, যাতে আপনি অনিচ্ছাকৃতভাবে আপনার অ্যাপটি ভেঙে না ফেলে কোড অপটিমাইজেশনকে সর্বোচ্চ করার মধ্যে সঠিক ভারসাম্য বজায় রাখতে পারেন। কিভাবে কিপ রুলস লিখতে হয় তা জানতে, ‘কিপ রুলস যোগ করুন’ দেখুন।

গ্রন্থাগার লেখকদের জন্য নিয়মকানুন রাখুন

কিপ রুলস-এর গ্লোবাল অপশন ও সিনট্যাক্স সম্পর্কে জানার পর, আরও বিস্তারিত তথ্যের জন্য লাইব্রেরি লেখকদের জন্য অপটিমাইজেশন (Optimization for library authors) দেখুন।