آشنایی با تازه های Jetpack — از صفر تا صد
جتپک اندروید یک مجموعه از کتابخانهها است که به منظور کمک به نوشتن سریع اپلیکیشنهای با کیفیت بالا و پشتیبانی از نسخههای قدیمیتر اندروید ارائه شده است. اکنون و سالها پس از معرفی Jetpack، شاهد استفاده گسترده از آن از سوی اپلیکیشنهای مختلف هستیم. از تیمهای بزرگ توسعهدهندگان تا آنهایی که به تازگی برنامهنویسی اندروید را آغاز کردهاند از جتپک استفاده میکنند. امروزه شاهد معرفی کتابخانههای جدیدی از سوی جتپک هستیم و بهروزرسانیهای عمدهای روی کتابخانههای موجود ارائه میشود. در این مطلب با تازه های Jetpack آشنا خواهیم شد.
تازه های Jetpack در نسخه آلفا
در این بخش موارد جدید بهروزرسانی شده در نسخه آلفای جتپک را بررسی میکنیم.
Hilt: کتابخانه توصیه شده جتپک برای تزریق وابستگی
Hilt یک کتابخانه جدید جتپک است که موجب سادهسازی «تزریق وابستگی» (Dependency Injection) در اپلیکیشن شما میشود. Hilt به ما امکان میدهد که روی بخشهای مهم تعریف کردن و تزریق اتصالها متمرکز شویم و دیگر نیاز نیست نگران مدیریت همه تنظیمات و اتصالهای تزریق وابستگی باشیم.
Hilt بر مبنای Dagger ساخته شده است و از اصلاحهای زمان کامپایل آن بهره میگیرند و با بهبود عملکرد زمان اجرا و مقیاسپذیری به کمک ما میآید. Hilt موجب ایجاد یکپارچگی با کتابخانههای جتپک و کلاسهای فریمورک اندروید میشود. برای نمونه برای تزریق پارامترهای یک ViewModel میتوانید یک حاشیهنویسی به صورت ViewModelInject@ به سازنده ViewModel اضافه کنید و سپس حاشیهنویسی AndroidEntryPoint@ را به Fragment اضافه کنید.
1<!-- Copyright 2019 Google LLC.
2 SPDX-License-Identifier: Apache-2.0 -->
3
4class SearchViewModel @ViewModelInject constructor(
5 private val repository: SearchRepository
6): ViewModel() { … }
7
8@AndroidEntryPoint
9class SearchFragment : Fragment() {
10 val viewModel: SearchViewModel by viewModels()
11}
برای کسب اطلاعات بیشتر در مورد Hilt و لینکهای مرتبط میتوانید از این مقاله (+) استفاده کنید.
Paging 3: بارگذاری و نمایش دادهها به صورت افزایشی
Paging کتابخانهای است که به بارگذاری و نمایش دستههای کوچک دادهها به صورت افزایشی کمک میکند. امروزه شاهد انتشار نسخه Paging 3 هستیم که یک بازنویسی کامل از کتابخانه با استفاده از کوروتینهای کاتلین محسوب میشود. این نسخه جدید تبدیلها و API-هایی را لیست میکند که برای مشاهده حالت بارگذاری لیست و متدهایی برای رفرش و بازیابی دادهها استفاده میشوند.
برای نمونه با استفاده از منبع دادهها میتواند با بسط دادن کلاس PagingSource و پیادهسازی تابع load suspend تعریف شود و مستقیماً روی تابعهای تعلیقیافته فراخوانی شود:
1<!-- Copyright 2019 Google LLC.
2 SPDX-License-Identifier: Apache-2.0 -->
3
4class MyPagingSource : PagingSource<Key, Value>() {
5 override suspend fun load(params: LoadParams<Key>): LoadResult<Key, Value> {
6 try {
7 val result = api.requestPage(params.key)
8 return Page(
9 data = result.items,
10 nextKey = result.nextKey
11 )
12 } catch(error: IOException) {
13 return Error(error)
14 }
15 }
16}
برای کسب اطلاعات بیشتر در مورد Paging 3 به مستندات رسمی آن (+) مراجعه کنید.
App Startup و مقداردهی کامپوننتها
کتابخانه App Startup یک روش سرراست و مؤثر برای مقداردهی کامپوننتها در زمان آغاز به کار اپلیکیشن ارائه میکند. به این ترتیب به جای تعریف ارائهدهندگان محتوای مجزا برای هر کامپوننت، میتوانیم در کتابخانه App Startup موارد لازم برای مقداردهی را تعریف کرده و یک ارائهدهنده محتوای منفرد را به اشتراک بگذاریم. این کار به طور چشمگیری موجب بهبود زمان آغاز به کار اپلیکیشن میشود.
در ادامه شیوه استفاده از App Startup را برای بهبود زمان مقداردهی اولیه WorkManager میبینید که یک کتابخانه است که در پسزمینه از WorkManager استفاده میکند و اقدام به غیر فعالسازی WorkManager خود WorkManager میکند:
1<!-- Copyright 2019 Google LLC.
2 SPDX-License-Identifier: Apache-2.0 -->
3
4class WorkManagerInitializer : Initializer<WorkManager> {
5 override fun create(context: Context): WorkManager {
6 val configuration = Configuration.Builder()
7 .setMinimumLoggingLevel(Log.DEBUG)
8 .build()
9 WorkManager.initialize(context, configuration)
10 return WorkManager.getInstance(context)
11 }
12
13 override fun dependencies() : List<Class<out Initializer<*>>> = emptyList()
14}
برای کسب اطلاعات بیشتر در مورد کتابخانه App Startup به مستندات رسمی آن (+) مراجعه کنید.
یکپارچهسازیهای IME به صورت Auto-fill
اندروید 11 برخی API-های پلتفرم برای کیبورد معرفی کرده است تا پیشنهادهای «تکمیل خودکار» (Auto-fill) را در اپلیکیشنهایی مانند نرمافزارهای مدیریت رمز عبور نمایش دهند. API مربوط به Autofill جتپک موجب میشود که بهرهگیری از این قابلیت جدید برای کیبوردها و سرویسهای Autofill از طریق کلاس InlineSuggestionUi تسهیل شود. سرویسهای Autofill میتوانند از این کلاس برای ایجاد پیشنهادهای سازگار استفاده کند و کیبوردها میتوانند از آن برای سفارشیسازی استایل پیشنهادها بهره بگیرند.
انیمیشنهای آسانتر با core-animation و SeekableAnimatedVectorDrawable
برای این که پیادهسازی و تست انیمیشنها آسانتر باشد، دو کتابخانه جدید به نامهای androidx.core:core-animation و androidx.core:core-animation-testing به جتپک اضافه شدهاند. همچنین یک API جدید به نام SeekableAnimatedVectorDrawable به عنوان بخشی از کتابخانه androidx.vectordrawable اضافه شده است. core-animation همه قابلیتهای اضافه شده به API به نام Animatgor از قبیل pause/resume و seek را تا نسخه «ساندویچ بستنی» (Ice Cream Sandwich) بکپورت میکند.
SeekableAnimatedVectorDrawable بر مبنای core-animation ارائه شده و یک جایگزین جدید و قابل seek برای AnimatedVectorDrawable است. این کتابخانه از همان قالب AVD استفاده میکند و امکان عقب/جلو کشیدن، مکث و پخش را فراهم میسازد. AVD-های با قابلیت کشیدن به جلو و عقب نمیتوانند از نخ رندر استفاده کنند، از این رو باید تنها زمانی به AVD ترجیح داده شوند که قابلیتهای جدید کلاس تجهیز شده باشند.
دیباگ پایگاه داده با Database Inspector در اندروید استودیو
دیباگ کردن مشکلات پایگاه داده اینک و با معرفی Database Inspector در اندروید استودیو 4.1 بتا از هر زمان دیگری آسانتر است. این ابزار به ما امکان میدهد که اقدام به بازبینی، کوئری و ویرایش پایگاههای داده در اپلیکیشن در حال اجرا استفاده کنیم. هر زمان که از Room یا از SQLite به صورت مستقیم استفاده میکنید، میتوانید شروع به دیباگ کردن پایگاه داده با انتخاب منوی View > Tool Windows > Database Inspector بکنید.
WindowManager و پشتیبانی بهتر از دستگاهها
کتابخانه WindowManager (+) یک افزونه جدید برای جتپک اندروید است که به پشتیبانی توسعهدهندگان اپلیکیشنها از دستگاههای جدید مانند انواع تاشو، صفحههای چرخان و غیره کمک میکند. این کتابخانه یک API رایج برای قابلیتهای متفاوت WindowManager هم روی نسخههای قدیمی و هم جدید پلتفرمها پشتیبانی میکند.
نسخه اولیه این کتابخانه از انواع متفاوتی از دستگاههای تاشو که هم اینک در بازار هستند پشتیبانی میکند، بنابراین این توسعهدهندگان اپلیکیشن میتوانند کل دستههای پیکربندیهای سختافزاری را هدفگیری کنند.
MotionLayout: ساخت انیمیشنهای روان و تعاملی برای اندروید
API به نام MotionLayout ظرفیتهای گسترده ConstraintLayout را بسط میدهد تا توسعهدهندگان اندروید بتوانند انیمیشنهای حرکتی و ویجت پیچیده را در اپلیکیشنهایشان پشتیبانی کنند. با استفاده از MotionLayout میتوانید انیمیشنهای خود را به صورت گذارهایی بین ConstraintSets مدیریت کنید و به سادگی این انیمیشنها را با ویوهای متداولی مانند RecyclerView و ViewPager ادغام کنید. اندروید استودیو 4.0 شامل یک ادیتور Motion است که ابزاری گرافیکی برای ایجاد و پیشنمایش انیمیشنهایی است که از MotionLayout استفاده میکنند.
بهروزرسانی کتابخانههای موجود
در این بخش برخی بهروزرسانیهایی که در کتابخانههای موجود جتپک رخ داده است را معرفی میکنیم.
Navigation
Navigation 2.3 از ماژولهای قابلیت دینامیک پشتیبانی میکند که امکان دانلود قطعههای مختلف اپلیکیشن را بسته به نیاز کاربر فراهم میسازد و موجب کاهش چشمگیر اندازه دانلود اولیه اپلیکیشن میشود. اینک میتوانید به این ماژولها بروید طوری که گویی بخشی از APK پایه هستند. علاوه بر فراهم آمدن امکان تعیین پارامترهای کوئری، امکان برقراری deep link و پشتیبانی از اعمال خاص و انواع mime نیز فراهم آمده است.
یک API جدید برای بازگشت دادن یک نتیجه به شما امکان میدهد که به هر مدخل پشته کوئری بزنید و نتیجه را روی SavedStateHandle تعیین کنید. این TestNavHostController جدید به ما امکان میدهد که به پشته Navigation دسترسی داشته باشیم و مقصد کنونی را در تستها تعیین کنیم.
WorkManager
جدیدترین نسخه WorkManager امکان پشتیبانی از اجرای طولانی و یا وظیفه مهمی که باید با استفاده از سرویسهای پیشزمینه از سوی سیستم عامل، زنده نگه داشته شود را فراهم ساخته است.
برای این که شناسایی مشکلها در وظایف WorkManager آسانتر شود، یک API عیبیابی نیز اضافه شده است که امکان دریافت حالت درونی WorkManager و دامپ کردن آن را در لاگکت فراهم میسازد.
1Recently completed work:
2Id Class Name Job Id State Unique Name Tags
388e31476–50d5–4a3a-855a-7c158d61543e com.example.DiagnosticsWorker null SUCCEEDED com.example.DiagnosticsWorker
4939d3d81–4a24–4920-ab6a-2a5b850f377b com.example.ToastWorker null SUCCEEDED com.example.ToastWorker
559ab8eb1–2645–446d-8811–1e7b887ab5bc com.example.ForegroundWorker null CANCELLED com.example.ForegroundWorker
67a6c23d2-a1f9–4477-af77–1f16b45cd765 com.example.ForegroundWorker 0 SUCCEEDED com.example.ForegroundWorker
7
8Running work:
9Id Class Name Job Id State Unique Name Tags
107c8bc01f-a60c-4b63-a6aa-2055d4d9d88e com.example.DiagnosticsWorker 4 RUNNING com.example.DiagnosticsWorker
برای کمک به جلوگیری از بروز خطاهای رایج در زمان استفاده از WorkManager یک سری قواعد Lint نیز برای فلگ کردنشان اضافه شده است. دیگر بهروزرسانیهای این API شامل پشتیبانی از تعیین و مشاهده پیشرفت ورکرها، بهبود API کوئری برای ورکرهای کنونی و بهبود زمانبندی داخل پردازش مورد استفاده اجرای ورکرها است.
بنچمارک
نسخه آلفای جدید کتابخانه Benchmark با CPU profiling ادغام شده است تا بتوانید بنچمارکهای خود را پروفایل کنید و سپس متد یا ردهای نمونهبرداری شده را مستقیماً در اندروید استودیو مشاهده کنید. همچنین امکان ردگیری تخصیص حافظه نیز اضافه شده است تا بتوان زمان صرف شده برای تخصیص را بهینهسازی کرده و اقدام به کاهش بار garbage collection کرد.
مجوزها
برای این که کار با مجوزها آسانتر شود یک API جدید به نام ActivityResult اضافه شده است. این API-ها موجب ساده شدن درخواستها از طریق جایگزینی requestPermissions با RequestPermission میشود و همچنین کنتراکتهای ایمن از نظر نوع برای اینتنتهای رایج از قبیل گرفتن یک عضو یا اعلان درخواست باز کردن یک سند به کاربر ارائه میکند.
SDK-های بازی
SDK بازی اندروید در ابتدای این سال ارائه شده است و اکنون بخشی از جتپک محسوب میشود و روی ریپازیتوری ماون گوگل عرضه شده است. این SDK در حال حاضر یک API Frame Pacing و Android Performance Tuner ارائه میکند. برای کسب اطلاعات بیشتر در مورد آن به مستندات رسمی (+) مراجعه کنید.
CameraX
دوربینهای دستگاههای اندرویدی تفاوتهای زیادی دارند، اما CameraX نود درصد از آنها را اجرا میکند. از آنجا که CameraX اوایل امسال به نسخه بتا رسیده است، بیشتر تمرکز تیم جتپک روی تأمین پایداری آن بوده است تا مطمئن شود که بهترین رفتار را روی طیف مختلف دستگاههای اندرویدی خواهد داشت. آزمایشگاه تست CameraX مجموعه تستهای خودکاری را روی انواع دستگاهها اجرا میکند تا بتواند نتایج مطلوبی روی همه 400 میلیون دستگاه اندرویدی فعال ارائه دهد.
جدیدترین نسخه از CameraX بهبودهایی روی ویجت PreviewView ارائه کرده است. این نسخه تعاملهای با چرخه عمر اپلیکیشن و پیجرهای ویو را مدیریت میکند. همچنین امکان استفاده شفاف از SurfaceView را فراهم میسازد که بهینهسازیهای عملکردی با خود به ارمغان میآورد. این امر موجب کاهش بافرینگ و افزایش عملکرد باتری میشود.
برای کسب اطلاعات بیشتر در این مورد نیز میتوانید به مستندات رسمی (+) مراجعه کنید.
امنیت
کتابخانه Security جتپک برخی تجریدهای رمزنگارانه امن و آسان برای استفاده مبتنی بر فایل مانند EncryptedFile و EncryptedSharedPreferences ارائه میکند. این کتابخانه از مزیت Keystore اندروید بهره میگیرد که ذخیرهسازی بر مبنای سختافزار و ایمنی عملیاتی فراهم میسازد. کتابخانه etpack Security هماینک در مرحله Release Candidate 2 برای Marshmallow+ و مرحله 1.1.0 alpha برای Lollipop+ support قرار دارد.
AppCompat
کتابخانه AppCompat بکپورتهایی برای طیفی از عناصر UI و قابلیتهای پلتفرم از Material theme تا ویجتهایی مانند Toolbar و تم تیره ارائه میکند. در جدیدترین نسخه قواعد Lint نیز اضافه شده که موجب درک بهتر این نکته میشود که کدام خصوصیتها از AppCompat و کدام یک از فریمورک هستند. بدین ترتیب میتوانیم مطمئن باشیم که از نوع صحیحی استفاده میکنیم. همچنین بهینهسازیهای ثبات اساسی برای پیادهسازی تم تیره ارائه شده است.
Webkit
کتابخانه Webkit جتپک یک API جدید به نام 1.2.0 release برای الزام به استفاده از تم تیره برای محتوایش ارائه کرده است. زمانی که این API فعال شود، 1.2.0 release t سایتها را درتم تیره رندر میکند. اگر وبسایتها از تم تیره پشتیبانی نکنند، این API رنگهای مشخصی را معکوس میسازد.
Jetpack Compose: کیت ابزار جدید UI برای اندروید
کتابخانه Jetpack Compose کیت ابزار جدید اندروید برای عناصر UI است که اینک در مرحله Developer Preview 2 قرار دارد. این نسخه قابلیتهای جدید زیادی اضافه کرده است که شامل درونیابی نما، کامپوننتهای بیشتر Material UI، پشتیبانی از تم تیره، API-های جدید تست U و انیمیشن، پشتیبانی اولیه از ConstraintLayout، بهینهسازی مدیریت حالت، ادغام با استریمهای observable و پشتیبانی از RTL است. پیشنمایشهای اندروید استودیو اینک میتوانند تعاملپذیر باشند و بهینهسازیهایی روی کامپایلر صورت گرفته است.
سخن پایانی
در این مطلب به معرفی تازههای Jetpack در طی ماههای اخیر پرداختیم. البته قطعاً با ارائه بیش از 90 کتابخانه مختلف از سوی جتپک، این که بخواهیم همه موارد جدید را پوشش دهیم کار دشواری است. به این منظور صفحه اصلی وبسایت جتپک بهروزرسانی شده است و از جمله یک انتخابگر کارآمد API اضافه شده است تا کاربران بتوانند سریعاً آن کتابخانه جتپک که به حل کردن مشکلشان کمک میکند را بیابند.