معماری اندروید از چند لایه تشکیل شده است و هر لایه از لایه ی زیرین استفاده می کند. همواره لایه ای بودن معماری ها برای این است تا کار کاربران نهایی و برنامه نویسان کاربردی راحت تر شود وآن ها را درگیر جزئیات سخت افزاری و پیچیدگی های سیستم عامل نمی کند. اما اگر می خواهید یک برنامه نویس سیستمی برای اندروید شوید بایدکار با این لایه ها را یاد بگیرید.
درمعماری اندروید هر لایه از سرویس های لایه ی زیرین استفاده می کند که در شکل زیر نشان داده شده است.
لایه های اصلی شامل:
- Application and Widgets
- Application Framework(چارچوب برنامه)
- Android Runtime(اندروید در زمان اجرا)
- Libraries(کتابخانه ها)
- Linux Kernel(هسته ی لینوکس)
1- لایه ی هسته ی لینوکس
پایین ترین لایه هسته ی لینوکس است. اندروید بر پایه لینوکس بنا شده است. کاربران گوشی های اندروید هرگز لینوکس را نمی بینند و در واقع از وجود لینوکس مطلع نمی شوند.حتی توسعه دهندگان نرم افزارها هم با این لایه درگیر نیستند ولی شما باید به عنوان یک برنامه ساز از وجود لایه لینوکس آگاه باشید. این لایه پایین ترین لایه است و نزدیک ترین لایه به سخت افزار می باشد.
2- لایه ی کتابخانه ها
لایه ی کتابخانه ها روی لایه ی هسته ی لینوکس قرار دارد. این لایه، لایه ی کتابخانه های اختصاصی که با کد های C یا C++ نوشته شده است و برای یک سخت افزار با معماری خاص کامپایل شده است.
برخی از این کتابخانه ها شامل:
System C library: کتابخانه استاندارد C
Media Libraries: شامل کتابخانه هایی که برای ضبط و پخش تصویر و صدا(با فرمت های JPG,PNG,MP4,MP3) استفاده می شوند.
SGL: شامل موتور های گرافیکی دو بعدی
WebKit Library_SSL: شامل یک موتور برای مرورگر های پیشرفته
3D libraries(OpenGL): برای کار با Open Gl طراحی شده است.
Free Type: برای ترجمه کردن فونت های Bitmap و برداری(vector)
SQLite: شامل یک موتور قوی و سبک وزن برای کار با پایگاه دادهای رابطه ای
3- لایه ی اندروید در زمان اجرا
این لایه شامل ماشین مجازی دالویک و کتابخانه های هسته ی جاوا است. نرمافزارهای جانبی اندرویدی با استفاده از زبان جاوا نوشته میشوند و برای ارتباط با لایههای زیرین سیستم عامل میتوانند از کتابخانههای جاوایی اندروید استفاده کنند. بخش رابط کاربری سیستم عامل اندروید با زبان جاوا نوشته شدهاست و بسیاری از برنامههای اندروید هم با جاوا نوشته شدهاند. اما این سیستم عامل، Java Virtual Machine ندارد. برای اجرای برنامههای جاوایی روی این سیستم عامل، کدهای جاوا به کدهای Dalvik تبدیل میشوند و سپس روی Dalvik vitrual machine اجرا میشوند. دالویک یک ماشین مجازی جاوایی است که برای سیستم عامل اندروید بهینه شدهاست تا هم RAM و هم CPU و هم باتری کمتری مصرف کند). برنامههای جاوایی معمولی هم که روی گوشیهای دیگر اجرا میشوند با استفاده از نرمافزارهای شبیهساز ماشین مجازی جاوا مانند j2ME MIDP Runner روی این سیستم عامل قابل اجرا هستند.
4- لایه چارچوب برنامه
بر طبق تصویر بالادر این لایه، سرویس ها و سیستم هایی مشاهده می شود که مهم ترین بخشهای آن در زیر آورده شده است.
View System: مجموعه ای از viewها مانند grids,lists,buttons و … که برای ساخت UIها استفاده می شود.
Content Providers: برای اشتراک و کپسوله سازی بکار می رود یعنی برنامه ها را قادر می شازد تا به اطلاعات برنامه های دیگر مانند لیست تماس دسترسی پیدا کنند و یا اجازه ی دسترسی به اطلاعات خود را به برنامه های دیگر می دهد.
Resource Manager: اجازه ی دسترسی به منابع برنامه را فراهم می کند. مانند دسترسی به تصاویر و فایل های Layout .
Notification Manager: از طریق این برنامه قادر می شود تا هشدارهای خود را در نوار وضعیت نشان دهد.
Activity Manager: مدیریت چرخه ی حیات(در آینده به آن می پردازیم) را در دست دارد و به نحوه ی اجرای برنامه نظارت می کند.
Location Manager: از طریق این می تواند سخت افزارهایی مانند GPS و Accelerometer(شتاب سنج) را کنترل کرد.
5- لایه ی برنامه کاربردی و ویجت ها
بالاترین لایه، لایه ی برنامه کاربردی و ویجت ها می باشد که کاربران نهایی فقط با این سروکار دارند. کاربران نهایی از نرم افزارهای این لایه استفاده می کنند. نرم افزارهای این لایه شامل نرم افزارهای اختصاصی گوشی و بازی ها و نرم افزارهایی که توسعه دهندگان تولید کرده اند. اندروید به همراه بسته های مختلفی از جمله، Email Phone dialer، Android Market، Contacts، Web Browser، Maps، Calender، SMS ارائه می شود. تمام این برنامه ها با زبان جاوا نوشته شده اند و به کمک لایه های زیرین مخصوصا Android Runtime اجرا می شود.
برنامه های کاربردی و ویجت ها ابزارهای ارتباط و تعامل با کاربران نهایی هستند. برنامه کاربردی تمام صفحه نمایش را در بر می گیرد و با کابر تعامل دارد اما ویجت ها(یا Gadget ها) بر روی Home Screen(صفحه اصلی) قرار دارند و به اندازه ی یک مستطیل کوچک صفحه نمایش را در اختیار می گیرند. برنامه کاربردی رایج تر اند. ویجت ها مانند ساعت آنالوگ، روز شمار و….. هستند.
مدیریت برنامه ها در اندروید
سیستم عامل اندروید مبتنی بر لینوکس است و از چند کاربر پشتیبانی می کند، یعنی هر برنامه به معنی یک کاربر در نظر گرفته می شود و سیستم به هر برنامه ای یک کد احراز هویت(که فقط برای سیستم قابل شناسایی است و برای برنامه شناخته شده نیست) مخصوص می دهد. سیستم برای تمام فایل های برنامه مجوز صادر می کند تا باعث تنها برنامه با آن کد هویتی خودش به فایلها دسترسی داشته باشد، به همین دلیل باعث می شود تا هر پردازش حریم خصوصی داشته باشد و هر برنامه نتواند به همدیگر دسترسی غیر مجاز داشته باشد.
هر پردازش روی ماشین مجازی خودش اجرا می شود، به همین دلیل اجرای کدهای یک برنامه نسبت به برنامه ی دیگر ایزوله یا مجزا(isolation) است.
در اندروید، پردازش را زمانی را اجرا می کند که کامپوننت نیاز به اجرا شدن داشته باشد و پردازش را زمانی متوقف می کند که دیگر به آن نیازی نباشد یا زمانیکه سایر برنامه ها برای اجرا به حافظه ی بیشتری نیاز داشته باشد.
بدین روش، اندروید اصل حداقل امتیاز (Principle of least Privilege)را اجرا میکند. بر اساس این اصل، هر برنامه ای، بصورت پیش فرض، تنها به کامپوننت هایی دسترسی خواهد داشت که برای اجرا به آنها نیاز داشته باشد و نه بیشتر. این روش محیطی بسیار امن خواهد ساخت، بدین ترتیب که یک برنامه تا زمانیکه مجوزهای لازم را نداشته باشد، نمی تواند به منابع سیستم دسترسی داشته باشد.
اشتراک داده
راه هایی وجود دارد که یک برنامه بتواند دیتاهای خود را با دیگر برنامه ها به اشتراك بگذارد و یا به سرویس هایی که سیستم می دهد، دسترسی داشته باشد:
1- این قابلیت برای دو برنامه وجود دارد که بتوانند از یک کد هویتی مشترك استفاده کنند. بدین ترتیب هرکدام می توانند از فایلهای دیگری استفاده نمایند. برای حفظ منابع سیستم، برنامه هایی که از یک کد هویتی استفاده می کنند می توانند از یک ماشین مجازی استفاده کنند و به ترتیب بر روی پردازشهای لینوکسی اجرا شوند(برنامه ها نیاز به sign شدن با یک certification دارند).
2- هر برنامه می تواند درخواست مجوز برای دسترسی به دیتای دستگاه مانند مخاطبین های کاربر (user’s contacts) ، پیامهای SMS ، حافظه جانبی(SD card) ، دوربین، بلوتوث و غیره را داشته باشد. تمامی این مجوزها در زمان نصب برنامه ازکاربر مورد سئوال قرار خواهد گرفت و این مجوز ها در فایل Manifest.xml قرار می گیرد.
Application Components(مولفه های برنامه)
کامپوننت های برنامه، ضروری ترین بلوك های ساختمانی (building blocks) در ساخت برنامه های کاربردی می باشند. هر کامپوننت دارای خصوصیاتی است که از آن طریق می توانید درخواست های خود را به سیستم اعلام کنید. همانطور که در گذشته گفته بودیم، هر برنامه شامل فایلهای جزئی (component)، فایلهای ظاهری (manifest) و منابع (resources) می شود.
کامپوننت ها شامل:
- فعالیت (Activities):
کار یک فعالیت این است که یک صفحه نمایش را با رابط کاربری (UI) نشان دهد.
- سرویس ها (Services):
خدمات نقش کارهایی را ایفا می کنند که در پشت صحنه باید انجام شود.
- ارائه دهندهی محتوا (content provider):
کار آنها ذخیره و بازیابی داده ها است و اینکه داده ها را برای همه برنامه ها قابل دسترسی کنند.
- دریافت کننده ی پخش (broadcast receiver):
دریافت کننده ی پخش ساخته شده تا به اعلامیههای درون سیستمی پاسخگو باشد. یک دریافت کننده ی پخش به عنوان زیر کلاسی از کلاس Broadcast Receiver است و هر اعلان به صورت یک شی (intent object) تحویل داده می شود.
فایل های ظاهری اندروید
هر برنامه ای باید یک فایل AndroidManifest.XML در ریشه دایرکتوری خود داشته باشد. کار این فایل این است که به سیستم اندروید درباره برنامه توضیحاتی را ارائه دهد.
در اندروید هر برنامه ای قادر به اجرای کامپوننتی از برنامه ای دیگر است. وقتی سیستم کامپوننتی را اجرا می کند، خط پردازش برنامه آغاز می شود (اگر تا حالا اجرا نشده باشد) و کلاسهای مورد نیاز برای اجرای برنامه فراخوانی می شوند. بنابراین، برخلاف انجام پردازش ها در سایر سیستمهای دیگر، برنامه های اندروید یک نقطه شروع معین(single entry point) ندارند. مثل نقطه شروع main() در زبانهایی مثل C++ و جاوا.
از آنجاییکه سیستم، اجرای هر برنامه را در خط پردازش مجزا از برنامه های دیگر انجام می دهد و هر برنامه ممکن است مجوزهای مختلف داشته باشد، برنامه شما نمی تواند بطور مستقیم کامپوننتی از دیگر برنامه ها را اجرا کند. اما سیستم اندروید می تواند اینکار را برای شما انجام دهد. بنابراین، برای اجرای اکتیویتی برنامه ای دیگر، باید پیامی به سیستم ارسال کنید تا قصد(intent) شما برای اجرای آن کامپوننت خاص را معلوم کند و سیستم کامپوننت مورد نظر را برایتان اجرا می کند.
اجرای کامپوننت(Activating Components)
از بین چهار نوع کامپوننت، سه نوع از آنها(اکتیویتی ها، سرویسها و دریافت کننده ی پخش) با پیام هایی(Asynchronous Message) که به Intent معروفند، اجرا می شوند. Intent کامپوننت ها را در زمان اجرا بهم وصل می کند، خواه کامپوننت ها مربوط به برنامه شما باشد یا نباشد. در واقع Intent ها واسط ای بین اجزای مختلف یک اپلیکیشن یا همان کامپوننت می باشد. بعلاوه Intent ها برای برقراری رابطه با سرویسها(مجموعه کارهایی که پشت صحنه اتفاق می افتد) نیز استفاده می شود. کاربرد دیگر Intent هشدارها(Notificationها)یی که توسط Broadcast Reciver ها بکاربر داده می شود است که سیستم عامل و یا کاربر را از وجود اتفاقی اگاه می سازد. در اکتیویتی ها و سرویس ها، یک Intent معرف عملی برای اجراست (بعنوان مثال برای ”دیدن“ یا ”ارسال“ یک چیزی) و ممکن است چیزی را معرفی کند که کامپوننت برای اجرا نیاز به آن داشته باشد.
نوع چهارم از کامپوننت ها ارائه دهندهی محتوا (content provider)، توسط Intent اجرا نمی شود. بلکه، زمانی فعال می شود که در خواستی از یک Content Resolver برسد. وظیفه Content Resolver سروسامان دادن به transactionهای ارسالی به Content Providers است. این کار به امنیت ارسال و دریافت دیتا کمک می کند زیرا یک سطح دسترسی عادی بین
Content Providers و کامپوننت درخواست دهنده را حذف کرده است.
یک Intent با ساخت یک شی از Intent بوجود می آید، با اینکار پیامی تعریف می شود که بوسیله آن می توان یک کامپوننت خاص یا نوع خاصی از کامپوننت را فعال کرد. یک Intent می تواند صریح یا ضمنی باشد.
متد های اجرای کامپوننت ها
برای اجرای هر نوع کامپوننت متدهای مختلفی وجود دارد:
1- یک اکتیویتی با ارسال یک intent به startActivity() اجرا می شود. اگر می خواهید اکتیویتی چیزی را به شما برگرداند، intent را به startActivityForResult() ارسال کنید.
2- برای اجرای یک سرویس، یک intent را به startService() یا bindService() ارسال کنید.
3- برای آماده سازی یک اعلان، یک intent به متدهایی مانند sendBroadcast() یا sendOrderedBroadcast() یا sendStickyBroadcast() ارسال کنید.
4- برای اینکه یک پرسجو(query) در یک Content Providers انجام شود، باید در یک Content Resolver متد query() را فراخوانی کنید.