একজন লাইব্রেরি লেখক হিসাবে, আপনাকে নিশ্চিত করতে হবে যে অ্যাপ বিকাশকারীরা একটি উচ্চ মানের শেষ ব্যবহারকারীর অভিজ্ঞতা বজায় রেখে সহজেই তাদের অ্যাপে আপনার লাইব্রেরি অন্তর্ভুক্ত করতে পারে। আপনার নিশ্চিত করা উচিত যে আপনার লাইব্রেরি অতিরিক্ত সেটআপ ছাড়াই Android অপ্টিমাইজেশানের সাথে সামঞ্জস্যপূর্ণ—অথবা নথি যে লাইব্রেরিটি Android-এ ব্যবহারের জন্য অনুপযুক্ত হতে পারে।
এই ডকুমেন্টেশনটি প্রকাশিত লাইব্রেরির ডেভেলপারদের লক্ষ্য করা হয়েছে, তবে একটি বড়, মডুলারাইজড অ্যাপে অভ্যন্তরীণ লাইব্রেরি মডিউলগুলির বিকাশকারীদের জন্যও এটি কার্যকর হতে পারে৷
আপনি যদি একজন অ্যাপ ডেভেলপার হন এবং আপনার অ্যান্ড্রয়েড অ্যাপ অপ্টিমাইজ করার বিষয়ে জানতে চান, অ্যাপ অপ্টিমাইজেশন সক্ষম করুন দেখুন। কোন লাইব্রেরি ব্যবহার করা উপযুক্ত সে সম্পর্কে জানতে, বুদ্ধিমানের সাথে লাইব্রেরি চয়ন করুন দেখুন।
প্রতিফলনের উপর কোডজেন ব্যবহার করুন
যখন সম্ভব, প্রতিফলনের উপর কোড জেনারেশন ( কোডজেন ) ব্যবহার করুন। প্রোগ্রামিং করার সময় বয়লারপ্লেট কোড এড়ানোর জন্য কোডজেন এবং প্রতিফলন উভয়ই সাধারণ পদ্ধতি, কিন্তু কোডজেন R8 এর মতো অ্যাপ অপ্টিমাইজারের সাথে আরও সামঞ্জস্যপূর্ণ:
- কোডজেনের সাথে, বিল্ড প্রক্রিয়া চলাকালীন কোড বিশ্লেষণ এবং সংশোধন করা হয়। যেহেতু কম্পাইল সময়ের পরে কোন বড় পরিবর্তন নেই, অপ্টিমাইজার জানে শেষ পর্যন্ত কোন কোডের প্রয়োজন এবং কোনটি নিরাপদে সরানো যেতে পারে।
- প্রতিফলনের সাথে, কোড বিশ্লেষণ করা হয় এবং রানটাইমে ম্যানিপুলেট করা হয়। যেহেতু কোডটি কার্যকর না হওয়া পর্যন্ত এটি সত্যিই চূড়ান্ত হয় না, অপ্টিমাইজার জানে না কোন কোডটি নিরাপদে সরানো যেতে পারে। এটি সম্ভবত রানটাইমের সময় প্রতিফলনের মাধ্যমে গতিশীলভাবে ব্যবহৃত কোডগুলি সরিয়ে ফেলবে, যা ব্যবহারকারীদের জন্য অ্যাপ ক্র্যাশের কারণ হয়।
অনেক আধুনিক লাইব্রেরি প্রতিফলনের পরিবর্তে কোডজেন ব্যবহার করে। একটি সাধারণ এন্ট্রিপয়েন্টের জন্য KSP দেখুন, Room , Dagger2 এবং আরও অনেকের দ্বারা ব্যবহৃত।
যখন প্রতিফলন ঠিক আছে
আপনি যদি প্রতিফলন ব্যবহার করতে চান তবে আপনাকে শুধুমাত্র নিম্নলিখিতগুলির মধ্যে প্রতিফলিত করা উচিত:
- নির্দিষ্ট লক্ষ্যযুক্ত প্রকার (নির্দিষ্ট ইন্টারফেস বাস্তবায়নকারী বা উপশ্রেণী)
- একটি নির্দিষ্ট রানটাইম টীকা ব্যবহার করে কোড
এইভাবে প্রতিফলন ব্যবহার করা রানটাইম খরচ সীমিত করে, এবং লক্ষ্যযুক্ত ভোক্তা রাখার নিয়ম লিখতে সক্ষম করে।
প্রতিফলনের এই নির্দিষ্ট এবং লক্ষ্যযুক্ত ফর্মটি হল একটি প্যাটার্ন যা আপনি অ্যান্ড্রয়েড ফ্রেমওয়ার্ক (উদাহরণস্বরূপ ক্রিয়াকলাপ, দৃশ্য, এবং অঙ্কনযোগ্যগুলি বৃদ্ধি করার সময়) এবং অ্যান্ড্রয়েডএক্স লাইব্রেরি (উদাহরণস্বরূপ WorkManager ListenableWorkers, বা রুমডেটাবেস নির্মাণ করার সময়) উভয় জুড়েই দেখতে পারেন। বিপরীতে, Gson-এর ওপেন এন্ডেড প্রতিফলন Android অ্যাপে ব্যবহারের জন্য উপযুক্ত নয় ।
ভোক্তা রাখার নিয়ম লিখুন
লাইব্রেরিগুলিকে "ভোক্তা" রাখার নিয়মগুলি প্যাকেজ করা উচিত, যা অ্যাপ রাখার নিয়মগুলির মতো একই বিন্যাস ব্যবহার করে। এই নিয়মগুলি লাইব্রেরি আর্টিফ্যাক্টগুলিতে (AARs বা JARs) একত্রিত করা হয় এবং যখন লাইব্রেরি ব্যবহার করা হয় তখন অ্যান্ড্রয়েড অ্যাপ অপ্টিমাইজেশানের সময় স্বয়ংক্রিয়ভাবে ব্যবহার হয়ে যায়।
AAR লাইব্রেরি
একটি AAR লাইব্রেরির জন্য ভোক্তা নিয়ম যোগ করতে, Android লাইব্রেরি মডিউলের বিল্ড স্ক্রিপ্টে consumerProguardFiles
বিকল্পটি ব্যবহার করুন। আরও তথ্যের জন্য, লাইব্রেরি মডিউল তৈরির বিষয়ে আমাদের নির্দেশিকা দেখুন।
কোটলিন
android { defaultConfig { consumerProguardFiles("consumer-proguard-rules.pro") } ... }
গ্রোভি
android { defaultConfig { consumerProguardFiles 'consumer-proguard-rules.pro' } ... }
JAR লাইব্রেরি
আপনার কোটলিন/জাভা লাইব্রেরির সাথে নিয়মগুলি বান্ডিল করতে যা JAR হিসাবে পাঠানো হয়, আপনার নিয়ম ফাইলটি যেকোন ফাইলের নাম সহ চূড়ান্ত JAR-এর META-INF/proguard/
ডিরেক্টরিতে রাখুন৷ উদাহরণস্বরূপ যদি আপনার কোড <libraryroot>/src/main/kotlin
এ থাকে, তাহলে <libraryroot>/src/main/resources/META-INF/proguard/consumer-proguard-rules.pro
এ একটি ভোক্তা নিয়ম ফাইল রাখুন এবং নিয়মগুলি আপনার আউটপুট JAR-এ সঠিক অবস্থানে বান্ডিল করা হবে।
META-INF/proguard
ডিরেক্টরিতে নিয়মগুলি আছে কিনা তা পরীক্ষা করে নিশ্চিত করুন যে চূড়ান্ত JAR বান্ডেলগুলি সঠিকভাবে নিয়ম করেছে৷
AAR লাইব্রেরি বিল্ড অপ্টিমাইজ করুন (উন্নত)
সাধারণত, আপনার সরাসরি একটি লাইব্রেরি বিল্ড অপ্টিমাইজ করা উচিত নয় কারণ লাইব্রেরি তৈরির সময় সম্ভাব্য অপ্টিমাইজেশন খুব সীমিত। এটি শুধুমাত্র একটি অ্যাপ্লিকেশন তৈরির সময়, যখন একটি লাইব্রেরি একটি অ্যাপ্লিকেশনের অংশ হিসাবে অন্তর্ভুক্ত করা হয়, যে R8 জানতে পারে কিভাবে লাইব্রেরির সমস্ত পদ্ধতি ব্যবহার করা হয় এবং কোন প্যারামিটারগুলি পাস করা হয়। একজন লাইব্রেরি ডেভেলপার হিসাবে, আপনি সেই লাইব্রেরিটি অপ্টিমাইজ করার আগে আপনাকে অপ্টিমাইজেশানের একাধিক ধাপ সম্পর্কে যুক্তি দিতে হবে এবং লাইব্রেরি এবং অ্যাপ বিল্ড টাইম উভয় সময়েই আচরণ বজায় রাখতে হবে।
আপনি যদি এখনও বিল্ড টাইমে আপনার লাইব্রেরি অপ্টিমাইজ করতে চান তবে এটি Android Gradle Plugin দ্বারা সমর্থিত।
কোটলিন
android { buildTypes { release { isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } configureEach { consumerProguardFiles("consumer-rules.pro") } } }
গ্রোভি
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } configureEach { consumerProguardFiles "consumer-rules.pro" } } }
উল্লেখ্য যে proguardFiles
এর আচরণ consumerProguardFiles
থেকে খুব আলাদা:
-
proguardFiles
বিল্ড টাইমে ব্যবহার করা হয়, প্রায়ইgetDefaultProguardFile("proguard-android-optimize.txt")
এর সাথে, লাইব্রেরি তৈরির সময় আপনার লাইব্রেরির কোন অংশ রাখা উচিত তা নির্ধারণ করতে। সর্বনিম্ন, এটি আপনার সর্বজনীন API। - কনট্রাস্ট দ্বারা
consumerProguardFiles
আপনার লাইব্রেরি ব্যবহার করে এমন একটি অ্যাপ তৈরি করার সময় পরবর্তীতে কী অপ্টিমাইজেশান ঘটবে তা প্রভাবিত করতে লাইব্রেরিতে প্যাকেজ করা হয়।
উদাহরণস্বরূপ, যদি আপনার লাইব্রেরি অভ্যন্তরীণ ক্লাস তৈরি করতে প্রতিফলন ব্যবহার করে, তাহলে আপনাকে proguardFiles
এবং consumerProguardFiles
উভয় ক্ষেত্রেই রাখার নিয়মগুলি সংজ্ঞায়িত করতে হতে পারে।
আপনি যদি আপনার লাইব্রেরির বিল্ডে -repackageclasses
ব্যবহার করেন, তাহলে আপনার লাইব্রেরির প্যাকেজের ভিতরে একটি সাব-প্যাকেজে ক্লাস রিপ্যাকেজ করুন। উদাহরণস্বরূপ, -repackageclasses 'com.example.mylibrary.internal'
-repackageclasses 'internal'
ব্যবহার করুন।
বিভিন্ন সঙ্কুচিত সমর্থন (উন্নত)
আপনি নির্দিষ্ট সংকোচনকারী (R8 বা ProGuard) এবং সেইসাথে নির্দিষ্ট সঙ্কুচিত সংস্করণগুলির জন্য নিয়মগুলি তৈরি করতে পারেন। এটি আপনার লাইব্রেরীকে নতুন সঙ্কুচিত সংস্করণগুলি ব্যবহার করে এমন প্রকল্পগুলিতে সর্বোত্তমভাবে কাজ করতে সক্ষম করে, যেখানে বিদ্যমান নিয়মগুলি পুরানো সঙ্কুচিত সংস্করণগুলির সাথে প্রকল্পগুলিতে ব্যবহার করা চালিয়ে যাওয়ার অনুমতি দেয়৷
লক্ষ্যযুক্ত সঙ্কুচিত নিয়মগুলি নির্দিষ্ট করতে, আপনাকে সেগুলিকে একটি AAR বা JAR লাইব্রেরির ভিতরে নির্দিষ্ট স্থানে অন্তর্ভুক্ত করতে হবে, যেমন নীচে বর্ণিত হয়েছে।
In an AAR library:
consumer-proguard-rules.pro (legacy location)
classes.jar
└── META-INF
└── com.android.tools (targeted shrink rules location)
├── r8-from-<X>-upto-<Y>/<R8-rules-file>
└── proguard-from-<X>-upto-<Y>/<ProGuard-rules-file>
In a JAR library:
META-INF
├── proguard/<ProGuard-rules-file> (legacy location)
└── com.android.tools (targeted shrink rules location)
├── r8-from-<X>-upto-<Y>/<R8-rules-file>
└── proguard-from-<X>-upto-<Y>/<ProGuard-rules-file>
তার মানে লক্ষ্যযুক্ত সঙ্কুচিত নিয়মগুলি একটি JAR-এর META-INF/com.android.tools
ডিরেক্টরিতে বা একটি AAR-এর classes.jar
এর ভিতরে META-INF/com.android.tools
ডিরেক্টরিতে সংরক্ষণ করা হয়।
সেই ডিরেক্টরির অধীনে, r8-from-<X>-upto-<Y>
অথবা proguard-from-<X>-upto-<Y>
নামে একাধিক ডিরেক্টরি থাকতে পারে যা নির্দেশ করতে পারে যে কোন সংস্করণগুলির জন্য ডিরেক্টরির ভিতরের নিয়মগুলি সঙ্কুচিত হয়। মনে রাখবেন - from-<X>
এবং - upto-<Y>
অংশগুলি ঐচ্ছিক, <Y>
সংস্করণটি একচেটিয়া , এবং সংস্করণের রেঞ্জগুলি অবিচ্ছিন্ন হতে হবে৷
উদাহরণস্বরূপ, r8-upto-8.0.0, r8-from-8.0.0-upto-8.2.0
, এবং r8-from-8.2.0
লক্ষ্যযুক্ত সঙ্কুচিত নিয়মগুলির একটি বৈধ সেট তৈরি করে। r8-from-8.0.0-upto-8.2.0
ডিরেক্টরির অধীনে নিয়মগুলি R8 দ্বারা সংস্করণ 8.0.0 পর্যন্ত ব্যবহার করা হবে কিন্তু সংস্করণ 8.2.0 অন্তর্ভুক্ত নয় ।
সেই তথ্য দেওয়া, অ্যান্ড্রয়েড গ্রেডল প্লাগইন ম্যাচিং R8 ডিরেক্টরি থেকে নিয়ম নির্বাচন করে। যদি একটি লাইব্রেরি টার্গেটেড সঙ্কুচিত নিয়মগুলি নির্দিষ্ট না করে, তাহলে Android Gradle প্লাগইন লিগ্যাসি অবস্থানগুলি থেকে নিয়মগুলি নির্বাচন করবে (একটি AAR এর জন্য proguard.txt
বা META-INF/proguard/<ProGuard-rules-file>
একটি JAR এর জন্য)।