معماری پلتفرم اندروید

زیر و بم معماری پلتفرم اندروید

معماری پلتفرم اندروید

سال های اولی که برنامه نویسی اندروید را شروع کردم پیدا کردن ارتباط بین اجزای مختلف نرم افزار و درک راحت بخش های مختلف اپلیکیشن برای من کار خیلی سختی بود. به نظر من راه حل درک بهتر بخش های مختلف نرم افزار و فهم بهتر اندروید، آشنایی با معماری پلتفرم اندروید است. امروز قصد داریم همه کامپوننت هایی که معماری پلتفرم اندروید با اون ها ساخته شده رو با هم بررسی کنیم.

بعد از این مقاله درباره همه این کامپوننت ها بصورت مفصل در بلاگ برنامه چی بحث خواهیم کرد. اما هدف من از این مقاله رسیدن به یک دید کلی از همه قسمت های این سیستم عامل هست. پس میخواهیم درباره معماری پلتفرم اندروید، کامپوننت های اصلی این سیستم عامل و منابع بیشتر برای مطالعه در این مورد صحبت کنیم.


معرفی معماری پلتفرم اندروید

نرم افزار متن باز

همانطور که شاید اطلاع داشته باشید، سیستم عامل اندروید یک سیستم عامل متن باز است که با استفاده از هسته نرم افزاری لینوکس ساخته شده است. هسته نرم افزاری لینوکس یکی از پرطرفدارترین و شناخته شده ترین سیستم عامل های دنیا است. استفاده از این کرنل به عنوان هسته اصلی نرم افزاری اندروید، ویژگی های اصلی و امنیتی لینوکس (که خودش هم متن باز هست) را به این سیستم عامل منتقل کرد. همچنین باعث شد شرکت های سخت افزاری خیلی راحت تر با اندروید ارتباط برقرار کنند.

اگر با پروژه های متن باز کار کرده باشید حتما میدانید که کد منبع این پروژه ها در اختیار همه توسعه دهنده ها قرار دارد و هرکسی میتواند این پروژه ها را به میل خودش تغییر بدهد. پیشنهاد میکنم برای آشنایی کامل با این مدل نرم افزارها، ویدئوی زیر را مشاهده کنید و مقاله اختصاصی بلاگ برنامه چی با همین موضوع را مطالعه کنید:

با در نظر گرفتن همه مطالبی که درباره نرم افزار های OpenSource یاد گرفتیم، میتونیم نتیجه گیری کنیم که سیستم عامل اندروید در اختیار همه شرکت ها و افرادی که دستگاه های هوشمند تولید میکنند قرار دارد. این شرکت ها سخت افزارهای اختصاصی تولید و برای قسمت نرم افزاری، از سیستم عامل اندروید استفاده میکنند. دلیل وجود برند ها و شرکت های مختلف که در حال ساخت گجت های هوشمند اندرویدی هستند، همین است.

اما در کنار همه این مسائل، باید این مورد را در نظر بگیریم که معماری پلتفرم اندروید طوری چیده شده که بتواند از همه این گجت ها پشتیبانی کرده و روی همه آنها اجرا بشود. چیزی که در تصویر زیر مشاهده میکنید نقشه کلی معماری پلتفرم اندروید است. مستطیل هایی که در این تصویر میبینید، هرکدام یک Component از سیستم عامل اندروید هستند. بصورت کلی معماری پلتفرم اندروید از اجزای زیر تشکیل شده است که در ادامه هرکدام را مختصر و مفید معرفی میکنیم:

  • هسته لینوکس یا Linux Kernel
  • لایه انتزاعی سخت افزار Hardware Abstraction Layer یا HAL
  • Android Runtime یا ART
  • کتابخانه های بومی Native C/C++
  • فرم ورک Java API
  • اپلیکیشن های سیستم
معماری پلتفرم سیستم عامل اندروید
استک نرم افزاری اندروید (برای کیفیت بالا، روی عکس کلیک کنید)

به تک تک این کامپوننت هایی که در عکس مشخص هستند، به اصطلاح Stack گفت میشود. یعنی چیزی که در تصویر مشخص است، استک نرم افزاری اندروید است.

به شکل بالا دقت کنید. وقتی از بالا به سمت پایین حرکت میکنیم، بیشتر به لایه های زیری پلتفرم اندروید برخورد میکنیم. با توجه به نوع کاری که شما با این سیستم عامل انجام میدهید، ممکن است با لایه های پایین تری سر و کله بزنید. یعنی یک کاربر معمولی فقط با لایه اپلیکیشن های سیستم کار میکند. اما یک برنامه نویس یا توسعه دهنده میتواند تا پایین ترین لایه ها، یعنی لایه انتزاعی سخت افزار را هم ملاقات کند.

نکته خوب نقشه معماری پلتفرم اندروید این است که اجزای مختلف سیستم عامل را در ذهن شما دسته بندی میکند. بنابراین مثلا وقتی میخواهید برای ساخت یک اپلیکیشن از سنسور بلوتوث یا دوربین استفاده کنید، روش دسترسی به این ماژول ها مشخص شده است. کنترل این دستگاه ها با تعدادی اینترفیس و از طریق Java API Framework به شما داده شده است.

یک نکته کوچک: برای اندروید از اصطلاحات “سیستم عامل” و “پلتفرم” خیلی استفاده میشود. این دو مفهوم تفاوت های زیادی با هم دارند که در مقاله اختصاصی دیگری درباره آن بحث کردیم. این مقاله را میتوانید از طریق لینک زیر مطالعه کنید:


هسته یا کرنل لینوکس (Linux Kernel)

پایه و اساس سیستم عامل اندروید، هسته لینوکس یا همان Linux Kernel است. یعنی اصلی ترین عملکرد های این سیستم عامل با استفاده از لینوکس ساخته شده و پایه معماری پلتفرم اندروید، لینوکس است.

اندروید و هسته نرم افزاری لینوکس

برای مثال، کامپوننت Android Runtime (ART)، که یکی از اجزای پلتفرم اندروید است، با استفاده از هسته لینوکس عملکرد های زیرین سیستم عامل مانند کنترل نخ های پردازشی (Thread ها) و مدیریت سطح پایین حافظه را انجام میدهد.

استفاده از هسته لینوکس به اندروید اجازه میدهد که از ویژگی های اصلی امنیتی لینوکس استفاده کند. همچنین به سازندگان دستگاه های مختلف امکان میدهد درایور های سخت افزاری را برای یک هسته نرم افزاری شناخته شده تولید کنند. یکی از دلایل موفقیت سیستم عامل اندروید، استفاده از لینوکس و استراتژی متن باز بوده است.


لایه انتزاعی سخت افزار (Hardware Abstraction Layer یا HAL)

هر دستگاهی که سیستم عامل اندروید روی آن اجرا میشود، دارای تعدادی ماژول سخت افزاری است که نرم افزار ها و کاربران میتوانند در صورت نیاز، از آنها استفاده کنند. کار سیستم عامل این است که به نرم افزار ها اجازه بدهد از کدام سخت افزار استفاده کنند و مقدار و مدل این استفاده را مدیریت کند. واحد خاصی که در معماری پلتفرم اندروید این وظیفه را انجام میدهد، HAL یا Hardware Abstraction Layer است.

لایه انتزاعی سخت افزار یا همان HAL از تعدادی اینترفیس استاندارد ساخته شده که منابع سخت افزاری سیستم را در اختیار فریم ورک Java API قرار میدهند تا برنامه نویسان بتوانند از این منابع استفاده کنند. یعنی توسعه دهندگان برای اینکه مثلا به دوربین دستگاه موبایل دسترسی داشته باشند، میتوانند با استفاده از زبان جاوا و API هایی که Java Framework در اختیار آنها قرارداده، مدیریت ماژول دوربین را به عهده بگیرند و کارهایی که میخواهند را به وسیله آن انجام بدهند.

hal معماری پلتفرم اندروید

لایه HAL دارای تعدادی ماژول کتابخانه مختلف است که هر کدام از این کتابخانه ها، یک اینترفیس را برای انواع مختلف سخت افزارها Implement میکنند. یعنی برنامه نویس ها فقط با اینترفیس سرو کار دارند. آن ها عملکرد هایی که میخواهند را با استفاده از متد های این اینترفیس پیاده سازی میکنند. سپس بقیه کارهای مدیریت ماژول سخت افزاری را سیستم عامل اندروید برای شما انجام میدهد.

اجزایی مانند دوربین و ماژول بلوتوث از طریق همین لایه قابل دسترسی و مدیریت هستند. وقتی که API فریم ورک جاوا درخواست دسترسی به سخت افزار را ارسال میکند، سیستم عامل اندروید ماژول لایبرری مربوط به همان قطعه سخت افزاری خاص را بارگذاری میکند و در اختیار فریم ورک قرار میدهد. از همین طریق و به واسطه زبان جاوا (یا هر زبان برنامه نویسی که اپلیکیشن را با آن می نویسید)، توسعه دهنده میتواند قطعه سخت افزاری مورد نظر را کنترل کند.


Android Runtime یا ART

برای دستگاه هایی که اندروید ورژن 5 (API level 21) یا بالاتر را اجرا میکنند، هر اپلیکیشن پردازش مخصوص به خود و همراه با آن، یک نمونه از Android Runtime یا ART اختصاصی خودش را خواهد داشت. یکی از اشکلات سیستم عامل اندروید، درست مدیریت نکردن حافظه دستگاه بود. اگر در کنار این مشکل، وجود گجت های بسیار زیاد و مدل های مختلف سخت افزاری را هم در نظر بگیرید، این مشکل میتوانست یک بحران باشد. به همین دلیل اپلیکیشن های این سیستم عامل در گذشته اشکالات زیادی داشتند. این کامپوننت با هدف مدیریت بهتر مصرف حافظه، از ورژن 5 به بعد ساخته و به این سیستم عامل اضافه شد.

ART به این منظور ساخته شده است که چندین ماشین مجازی را روی دستگاه هایی که حافظه کمتری دارند اجرا کند. این کار با اجرای فایل های DEX انجام میشود. یعنی یک فرمت خاص بایتکد که بصورت ویژه برای اندروید ساخته شده و برای کمترین استفاده از حافظه دستگاه بهینه سازی شده است.

علاوه بر اینها ART میتواند وظایفی مانند ساخت Toolchain هایی مانند Jack، کامپایل کردن کدهای جاوا و تبدیل آنها به بایتکدهای DEX که میتوانند روی پلتفرم اندروید اجرا شوند را نیز انجام بدهد. تعدادی از اصلی ترین ویژگی های ART در ادامه آورده شده است:

  • کامپایل کردن به روش های Ahead of Time (AOT) و Just in Time (JIT)
  • بهینه سازی فرآیند جمع آوری زباله ها یا Garbage Collection
  • از اندروید 9 (API 28) به بعد، فرمت DEX یا Dalvik Executable برای پکیج اپلیکیشن استفاده میشود که باعث تولید کدهای ماشین فشرده تری میشود
  • پشتیبانی بهتر برای اشکال یابی کدها که شامل Profiler اختصاصی برای نمونه سازی، گزارش های خطای دقیق و جزئی و توانایی تعریف Watchpoint برای بررسی کردن فیلد های خاص میشود.

در گذشته و قبل از اندروید ورژن 5 (API 21)، خود Dalvik به عنوان Android Runtime استفاده میشد. پس اگر اپلیکیشن شما روی ART به خوبی اجرا میشود، حتما روی Dalvik هم به راحتی اجرا خواهد شد. اما برعکس این جریان ممکن است همیشه نتیجه مشابهی نداشته باشد.

زبان جاوا به دلیل ساختار خاص خود میتواند روی همه دستگاه های سخت افزاری اجرا شود. این موضوع با استفاده از ماشین های مجازی جاوا که برای هر پلتفرم به صورت اختصاصی منتشر میشوند، ممکن شده است. یعنی برای سیستم عامل های مختلف، ورژن های مختلف از ماشین جاوا وجود دارد ولی در نهایت همه آنها زبان جاوا را میتوانند اجرا کنند.

به همین دلیل سیستم عامل اندروید یک سری از کتابخانه های ضروری مربوط به زمان اجرا را درون خود دارد که بسیاری از عملکرد های اصلی زبان برنامه نویسی جاوا را شامل میشوند. مثل تعدادی از ویژگی های زبان جاوا نسخه 8 که فرم ورک Java API از آنها استفاده میکند.


کتابخانه های بومی C و C++

کتابخانه های بومی یا Native، کتابخانه هایی هستند که در اندروید حق آب و گل دارند! یعنی زبان های ماشین اندروید در حقیقت C و C پلاس پلاس هستند. بسیاری از کامپوننت هایی که در معماری پلتفرم اندروید دیدیم، مانند ART و HAL، با استفاده از همین زبان های بومی ساخته شده اند.

کتابخانه های بومی معماری پلتفرم اندروید

به همین دلیل کتابخانه های بومی سی و سی پلاس پلاس باید وجود داشته باشند تا کامپوننت های دیگر بتوانند درست کار کنند. همچنین سیستم عامل اندروید با استفاده از Java API Framework، تعدادی از عملکرد های این کتابخانه های بومی را در اختیار اپلیکیشن ها قرار میدهد. به عبارت دیگر برای راحتی توسعه دهندگان، زبان جاوا از طریق Java API میتواند کتابخانه های بومی را کنترل کند و توسعه دهندگان از این زبان برای ساخت اپلیکیشن های اندروید استفاده میکنند.

ینی اگر پلتفرم اندروید یه فیلم بود، زبان اصلیش C میشد که با جاوا برای ما دوبله شده بود!

به عنوان مثال شما میتوانید با استفاده از Java OpenGL API به کتابخانه بومی OpenGL ES دسترسی داشته باشید که به شما این امکان را میدهد تا بتوانید گرافیک های دو بعدی و سه بعدی را در اپلیکیشن خودتان به وجود بیاورید و آنها را ویرایش کنید. اگر شما در حال توسعه اپلیکیشنی هستید که نیاز به کدهای C و C پلاس پلاس دارد، میتوانید با استفاده از Android NDK به صورت مستقیم به تعدادی از کتابخانه های بومی پلتفرم، در کدهای خودتان دسترسی داشته باشید.


Java API Framework

تمامی قابلیت های سیستم عامل اندروید با استفاده از API هایی که به زبان جاوا نوشته شده اند در دسترس شما قرار دارند. معماری پلتفرم اندروید به گونه ای است که بیشترین کارایی و قدرت را به زبان بومی داشته و در عین حال برای توسعه دهندگان و سازندگان دستگاه های مختلف، ساده و کارآمد باشد. پس برای ساخت اپلیکیشن به زبان جاوا (یا زبان هایی که مناسب ساخت اپلیکیشن اندروید هستند)، دسترسی های گسترده و بسیار مناسبی دارید که معمولا محدودیتی سر راه شما قرار نمیدهند.

یکی از مفاهیم بسیار مهم برنامه نویسی، API ها هستن. اگر هنور با این مفهوم آشنا نیستید و نمیدانید دقیقا چه کاری انجام میدهند، به نظرم مقاله زیر برای شما بسیار به درد بخور است:

این API ها قطعاتی که برای ساختن اپلیکیشن به آنها نیاز دارید را میسازند. این کار با ساده سازی قابلیت استفاده دوباره از کد، و کامپوننت ها و سرویس های ماژولار سیستم صورت میگیرد. این API ها شامل موارد زیر میشوند:

  • یک View System بسیار قدرتمند و انعطاف پذیر که برای ساختن رابط کاربری اپلیکیشن استفاده میشود. این سیستم شامل لیست ها، شبکه ها، باکس های متن، دکمه ها، و حتی نمایشگر های وب قابل جاسازی در اپلیکیشن میشود.
  • یک Resource Manager که دسترسی به منابع غیر کدی را مهیا میکند. این منابع میتوانند متن های داخلی نرم افزار، فایل های گرافیکی، و فایل های Layout باشند.
  • یک Notification Manager که به همه اپلیکیشن ها این اجازه را میدهد تا اعلان های شخصی سازی شده را در نوار وضعیت دستگاه نمایش بدهند.
  • یک Activity Manager که مرحله های چرخه عمر اپلیکیشن را مدیریت میکند و یک Navigation Back Stack معمولی را نیز ایجاد می نماید.
  • Content Provider که به اپلیکیشن ها اجازه میدهد تا به داده های منتشر شده توسط دیگر اپلیکیشن ها دسترسی داشته باشند. مانند اپلیکیشن Contact که به شما اجازه میدهد شماره یکی از دوستانتان را با دیگران به اشتراک بگذارید.

برنامه نویسان و توسعه دهندگان دسترسی کامل به همان API هایی که سیستم عامل اندروید از آنها استفاده میکند را دارند.


اپلیکیشن های سیستم

سیستم عامل اندروید بصورت پیشفرض تعدادی اپلیکیشن مانند ایمیل، پیام کوتاه، تقویم، مرورگر اینترنت و… را دارد. اپلیکیشن هایی که بصورت پیشفرض با سیستم عامل نصب میشوند، تفاوت خاصی با برنامه هایی که کاربر نصب میکند ندارند. بنابراین یک اپلیکیشن جدید میتواند به عنوان مرورگر پیشفرض یا اپلیکیشن دریافت و ارسال پیام کوتاه یا حتی کیبورد اصلی دستگاه تعیین شود.

اپلیکیشن های سیستم معماری پلتفرم اندروید

اپلیکیشن های سیستم میتوانند هم به عنوان یک نرم افزار برای کاربر و هم برای مهیا کردن کاربرد های خاص برای توسعه دهندگان عمل کنند. یعنی اگر شما در حال ساخت نرم افزار اندروید هستید و نیاز دارید یک پیام را بصورت SMS ارسال کنید، نیاز نیست که خودتان این عملکرد را در اپلیکیشن پیاده سازی کرده باشید. شما میتوانید به سیستم اطلاع بدهید تا همه اپلیکیشن هایی که توانایی ارسال SMS دارند را معرفی کند و یکی از آنها این کار را برای شما انجام بدهد.


سوالی دارید؟

در این مقاله درباره معماری پلتفرم اندروید و اجزای اصلی آنها صحبت کردیم. اگر هنوز سوالی در ذهن شما وجود دارد میتوانید آن را در قسمت نظرات (همین پایین) بپرسید تا به سرعت به آنها پاسخ بدهیم.


منابع بیشتر برای مطالعه

با استفاده از لینک های زیر میتوانید درباره معماری پلتفرم اندروید مطالعه های بیشتری داشته باشید:

درباره نویسنده

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اسکرول به بالا