ThreeTenABP হল Android এর জন্য একটি অ্যাডাপ্টার লাইব্রেরি যা Android 8 (API < 26) এর নীচে ডিভাইসগুলিতে java.time API (org.threeten.bp প্যাকেজ) প্রদান করে। Jake Wharton (GitHub, 2023) এর স্পেসিফিকেশন অনুযায়ী, লাইব্রেরিটি ThreeTen-Backport প্রকল্পের উপর একটি র্যাপার, যা রিসোর্স অপ্টিমাইজেশন এবং AssetManager এর মাধ্যমে tzdata সমর্থন সহ Android এর জন্য অভিযোজিত।
মূল বিষয়
ThreeTenABP (ThreeTen Android Backport) হল Jake Wharton দ্বারা তৈরি একটি লাইব্রেরি যা পুরানো Android সংস্করণে Java 8 এর তারিখ/সময় API ব্যবহারের অনুমতি দেয়। এটি ThreeTen-Backport প্রকল্পের জন্য একটি অ্যাডাপ্টার, যা java.time (JSR-310) কে Java 7 এবং Android API < 26 এ পোর্ট করে।
লাইব্রেরিটি যে প্রধান সমস্যার সমাধান করে: Android সংস্করণ 8 (API 26) এর আগে java.time স্ট্যান্ডার্ড ডিস্ট্রিবিউশনে অন্তর্ভুক্ত ছিল না। ডেভেলপাররা java.util.Date/Calendar ব্যবহার করতে বা Joda-Time যোগ করতে বাধ্য ছিলেন। ThreeTenABP বিল্ট-ইন java.time এর মতো একই আধুনিক API প্রদান করে, কিন্তু org.threeten.bp প্যাকেজের মাধ্যমে।
GitHub রিপোজিটরি (2023) অনুযায়ী, লাইব্রেরিটি Android এর জন্য অপ্টিমাইজড: tzdata (IANA Time Zone Database) assets এ সংরক্ষিত এবং ডেস্কটপের মতো classpath এর পরিবর্তে AssetManager এর মাধ্যমে লোড করা হয়। এটি APK সাইজ কমায় এবং লোডিং গতি বাড়ায়।
সর্বশেষ স্থিতিশীল সংস্করণ 1.4.0 (আগস্ট 2021)। লাইব্রেরিটি রক্ষণাবেক্ষণ মোডে রয়েছে, কারণ desugaring এর ব্যাপক গ্রহণের সাথে এর প্রয়োজনীয়তা হ্রাস পাচ্ছে, তবে এটি ন্যূনতম API < 25 সহ প্রকল্পগুলির জন্য প্রাসঙ্গিক রয়ে গেছে।
Java 8 (2014) এ java.time চালু হওয়ার আগে, ডেভেলপাররা java.util.Date এবং java.util.Calendar ব্যবহার করত। এই ক্লাসগুলির গুরুতর ত্রুটি রয়েছে: Date পরিবর্তনশীল, Calendar অ-স্বজ্ঞাত কনস্ট্যান্ট ব্যবহার করে (Calendar.JANUARY = 0), উভয় ক্লাসই থ্রেড-সেফ নয় এবং সময় অঞ্চল নিয়ে কাজ করার সময় ত্রুটির প্রবণ।
Joda-Time Java 8 এর আগে ডি ফ্যাক্টো স্ট্যান্ডার্ড ছিল, কিন্তু এর নির্মাতা Stephen Colebourne Joda-Time এর অভিজ্ঞতা এবং এর ত্রুটিগুলি সমাধানের ভিত্তিতে java.time কে অফিসিয়াল প্রতিস্থাপন হিসাবে ডিজাইন করেছিলেন। java.time প্যাকেজ JDK 8 এ অন্তর্ভুক্ত ছিল, কিন্তু Android API 26 পর্যন্ত এটি পায়নি।
ThreeTen-Backport হল java.time এর Java 7 এ একটি পোর্ট, একই লেখক (Stephen Colebourne) দ্বারা তৈরি। এতে সমস্ত প্রধান ক্লাস অন্তর্ভুক্ত: LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant, Duration, Period, DateTimeFormatter। ThreeTenABP এই পোর্টটিকে Android এর জন্য অভিযোজিত করে, AssetsManager এর মাধ্যমে ইনিশিয়ালাইজেশন এবং মোবাইল ডিভাইসের জন্য অপ্টিমাইজেশন যোগ করে।
সুতরাং, ThreeTenABP আপনাকে Android 4.0+ (API 14+) ডিভাইসে OS আপডেটের অপেক্ষা না করে আধুনিক তারিখ/সময় API ব্যবহারের অনুমতি দেয়।
যোগ করা দুটি ধাপে সম্পন্ন হয়: build.gradle (অ্যাপ-লেভেল) এ নির্ভরতা যোগ করা এবং Application ক্লাসে ইনিশিয়ালাইজ করা। গুরুত্বপূর্ণ: ThreeTenABP এর জন্য কমপক্ষে 21 এর compileSdk এবং কমপক্ষে 4.0 এর Gradle সংস্করণ প্রয়োজন।
নির্ভরতা ডিপেন্ডেন্সিজ বিভাগে যোগ করা হয়: implementation "com.jakewharton.threetenabp:threetenabp:1.4.0"। 1.4.0 রিলিজের পর থেকে, লাইব্রেরিটি আপডেট করা হয়নি, কারণ এটি স্থিতিশীল এবং সমস্ত প্রয়োজনীয় কেস কভার করে।
অফিসিয়াল ডকুমেন্টেশন অনুযায়ী, লাইব্রেরিতে assets এ tzdata অন্তর্ভুক্ত। যদি অ্যাপে আগে থেকে অন্য ফাইল সহ assets ফোল্ডার থাকে, তাহলে ThreeTenABP তাদের সাথে সঠিকভাবে সহাবস্থান করে। tzdata এর সাইজ কমপ্রেসড অবস্থায় প্রায় 200 KB।
// build.gradle (অ্যাপ-লেভেল)
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
implementation "com.jakewharton.threetenabp:threetenabp:1.4.0"
}
org.threeten.bp থেকে কোনো ক্লাস ব্যবহারের আগে, লাইব্রেরিটি ইনিশিয়ালাইজ করা আবশ্যক। ইনিশিয়ালাইজেশন Application.onCreate() এ AndroidThreeTen.init(this) কল করে একবার সম্পন্ন হয়।
ইনিশিয়ালাইজেশন assets থেকে tzdata ডেটা লোড করে এবং সিস্টেম ক্লক কনফিগার করে। init() কল না করলে, now() মেথডগুলি IllegalStateException থ্রো করবে যে লাইব্রেরিটি ইনিশিয়ালাইজ করা হয়নি।
পরীক্ষার জন্য, আপনি AndroidThreeTen.init(applicationContext, zoneId) ব্যবহার করতে পারেন — স্পষ্ট সময় অঞ্চল নির্দেশ সহ একটি ওভারলোড। এটি পরীক্ষায় পূর্বানুমানযোগ্য আচরণের জন্য উপযোগী। যদি tzdata ছাড়া শুধুমাত্র বেসিক ইনিশিয়ালাইজেশন প্রয়োজন হয়, AndroidThreeTen.initWithoutFiles(context) ব্যবহার করুন।
class App : Application() {
override fun onCreate() {
super.onCreate()
AndroidThreeTen.init(this)
}
}
// ইনিশিয়ালাইজেশনের পরে ব্যবহার
val today = LocalDate.now()
val now = LocalDateTime.now()
ThreeTenABP java.time এর সমস্ত প্রধান ক্লাস org.threeten.bp প্যাকেজে প্রদান করে। API মূল java.time এর সাথে প্রায় অভিন্ন, যা API 26+ এ স্থানান্তর সহজ করে।
প্রধান ক্লাস:
সহায়ক ক্লাসগুলিও সমর্থিত: Clock, DayOfWeek, Month, Year, YearMonth, MonthDay। সময় অঞ্চলগুলি লাইব্রেরির সাথে বান্ডেল করা হয় (IANA tzdata)। ThreeTenABP 1.4.0 এ tzdata সংস্করণ 2021a এর সাথে মিলে।
Android Gradle Plugin 4.0 (2020) এবং desugar_jdk_libs থেকে শুরু করে, ডেভেলপাররা coreLibraryDesugaring এর মাধ্যমে Android এর সকল সংস্করণে java.time ব্যবহারের ক্ষমতা পেয়েছে। Desugaring বাইটকোড রূপান্তর করে যাতে java.time কলগুলি অতিরিক্ত লাইব্রেরি ছাড়া পুরানো API তে কাজ করে।
Desugaring এর সুবিধা: মূল java.time প্যাকেজ ব্যবহার করে (org.threeten.bp নয়), কোনো ইনিশিয়ালাইজেশন প্রয়োজন নেই, Android Studio এর সাথে সম্পূর্ণ একীকরণ। অসুবিধা: AGP 4.0+ প্রয়োজন, বিল্ড সময় বাড়ায়, APK সাইজ 2-3 MB বাড়তে পারে।
ThreeTenABP লিগ্যাসি প্রকল্পগুলির জন্য সর্বোত্তম পছন্দ হিসাবে রয়ে গেছে যারা AGP 4.0+ এ আপডেট করতে পারে না, অথবা যেখানে APK সাইজ গুরুত্বপূর্ণ। ThreeTenABP সেটআপ করাও সহজ — মাত্র একটি নির্ভরতা এবং ইনিশিয়ালাইজেশনের একটি লাইন। Stack Overflow (2024) অনুযায়ী, minSdk < 25 সহ প্রায় 30% প্রকল্প এখনও desugaring এর পরিবর্তে ThreeTenABP ব্যবহার করে।
প্রথম উদাহরণ ThreeTenABP ব্যবহার করে তারিখ নিয়ে কাজ প্রদর্শন করে। API java.time এর মতো, কিন্তু ইম্পোর্ট org.threeten.bp থেকে আসে। এটি আপনাকে এমন কোড লিখতে দেয় যা স্থানান্তরের পরে শুধুমাত্র ইম্পোর্ট প্রতিস্থাপন প্রয়োজন।
import org.threeten.bp.LocalDate
import org.threeten.bp.LocalTime
import org.threeten.bp.Duration
fun isWeekend(date: LocalDate): Boolean {
val dayOfWeek = date.getDayOfWeek()
return dayOfWeek == DayOfWeek.SATURDAY ||
dayOfWeek == DayOfWeek.SUNDAY
}
fun timeBetween(
start: LocalTime, end: LocalTime
): Duration {
return Duration.between(start, end)
}
দ্বিতীয় উদাহরণ তারিখ ফরম্যাটিং দেখায়। org.threeten.bp থেকে DateTimeFormatter java.time এর মতোই কাজ করে।
import org.threeten.bp.LocalDateTime
import org.threeten.bp.format.DateTimeFormatter
fun formatTimestamp(dateTime: LocalDateTime): String {
val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
return dateTime.format(formatter)
}
তৃতীয় উদাহরণ ThreeTenABP এ ZonedDateTime নিয়ে কাজ এবং সময় অঞ্চলের মধ্যে রূপান্তর প্রদর্শন করে।
import org.threeten.bp.ZonedDateTime
import org.threeten.bp.ZoneId
fun convertTimeZone(
time: ZonedDateTime,
targetZone: ZoneId
): ZonedDateTime {
return time.withZoneSameInstant(targetZone)
}
minSdk 26 এ বাড়ানোর সময়, আপনি ThreeTenABP বাদ দিয়ে বিল্ট-ইন java.time এ সুইচ করতে পারেন। স্থানান্তর প্রক্রিয়ায় বেশ কয়েকটি ধাপ অন্তর্ভুক্ত এবং পুঙ্খানুপুঙ্খ পরীক্ষার প্রয়োজন।
প্রথম ধাপ হল ইম্পোর্ট প্রতিস্থাপন। org.threeten.bp থেকে ইম্পোর্ট java.time এ পরিবর্তন করা হয়। বেশিরভাগ ক্ষেত্রে, ক্লাসের নাম মিলে: LocalDate → java.time.LocalDate, ZonedDateTime → java.time.ZonedDateTime। ব্যতিক্রম হল DateTimeFormatter — ThreeTenABP এ এটি org.threeten.bp.format এ, java.time এ এটি java.time.format এ।
দ্বিতীয় ধাপ হল ইনিশিয়ালাইজেশন সরানো। লাইন AndroidThreeTen.init(this) আর প্রয়োজন নেই, কারণ java.time Android SDK তে বিল্ট-ইন। Application.onCreate() থেকে কল এবং build.gradle থেকে নির্ভরতা সরান।
তৃতীয় ধাপ হল desugaring দিয়ে নির্ভরতা প্রতিস্থাপন, যদি minSdk 26 এর নিচে থাকে। compileOptions এ isCoreLibraryDesugaringEnabled = true এবং desugar_jdk_libs নির্ভরতা যোগ করুন। এটি ThreeTenABP ছাড়া পুরানো API তে java.time এর কাজ নিশ্চিত করবে। Google I/O (2023) অনুযায়ী, desugaring নতুন প্রকল্পের জন্য পছন্দের পদ্ধতি।
// build.gradle — ThreeTenABP কে desugaring দিয়ে প্রতিস্থাপন
android {
compileOptions {
isCoreLibraryDesugaringEnabled = true
}
}
dependencies {
// সরান: implementation "com.jakewharton.threetenabp:threetenabp:1.4.0"
// যোগ করুন:
"coreLibraryDesugaring"("com.android.tools:desugar_jdk_libs:2.1.4")
}
// Application থেকে AndroidThreeTen.init(this) সরান
প্রায়শই জিজ্ঞাসিত প্রশ্ন
প্রযুক্তিগতভাবে — হ্যাঁ, কিন্তু এর কোনো মানে হয় না। যদি desugaring ব্যবহার করা হয়, বিল্ট-ইন java.time ইতিমধ্যে উপলব্ধ। উভয় লাইব্রেরি ব্যবহার করলে কোড ডুপ্লিকেশন এবং APK সাইজ বৃদ্ধি পাবে। আপনার প্রকল্পের জন্য একটি পদ্ধতি বেছে নিন।
ইনিশিয়ালাইজেশন IANA Time Zone Database কে assets থেকে মেমরিতে লোড করে। স্ট্যান্ডার্ড JDK তে, tzdata classpath এর মাধ্যমে উপলব্ধ, কিন্তু Android AssetManager ব্যবহার করে। init() মেথড ডেটা সিস্টেম ডিরেক্টরিতে কপি করে, এটি ZoneId এর জন্য উপলব্ধ করে।
ThreeTenABP API 14+ (Android 4.0 Ice Cream Sandwich এবং উপরে) সমর্থন করে। Java 8 সামঞ্জস্য প্রয়োজন (compileOptions এ sourceCompatibility এবং targetCompatibility)। API 26+ এ, লাইব্রেরির প্রয়োজন নেই — বিল্ট-ইন java.time ব্যবহার করুন।
সময় অঞ্চলগুলি লাইব্রেরির সাথে বান্ডেল করা হয়। সংস্করণ 1.4.0 এ tzdata 2021a অন্তর্ভুক্ত। আপডেট করতে, আপনাকে ThreeTenABP সংস্করণ আপডেট করতে হবে বা assets এ ম্যানুয়ালি tzdata প্রতিস্থাপন করতে হবে। tzdata এর সর্বশেষ সংস্করণ IANA রিপোজিটরি বা ThreeTen-Backport থেকে পাওয়া যেতে পারে।
ইউনিট পরীক্ষার জন্য, স্পষ্ট অঞ্চল নির্দেশ সহ AndroidThreeTen.init(context, zoneId) ব্যবহার করুন। Robolectric পরীক্ষার জন্য — AndroidThreeTen.init(ApplicationProvider.getApplicationContext())। Android ছাড়া বিশুদ্ধ JVM পরীক্ষার জন্য — ThreeTenABP ছাড়া সরাসরি ThreeTen-Backport ব্যবহার করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন