<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های میلاد محمدی</title>
        <link>https://virgool.io/feed/@vimilad</link>
        <description>توسعه‌دهنده‌ی اندروید</description>
        <language>fa</language>
        <pubDate>2026-06-07 12:07:34</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/265399/avatar/wkuVPx.jpg?height=120&amp;width=120</url>
            <title>میلاد محمدی</title>
            <link>https://virgool.io/@vimilad</link>
        </image>

                    <item>
                <title>Hardware Abstraction Layer (HAL) در اندروید چیه و چرا انقدر مهمه؟</title>
                <link>https://virgool.io/@vimilad/hardware-abstraction-layer-hal-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%DA%86%DB%8C%D9%87-%D9%88-%DA%86%D8%B1%D8%A7-%D8%A7%D9%86%D9%82%D8%AF%D8%B1-%D9%85%D9%87%D9%85%D9%87-asm9fnphzyvb</link>
                <description>اخیراً داشتم داکیومنت‌های اندروید رو می‌خوندم و برام یه سوال پیش اومد که احتمالاً برای شما هم جذابه. همیشه برام سوال بود که با وجود درایورهای سخت‌افزاری که به طور مستقیم با سخت‌افزارها کار می‌کنن، دیگه چه نیازی به Hardware Abstraction Layer (HAL) هست؟ این سوال باعث شد که بیشتر در موردش تحقیق کنم و حالا می‌خوام نکات جالبی که فهمیدم رو با شما به اشتراک بذارم.چرا اندروید به HAL نیاز داره؟درایورها مستقیماً با سخت‌افزار کار می‌کنن و برای قطعات خاص مثل دوربین، وای‌فای، بلوتوث و… نوشته می‌شن. این درایورها همون دستورات پایه‌ای رو اجرا می‌کنن که سخت‌افزار بتونه با سیستم‌عامل تعامل داشته باشه. اما اینجا یه مشکل بزرگ وجود داره: برندها و مدل‌های مختلفی از دستگاه‌های اندرویدی وجود دارن و هر کدوم ممکنه سخت‌افزار و درایورهای متفاوتی داشته باشن. اگر قرار باشه که سیستم‌عامل مستقیماً با این درایورها تعامل داشته باشه، سازگاری اپلیکیشن‌ها و APIها با انواع دستگاه‌های اندرویدی سخت می‌شه و توسعه‌دهنده‌ها باید برای هر نوع دستگاه، تنظیمات خاصی رو در نظر بگیرن.این‌جاست که HAL به کمک ما میاد. HAL یه واسطه یا مترجم بین سیستم‌عامل و درایورهاست. این لایه یه استاندارد مشترک رو برای دسترسی به سخت‌افزار فراهم می‌کنه. یعنی اپلیکیشن‌های اندرویدی و APIهای سطح بالاتر اندروید می‌تونن با خیال راحت از طریق HAL به سخت‌افزار متصل بشن، بدون اینکه نیازی به آشنایی با جزئیات فنی هر دستگاه خاص باشه.نمودار لایه‌های اندروید که HAL رو به عنوان واسطه بین Kernel و Framework نشون می‌ده.HAL چطوری کار رو برای توسعه‌دهنده‌ها ساده‌تر می‌کنه؟HAL توی ساده‌تر کردن کارها برای همه نقش بزرگی داره:سازگاری با دستگاه‌های مختلف: چون HAL به عنوان یه رابط یکسان بین سیستم‌عامل و درایورهای سخت‌افزاری عمل می‌کنه، یه اپلیکیشن می‌تونه روی دستگاه‌های مختلف بدون مشکل اجرا بشه.نگهداری ساده‌تر: شرکت‌های سازنده دستگاه‌ها می‌تونن با ایجاد تغییرات در HAL، هماهنگی با سخت‌افزارهای خودشون رو ایجاد کنن، بدون اینکه لازم باشه کل کد سیستم‌عامل رو دستکاری کنن. این باعث می‌شه که هم شرکت‌ها و هم توسعه‌دهندگان اندروید راحت‌تر بتونن بروزرسانی‌ها رو پیاده‌سازی کنن.بروزرسانی سیستم‌عامل بدون نگرانی از سازگاری سخت‌افزار: با وجود HAL، اندروید می‌تونه لایه‌های بالاتر خودش رو بروزرسانی کنه بدون اینکه نیاز باشه از جزئیات هر درایور سخت‌افزاری خاص خبر داشته باشه.مثال از کاربرد HAL: کار با دوربینبرای درک بهتر عملکرد HAL، بیاید مثال دوربین رو در نظر بگیریم. فرض کنید شما یه اپلیکیشن دارید که از دوربین استفاده می‌کنه. وقتی از Camera2 API اندروید برای ارتباط با دوربین استفاده می‌کنید، این API درخواستش رو از طریق HAL به درایور دوربین ارسال می‌کنه و درایور هم این درخواست رو به خود سخت‌افزار می‌رسونه.اگر HAL وجود نداشت، شما باید کدتون رو به شکلی می‌نوشتید که با مدل‌ها و برندهای مختلف سازگار باشه. ولی با HAL این کار براتون ساده‌تر شده و نیازی به دست و پنجه نرم کردن با جزییات هر دوربین خاص ندارید. این لایه همه تفاوت‌های سخت‌افزاری رو انتزاع می‌کنه و اجازه می‌ده که اپ شما روی همه دستگاه‌ها درست کار کنه.نمودار زنجیره ارتباط بین دوربین، HAL، درایور دوربین، و خود سخت‌افزار دوربین. منبع

نتیجه: چرا HAL برای یه توسعه‌دهنده اندروید مهمه؟شاید به عنوان یه توسعه‌دهنده اندروید، مستقیماً با HAL کار نکنید، ولی فهمیدن اینکه چطور این لایه در پس‌زمینه عمل می‌کنه، دید بهتری از ساختار سیستم‌عامل اندروید بهتون می‌ده. HAL یه رابط قوی و انعطاف‌پذیر بین سخت‌افزار و نرم‌افزار فراهم کرده که باعث می‌شه اندروید بتونه با انواع سخت‌افزارها سازگار باشه. این موضوع به‌خصوص برای توسعه‌دهنده‌ها مهمه، چون کمک می‌کنه اپ‌هایی بنویسیم که بدون مشکل روی همه دستگاه‌ها اجرا بشن و همزمان از سخت‌افزار بهترین استفاده رو بکنن.#AndroidDevelopment #HardwareAbstractionLayer #HAL #AndroidSystem #اندروید #توسعه_اندروید #سخت‌افزار #لایه_انتزاعی #برنامه‌نویسی</description>
                <category>میلاد محمدی</category>
                <author>میلاد محمدی</author>
                <pubDate>Sun, 10 Nov 2024 13:41:31 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش استفاده از Jetpack DataStore</title>
                <link>https://virgool.io/MobileLab/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-jetpack-datastore-o05hittehxcl</link>
                <description>سلام دوستانمن مدت‌ها قصد داشتم توی ویرگول خودم نوشتن رو شروع کنم اما به دلایل مختلفی هیچوقت تا الان نشد که این اتفاق بیفته! تا اینکه چند روز پیش خبر منتشر شدن کتابخونه‌ی جدید DataStore که بخشی از مجموعه‌ی Jetpack هست رو خوندم.از اونجایی که این کتابخونه مزایای بسیار زیادی نسبت به SharedPreferences داره، و آموزش فارسی برای پیاده‌سازیش هنوز منتشر نشده(یعنی من ندیدم?)، تصمیم گرفتم این مقاله رو بنویسم. پس خیلی حرف نمی‌زنم و میرم سر اصل مطلب.کتابخونه‌ی DataStore عضو جدیدی از خانواده‌ی Jetpack هست که بر پایه‌ی Kotlin coroutines و Flow ساخته شده و به عنوان جایگزین SharedPreferences معرفی شده.چرا DataStore؟ مگه SharedPreferences چشه؟!خب قبل اینکه بخوام بگم چرا، این جدول مقایسه رو ببینید:SharedPreferences VS DataStoreخب حالا وقت جواب دادنه! معایب SharedPreferences که توی DataStore رفع شدن: اول اینکه SharedPreferences دارای یک API همزمانی (synchronous API) هستش، که به نظر می‌رسه برای صدا زده شدن توی ترد اصلی برنامه (UI Thread) امن باشه، اما در واقع عملیات I/O دیسک رو انجام میده. علاوه بر اون، متد apply ترد اصلی رو روی متد fsync بلاک می‌کنه (برای نوشتن اطلاعات روی حافظه‌ی دستگاه). این یعنی هر موقع یک سرویس یا اکتیویتی در اپلیکیشن شما  start/stop میشه، fsync هایی که pending هستن اجرا میشن و در تمام این مواقع، حین اجرای fsync ها، ترد UI بلاک میشه.به دلیل پشتیبانی نکردن از type safety می‌تونه parsing error یا runtime exception پرتاب کنه و باعث ایجاد مشکل یا کرش در برنامه‌ی ما بشه.از پیگیری کردن وضعیت(success / failure) یک job پشتیبانی نمی‌کنه.فقط از داده‌های اولیه(primitive types) پشتیبانی می‌کنه.نکته مهم: اگه به به‌روزرسانی‌های جزئی، یکپارچگی دسترسی به اطلاعات یا پشتیبانی از مجموعه داده‌های بزرگ یا پیچیده نیاز دارید بهتره (و باید) از Room استفاده کنید. DataStore برای مجموعه داده‌های ساده و کوچک ایده‌آل هست، مثل ذخیره تنظیمات یا اطلاعات کاربری جزئی در نرم‌افزار.روش پیاده‌سازیاینجا فعلا روش پیاده‌سازی بدون Proto رو آموزش میدم که مقاله خیلی طولانی و حوصله سر بر نشه :)۱. اضافه کردن dependency به build.gradle:// Preferences DataStore
implementation &amp;quotandroidx.datastore:datastore-preferences:1.0.0-alpha01&amp;quot۲. ساختن دیتااستور:// with Preferences DataStore
val dataStore: DataStore&lt;Preferences&gt; = context.createDataStore(
    name = &amp;quotsettings&amp;quot //نام دلخواه
)۳. ذخیره‌ی اطلاعات در دیتااستور:dataStore.edit {preferences -&gt;
 preferences[KEY] = value
}به جای KEY باید کلید مربوطه و به جای value مقدار اون رو قرار بدید، مثلا:KEY: &amp;quotlanguage&amp;quot
value: &amp;quotfa&amp;quot۴. خواندن اطلاعات ذخیره شده:val language: Flow&lt;String?&gt;
    get() = dataStore.data.map { preferences -&gt;
        preferences[KEY]
    }بالاتر گفتم که این کتابخونه بر پایه‌ی Kotlin coroutines و Flow ساخته شده، پس باید برای خوندن اطلاعات نوع متغیر رو به صورت بالا تعریف کنیم، و داخل تابع getter دیتای مربوط به KEY دلخواه خودمون رو دریافت کنیم.تبریک می‌گم، شما DataStore رو با موفقیت پیاده‌سازی کردین :)اگر قصد مهاجرت از SharedPreferences به DataStore رو دارید و میخواید دیتای قدیمی رو به دیتااستور منتقل کنید، کافیه کد زیر رو (قبل از انجام هر عملیاتی با DataStore) بنویسید:val dataStore: DataStore&lt;Preferences&gt; = context.createDataStore(
    name = &amp;quotsettings&amp;quot // نام دلخواه,
    migrations = listOf(SharedPreferencesMigration(context, &amp;quotsettings_preferences&amp;quot))
)امیدوارم این مقاله براتون مفید بوده باشه.موفق‌تر باشید ❤منبع: Prefer Storing Data with Jetpack DataStore</description>
                <category>میلاد محمدی</category>
                <author>میلاد محمدی</author>
                <pubDate>Tue, 22 Sep 2020 11:14:48 +0330</pubDate>
            </item>
            </channel>
</rss>