اپلیکیشن آنی اندروید (Android Instant App) چیست؟ — از صفر تا صد
اپلیکیشنهای آنی اندروید یا Android Instant Apps روش جالب جدیدی برای استفاده از اپلیکیشنهای نیتیو بدون نیاز به نصب آنها محسوب میشود. در این حالت، تنها بخشهایی از یک اپلیکیشن دانلود و اجرا میشوند و کاربر حس و ظاهر اپلیکیشن نیتیو را در طی چند ثانیه تجربه میکند.
اپلیکیشن آنی اندروید چگونه کار میکند؟
قبل از هر چیز اعلام میکنیم که نباید «وب اپلیکیشنهای پیشرونده» (Progressive Web Apps) را که از طریق یک آیکون، وب اپلیکیشنی را روی مرورگر باز میکنند با اپلیکیشن آنی اشتباه بگیرید. اپلیکیشنهای آنی اندروید عملاً روی گوشی نصب میشوند؛ اما نیازی به جستجوی آنها در فروشگاه گوگل پلی وجود ندارد.
در این روش URL-های وب فروشگاه گوگل پلی را روی گوشی شما باز میکنند و تنها بخشهایی از اپلیکیشن را که با URL مورد نظر مرتبط هستند واکشی میکنند و بقیه اپلیکیشن دانلود نمیشود. بدین ترتیب کاربران میتوانند به سرعت از تجربه نیتیو اپلیکیشن اندرویدی استفاده کنند.
چارچوب کار چیست؟
شما باید پروژه اندروید خودتان را به چند ماژول تقسیم کنید. یکی از آنها ماژول پایه با کد ضروری است که در همه ماژولهای دیگر استفاده خواهد شد. برای نمونه شامل اتصال API، پایگاه داده، «ترجیحات مشترک» (shared preferences) و غیره میشود. ماژولهای دیگر ماژولهای «ویژگی» (feature) هستند که شامل کارکردهای خاص و اکتیویتیهایی هستند که میتوان از طریق URL-های مرتبط به آنها دسترسی یافت.
فرض کنید وب اپلیکیشنی دارید که فهرستی از محصولات را ارائه میکند. یک صفحه منفرد برای هر محصول دارد. در این حالت برای نمونه میتوانید از لینک https://example.domain/products برای اجرای ProductsListActivity و از https://example.domain/products/12 برای اجرای ProductActivity استفاده کنید.
برای این که آنها را به صورت اکتیویتی های اپلیکیشن آنی دربیاورید، باید آنها را در ماژولهای ویژگی منفردی بستهبندی کنید و همچنین لینکهای اپلیکیشن مرتبط را در مانیفستهای ماژول تعریف نمایید. ما آنها را ماژولهای محصول و لیست محصول مینامیم.
اینک وقتی یک کاربر لینک https://example.domain/products/12 را باز کند هم ماژول محصول و هم ماژول پایه شروع به دانلود شدن میکنند و ProductActivity اجرا میشود.
لینکهای اپلیکیشن چه هستند و چگونه تعریف میشوند؟
احتمالاً نام «لینکهای عمیق» (deep links) به گوشتان خورده است. این لینکها در مانیفست اپلیکیشن هستند و در سیستم عامل ثبت میشوند. زمانی که یک کاربر چنین لینکی را باز کند، سیستم عامل از کاربر میپرسد که آیا میخواهد این لینک در یک مرورگر وب باز شود یا در اپلیکیشن خاصی باز خواهد شد. با این وجود، این وضعیت برای اپلیکیشنهای آنی کافی نیست، زیرا باید یک گام نیز جلوتر رفت و از «لینکهای اپلیکیشن» ( App Links) استفاده کرد. بدین منظور شما باید از مشخصه "autoVerify=”true استفاده کنید.
1<activity android:name=".ProductActivity">
2<intent-filter android:autoVerify="true" android:order="100">
3<action android:name="android.intent.action.VIEW" />
4<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" />
5<data android:scheme="http"
6 android:host="example.domain"
7 android:pathPrefix="/products" />
8<data android:scheme="https"/>
9</intent-filter>
10</activity>
اپلیکیشن شما بررسی میکند که آیا لینکهایی که تعریف کردهاید واقعاً با دامنه شما مرتبط هستند یا نه. به این منظور باید فایل assetlinks.json را در پوشه مربوط به ریشه دامنه خود بگنجانید:
https://example.domain/.well-known/assetlinks.json.
ضمناً به مشخصه android:order=”100″ توجه کنید. این مشخصه در واقع در این مورد یک اولویت است. اگر یک لیست محصول و یک محصول منفرد داشته باشید که با همان مسیر مرتبط باشند (/products and /products/10)، اکتیویتی محصول منفرد در صورتی که یک id پس از مسیر products/ وجود داشته باشد اجرا خواهد شد. در غیر این صورت اکتیویتی لیست محصول اجرا میشود.
تعریف کردن این وضعیت بسیار حائز اهمیت است. اگر دو اکتیویتی وجود داشته باشند که با مسیر یکسانی مرتبط باشند، پلیاستور نخواهد دانست که کدام بخش از اپلیکیشن باید واکشی شود.
مرتبط ساختن اپلیکیشن با دامنه
فایل assetlinks.json باید هَشهای keystore با فرمت SHA256 شما را در خود داشته باشد. فیلد رابطه طوری تعیین شده است که مقدار پیشفرض زیر را داشته باشد و شیء هدف باید با دادههای خاص اپلیکیشن و همچنین هش SHA256 مربوط به keystore اپلیکیشن شما پر شود.
1[{
2 "relation": ["delegate_permission/common.handle_all_urls"],
3 "target": {
4 "namespace": "android_app",
5 "package_name": "com.example.app",
6 "sha256_cert_fingerprints":
7["00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"]
8 }
9}]
زمانی که مشخصه autoVerify=true این کار را انجام دهد، همه «اپ لینکهای» (App Links) مرتبط به صورت مستقیم، اپلیکیشن شما را اجرا خواهند کرد. اگر اپلیکیشنی نصب نباشد، اپلیکیشن آنی به جای آن دانلود خواهد شد.
ما به عنوان مثال یک اپلیکیشن دمو به منظور تست این قابلیت نوشتیم. زمانی که روی لینکهای مرتبط کلیک کردیم، یک صفحه باز شد و استفاده از اپلیکیشن آنی را پیشنهاد کرد. دقت کنید که اپلیکیشن با سرعت زیادی باز میشود؛ اما روی اندروید Oreo از این هم سریعتر باز میشود.
ماژولهای اپلیکیشن آنی را چگونه تعریف کنیم؟
برای این که یک اپلیکیشن آنی داشته باشید، پروژه شما باید شامل دستکم سه ماژول متفاوت باشد. شما باید از اندروید استودیو نسخه 3.0 استفاده کنید. اگر اپلیکیشنی را از صفر مینویسید این گزینه وجود دارد که پشتیبانی از اپلیکیشن آنی را برای پروژه خود فعال کنید. در این حالت، همه ماژولهای زیر به صورت خودکار مقداردهی خواهند شد. اگر مشغول ایجاد تغییراتی در یک اپلیکیشن قدیمی هستید، باید ماژول اپلیکیشن را به یک ماژول پایه منفرد و چند ماژول ویژگی تقسیم کنید. ضمناً باید یک ماژول App و یک ماژول Instant App بسازید که از آنها برای ساخت APK-های معمولی و همچنین آنی استفاده خواهد شد.
ماژول App
ابتدا باید یک ماژول app بسازید که وابستگیها را برای همه ماژولهای دیگر یعنی ماژولهای پایه + ویژگی تعریف میکند. در فایل build.gradle این ماژول باید موارد زیر را تعریف کنید:
1apply plugin: 'com.android.application'
2...
3dependencies {
4 implementation project(':product')
5 implementation project(':productlist')
6 implementation project(':base')
7}
ماژول پایه
در این ماژول باید گزارههای وابستگی زیر را تعریف کنید و ضمناً باید اطمینان حاصل کنید که افزونه ‘com.android.feature’ نیز اینجا استفاده شده است:
1apply plugin: 'com.android.feature'
2android {
3 baseFeature true
4 ...
5}
6dependencies {
7 api 'com.android.support:appcompat-v7:26.0.1'
8 api 'com.android.support.constraint:constraint-layout:1.0.2'
9 implementation 'com.google.firebase:firebase-appindexing:11.0.4'
10 application project(':app')
11 feature project(':product')
12 feature project(':productlist')
13}
در این مورد نیز دقت کنید که گزارههای کامپایل به گزارههای API برای وابستگیهای معمول که قبلاً استفاده کردهایم تبدل میشوند. پروژه اپلیکیشن و پروژههای ویژگی به طور مستقل از هم تعریف میشوند.
ماژول ویژگی
این ماژول تنظیمات زیر را دارد و ضمناً افزونه com.android.feature استفاده شده است.
1apply plugin: 'com.android.feature'
2...
3dependencies {
4 implementation project(':base')
5 ...
6}
باید مشخص کنید که کدام ماژول، ماژول پایه است و آن را در گزاره پیادهسازی پروژه بگنجانید. سپس باید وابستگیها را که تنها برای ماژول خاصی مورد نیاز هستند بگنجانید. برای نمونه اگر از کتابخانه انیمیشن استفاده میکنید که در هیچ کدام از ماژولهای دیگر استفاده نشده باید در این جا قید شود.
ماژول Instant App
در نهایت یک افزونه com.android.instantapp وجود دارد که باید در فایل build.gradle در ماژول instantapp بیاید.
1apply plugin: 'com.android.instantapp'
2dependencies {
3 implementation project(':product')
4 implementation project(':productlist')
5 implementation project(':base')
6}
در این ماژول، به تعریف ماژولهایی میپردازیم که به عنوان اپلیکیشنهای آنی ساخته خواهند شد. نتیجه بیلد ماژول اپلیکیشن آنی یک فایل zip با APK-های اپلیکیشن آنی است که میتوانند به صورت مستقل به گوگل پلیاستور در بخش مدیریت انتشار اپلیکیشنهای آنی اندروید آپلود شوند. این APK-ها به طور مشابه با APK-های معمولی مدیریت میشوند و سابقه انتشار و نسخهبندی خاص خود را دارند.
چالشهای اپلیکیشنهای آنی اندروید چه هستند؟
پیش از هر چیز باید گفت که اپلیکیشن آنی اندروید هم اینک به صورت پیشفرض فعال نشده است. اگر میخواهید آنها را امتحان کنید باید تنظیمات گوشی تلفن همراه خود را در بخش حساب گوگل بررسی کرده و تنظیمات اپلیکیشن آنی را فعال کنید.
نکته مهم بعدی این است که حتماً باید دادههای اپ لینکها در قالب زیر مشخص شده باشند:
1<intent-filter android:autoVerify="true">
2...
3<data android:scheme="http"
4 android:host="example.domain"
5 android:pathPrefix="/products" />
6<data android:scheme="https"/>
7</intent-filter>
هر دو طرح http و https باید به صورتی که در قطعه کد فوق مشخص شده تعریف شوند. هر روش دیگری برای تعریف اپ لینکها موجب شکست در تأیید لینک شده و اپلیکیشن به طرز صحیحی لینک نخواهد شد.
همچنین توصیه شده است که قطعه کد زیر در یکی از مانیفستهای اپلیکیشن گنجانده شود. این قطعه کد مشخص میسازد که در حالتی که اپلیکیشن آنی از تنظیمات یا لانچر سیستم اجرا میشود، کدام اکتیویتی باید اجرا شود.
1<meta-data
2 android:name="default-url"
3 android:value="https://example.domain" />
مستندات رسمی بیان میکنند که سرویس Google Search به طور خودکار annotation اپلیکیشن آنی (را که به شکل یک آیکون تندر کوچک است) ارائه میکنند؛ اما برخی مشکلات در این زمینه وجود دارد. در مورد اپلیکیشن دمویی که ما ساختیم، چنین حالتی وجود نداشت. نتایج جستجوی گوگل لینکهای اپلیکیشن دموی ما را به صورت اپلیکیشنهای آنی نمایش داد و لینکها منتهی به صفحه وب میشدند. تنها در صورتی که تلاش کردیم لینک مرتبط را از اپلیکیشن دیگری ماند جیمیل باز کنیم، کل فرایند اپلیکیشن آنی به راه افتاد و اپلیکیشن آنی اجرا شد.
نتیجهگیری
زمانی که دو سال پیش اپلیکیشن آنی برای اولین بار معرفی شد، افراد زیادی در مورد آن اشتیاق داشتند. در واقع این خدمات پاسخی به مشکلاتی بود که افراد هنگام جستجو به دنبال اپلیکیشنها در پلیاستور و نیاز به دانلود آنها برای شروع به استفاده از آنها داشتند. با توجه به این مورد، وب اپلیکیشنها دسترسی بسیار بیشتری دارند و یافتن آنها سادهتر است.
اپلیکیشنهای آنی این شکاف بین اپلیکیشنهای موبایل نیتیو و وب اپلیکیشنها را تا حدود زیادی پر میکنند. عملکرد آنها تا به این جا بسیار خوب بوده است و تصور بر این است که در طی زمان محبوبیتی بیش از این نیز کسب خواهند کرد. مشکلات اصلی این است که جامعه نسبتاً کوچکی پشت این مفهوم شکل گرفته و مستندات مناسبی در مورد آن وجود ندارد؛ اما در این حوزه نیز وضعیت روز به روز بهبود مییابد.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- گنجینه برنامه نویسی اندروید (Android)
- مجموعه آموزشهای برنامهنویسی اندروید
- آموزش ساخت اپلیکیشن آنی (Instant App) اندروید — راهنمای مقدماتی
- ۵ گام ضروری برای یادگیری برنامهنویسی اندروید — راهنمای جامع
- برنامه نویسی موبایل با اندروید استودیو
==