اگر اپلیکیشن شما فرض کند استنتاج محلی همیشه در دسترس است، برای بخش بزرگی از کاربران شما یا کرش میکند یا بهسادگی هیچ واکنشی نشان نمیدهد. این یک خطای بحرانی در محیط تولید است که میتواند تجربه کاربری را بهطور کامل نابود کند. در ۱۴ سپتامبر ۲۰۲۶، یک راهنمای فنی در وبسایت dev.to برجسته کرد که فرض بر در دسترس بودن همیشگی استنتاج محلی، یک اشتباه استراتژیک در توسعه نرمافزار است.
بسیاری از توسعهدهندگان با هوش مصنوعی روی دستگاه — مثل یک کلید برق که یا روشن است یا خاموش — برخورد میکنند؛ یعنی یا پشتیبانی میشود یا نمیشود. اما اکوسیستم اندروید پیچیدهتر است؛ ممکن است دستگاه تراشه مناسب داشته باشد اما سیستمعاملش قدیمی باشد، یا سختافزار آماده باشد ولی مدل AICore هنوز روی دستگاه نصب (Provisioned) نشده باشد. همانطور که در پوشش پیشین ما دربارهی نحوه مدیریت محتوای فریبنده در سیستمهای گوگل دیدیم، این شکاف در پیادهسازی نشان میدهد که فاصله میان یک دستگاه تست مثل Pixel 9 Pro و گوشی یک کاربر عادی بسیار زیاد است.
خطر پیادهسازی سادهانگارانه
به نقل از راهنمای فنی منتشر شده در ۱۴ سپتامبر ۲۰۲۶ در وبسایت dev.to، بسیاری از تلاشهای اولیه برای ادغام AI از توابع سادهای برای تولید پاسخ استفاده میکنند. برای مثال، فراخوانی مستقیم GenerativeModel.getInstance(context) روی Pixel 9 Pro عالی عمل میکند، اما در دستگاههای دیگر خطای UnsupportedOperationException میدهد یا برنامه را متوقف (Hang) میکند. این شکستها معمولاً نه در زمان بررسی کد (Code Review)، بلکه در گزارشهای کرش (Crash Reports) شناسایی میشوند.
مدلسازی قابلیت بهعنوان یک «وضعیت»
برای حل این مشکل، توسعهدهندگان باید قابلیت AI را بهجای یک مقدار بولی (Boolean)، بهعنوان یک وضعیت مهرومومشده (Sealed State) مدل کنند. یک متغیر ساده مثل isSupported: Boolean اطلاعات حیاتی را حذف میکند. بر اساس گزارش dev.to، وضعیت باید به پنج دسته مجزا تقسیم شود:
- ناموجود (Unavailable): سختافزار یا سیستمعامل مدل را پشتیبانی نمیکند، یا سرویس سیستمی مربوطه در آن نسخه از سیستمعامل وجود ندارد.
- نیازمند دانلود (NeedsDownload): سختافزار پشتیبانی میکند، اما مدل هنوز بهصورت محلی روی دستگاه مستقر نشده است.
- در حال دانلود (Downloading): سیستمعامل در حال حاضر در حال آمادهسازی و دانلود مدل است.
- آماده (Ready): نشست فعال است و برای استنتاج (Inference) — لحظهای که مدل واقعاً جواب تولید میکند، شبیه خودِ آشپزی و نه دورهی آموزش آشپز — آماده است و شامل
AiSessionاست. - شکستخورده (Failed): خطایی در طول مقداردهی اولیه رخ داده است که بهعنوان یک دلیل از نوع
Throwableثبت شده است.
مکانیزمهای تشخیص ویژگی
پیادهسازی این ساختار نیازمند بررسی دقیق با استفاده از AiCoreManager است. این فرآیند شامل چندین مرحله و بررسیهای خاص است:
- بررسی سرویس سیستمی: تایید اینکه آیا
AiCoreManagerدر بیلد (Build) سیستمعامل وجود دارد یا خیر. - لیست سفید ویژگیها: مدیریت موارد
SecurityException؛ یعنی شرایطی که AICore روی دستگاه هست، اما ویژگی خاصTEXT_GENERATIONبرای آن دستگاه خاص در لیست سفید نیست. - نگاشت وضعیت: تبدیل مستقیم
FeatureStatus(شامل وضعیتهای UNSUPPORTED، DOWNLOADABLE، DOWNLOADING و AVAILABLE) به وضعیتهای مهرومومشده تعریفشده.
این دقت بالا اجازه میدهد رابط کاربری (UI) تجربههای متفاوتی ارائه دهد. بهجای نمایش یک چرخانِ بارگذاری (Loading Spinner) بیپایان که به بنبست میرسد، اپلیکیشن میتواند به کاربر بگوید مدل در حال دانلود است یا اگر سختافزار ناسازگار است، کلاً آن ویژگی را مخفی کند. این راهنما تاکید میکند که خروجی checkFeatureStatus باید فقط در طول عمر یک صفحه کش (Cache) شود، زیرا سیستمعامل میتواند در حین اجرای برنامه، وضعیت دستگاه را از DOWNLOADABLE به AVAILABLE تغییر دهد. توسعهدهندگان باید هر زمان که اپلیکیشن پس از چند دقیقه حضور در پسزمینه، دوباره به پیشزمینه (Foreground) بازمیگردد، وضعیت را مجدداً بررسی کنند.
استراتژی مسیریابی ترکیبی
یک اشتباه رایج دیگر، «جایگزینی کورکورانه» (Blind Fallback) است؛ یعنی هر شکست محلی را با یک فراخوانی API ابری جبران کنند. این کار بهطور نامحسوس تأخیر (Latency) و هزینههای توکنی را بازمیگرداند که هدف از AI روی دستگاه، حذف آنها بود. الگوی پایدارتر، استفاده از یک «مسیریاب تولید ترکیبی» (Hybrid Generation Router) است.
این مسیریاب بین درخواستهای کاربر و استنتاجهای پسزمینه تفاوت قائل میشود. فراخوانی ابری فقط زمانی رخ میدهد که درخواست توسط کاربر آغاز شده باشد — مثلاً لمس دستی دکمه «خلاصهسازی» یا ارسال یک پیام در چت. اما برای کارهای پسزمینه، مانند پیشتولید پیشنهادات یا پیشنویس پاسخهای اعلان (Notification) که هنوز کسی آنها را درخواست نکرده است، سیستم باید در صورت عدم دسترسی به مدل محلی، بهسادگی از استنتاج صرفنظر کند. این استراتژی از ایجاد صورتحسابهای ابری ناگهانی و غیرمنتظره هنگام استقرار برنامه روی میلیونها دستگاه غیرپشتیبانی جلوگیری میکند.
علاوه بر این، مسیریاب باید شکستهای میاننشست (Mid-session failures) را مدیریت کند. استنتاج محلی ممکن است بهدلیل فشار حافظه (Memory Pressure) یا حذف مدل از حافظه تحت بار زیاد (Eviction) شکست بخورد. با استفاده از بلوک recoverCatching در مسیر محلی، اپلیکیشن میتواند در صورتی که کاربر فعالانه منتظر پاسخ است، به ابر متصل شود، در حالی که همچنان محدودیتهای مربوط به کارهای پسزمینه را حفظ میکند.
این تغییر رویکرد، AI روی دستگاه را از یک «ویژگی نمایشی» به یک زیرساخت پایدار تبدیل میکند. با مدیریت حضور مدل بهعنوان یک وضعیت پویا، توسعهدهندگان از شر کرشهای محیط تولید و ریسک مالی مقیاسبندی ناگهانی API خلاص میشوند.
توسعهدهندگان اکنون میتوانند این الگو را با ادغام AI Edge SDK و مدیریت پنجره زمینه (Context Window) — میزان متنی که مدل همزمان در ذهن نگه میدارد، شبیه میز کاری که جا برای چند ورق دارد — محلی ۲ هزار توکنی بهینه کنند تا عملکرد روی سختافزارهای محدود بهینه شود. این لایه تشخیص قابلیت، همان ۲۰٪ «کسلکننده» کار است که تضمین میکند ۸۰٪ باقیمانده، یعنی طراحی پرامپت و تجزیه خروجیهای ساختاریافته، واقعاً به دست کاربر برسد. این تلاشها در راستای گسترش دسترسی به مدلهای زبانی است، مشابه رویکرد گوگل که Gemini را به عنوان یک لایه کاربردی برای سیستمعامل ویندوز عرضه کرد تا تجربه هوش مصنوعی را به محیطهای دسکتاپ نیز منتقل کند.
گام بعدی شما
- وضعیتهای
AiCoreManagerرا در اپلیکیشن خود جایگزین متغیرهای Boolean کنید. - برای کارهای پسزمینه، استراتژی «عدم اجرا» را جایگزین «جایگزینی ابری» کنید تا هزینهها کنترل شود.
- مکانیزم بازبینی وضعیت (Re-check) را هنگام بازگشت اپلیکیشن به Foreground پیاده کنید.
اما مدیریت حافظه در این مدلها چالش بزرگتری است — به تحلیل ما دربارهی کوانتش وزنها برای کاهش مصرف VRAM مراجعه کنید.




گفتگو