Android Stack

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

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

 

لایه کرنل لینوکس

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

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

  • این موضوع چگونه اتفاق می افتد؟
  • چه چیزی باعث می شود دستگاه این عملیات را انجام دهد؟
  • سیستم عامل چگونه متوجه می شود که جهت دستگاه تغییر کرده است؟

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

هسته لینوکس، که در قسمت پایین پشته نرم افزار واقع است و از ویژگی های اساسی سیستم عامل مانند مدیریت فرآیند، برنامه ریزی، مدیریت حافظه و مدیریت دستگاه پشتیبانی می کند. لینوکس یک پلت فرم اثبات شده در مورد امنیت و مدیریت فرایند است .

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

 

لایه Native

لایه native از کدهایی تشکیل شده که اغلب به زبان C و C++ نوشته شده است. بر خلاف لایه کرنل لینوکس، این لایه فضای کاربر ( user space ) خوانده می شود. این قسمت از پشته شامل قسمت های مختلفی مانند HAL، کتابخانه های native، native daemon ها، و ابزار های native می شود.

 

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

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

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

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

 

کتابخانه های native

لایه بعدی در معماری اندروید شامل کتابخانه های native اندروید می شود. بسیاری از اجزای سیستم اندروید و سرویس ها مانند ART و HAL با کدهای native ساخته شده اند که به کتابخانه های native نوشته شده در زبان C و C ++  نیاز دارند و به دستگاه اجازه می دهند تا انواع مختلفی از داده ها را اداره کند.برای مثال، کتابخانه های SQLite  برای ذخیره و بازیابی داده ها از یک پایگاه داده مفید هستند و کتابخانه WebKit صفحات وب را در مرورگرهای وب فراهم می کند. Apache Harmony پیاده سازی منبع باز از کتابخانه های جاوا است و OpenSSL لایه سوکت ایمن، امکان اتصال مطمئن نقطه به نقطه را فراهم می کند

اگر شما در حال توسعه برنامه ای هستید که نیاز به کد C یا C ++ دارد، می توانید از Android NDK برای دسترسی به برخی از این کتابخانه های native استفاده کنید. برای مطالعه بیشتر درباره NDK و دانلود می توانید به آدرس https://developer.android.com/ndk/guides مراجعه بفرمایید.

برخی از کتابخانه های native قابل توجه اندروید که برای اهداف خاصی طراحی شده اند عبارتند از:

  • Bionic : یک پیاده سازی خاص اندروید از کتابخانه libc، که از پروژه BSD استخراج شده است و برای نیازهای سیستم عامل اندروید به روز شده است.
  • Binder : یک مکانیزم ارتباطی بسیار سریع میان فرایندی است که اجازه می دهد تا یک برنامه اندروید با دیگری ارتباط برقرار کند.
  • Framework libraries : کتابخانه های گوناگون طراحی شده برای پشتیبانی از خدمات سیستم مانند مکان، رسانه، نصب کننده بسته، تلفن، WiFi، VoIP و غیره است.

 

Native Daemons

یک daemon  فرآیندی است که مدت زمان زیادی در پس زمینۀ سیستم عامل در حال اجرا است تا به درخواست‌ های سرویس ‌ها پاسخ دهد و در ارتباط مستقیم با کاربر نیست؛ یعنی شما آن برنامه را به صورت مستقیم نمی ‌بینید. native daemon ها کد اجرایی هستند که معمولا برای پشتیبانی از برخی از سرویس های سیستم اجرا می شود. حدود دوازده سرویس native وجود دارد و اکثر این سرویس ها با فرایند init آغاز می شوند.

نمونه هایی از Native daemon ها عبارتند از:

  • Service Manager (servicemanager) : این فرایند تمام سرویس های دیگر فریم را اجرا می کن و مهم ترین native daemon است.
  • Radio interface layer daemon (rild) : معمولا مسئولیت حمایت از قابلیت های تلفن همراه از طریق GPS یا CDMA را بر عهده دارد.
  • Installation daemon (installd) : از مدیریت برنامه ها، از جمله نصب، ارتقاء، و همچنین اعطای مجوزها پشتیبانی می کند.
  • Media server (mediaserver) : از دوربین، صوت و دیگر خدمات رسانه ای پشتیبانی می کند.
  • Android Debug Bridge (adbd) : از اتصال رایانه توسعه دهنده به دستگاه تلفن همراه و شبیه ساز پشتیبانی می کند به طوری که شما می توانید برنامه های کاربردی برای اندروید را توسعه دهد.

 

ابزارهای native

ابزارهای native شامل بسیاری از ابزارهای لینوکس خط فرمان لینوکس مانند init  که فرآيندي است که مسئول راه اندازی همه native daemon ها است، می باشد. همانند اکثر سیستم عامل های دیگر، اندروید پوسته خط فرمان دارد. در اندروید، توسعه دهندگان به این پوسته از طریق ابزار  ADB دسترسی پیدا می کنند. اگر شما یک کاربر لینوکس با تجربه باشید، به سرعت متوجه خواهید شد که مجموعه ی دستورات موجود در نسخه استاندارد اندروید بسیار کوچکتر از سایر توزیع های معمول لینوکس است. این به این دلیل است که اندروید از toolbox  برای پشتیبانی از بسیاری از این ابزار خط فرمان مانند  cd، ls، ps، top، df  و غیره استفاده می کند. اگر به خط فرمان لینوکس عادت دارید، نباید انتظار نداشته باشید که  grep، vi، less ، more یا هر ابزار توسعه دهنده دیگر را پیدا کنید. به همین دلیل است که توسعه دهندگان پلت فرم اغلب تمایل دارند که toolbox  استاندارد اندروید را با busybox لینوکس جایگزین کنند.

 

زیرلایه Android Runtime

در همین لایه، Android Runtime  وجود دارد، که مسئول اجرای برنامه ها در دستگاه های اندروید است.  اصطلاح “runtime” اشاره به یک بازه زمانی دارد، از زمانی که یک برنامه اجرا می شود تا زمانی که برنامه متوقف شود. این قسمت شامل Runtime Android (ART)  و کتابخانه های core است.

 

Android Runtime  (ART)

Android Runtime (ART) به هسته لینوکس برای ویژگی های اساسی مانند threading  و مدیریت حافظه در سطح پایین وابسته است. از نسخه Android نسخه 5.0 Lollipop، Dalvik (که به صورت JIT کامپایل می کرد) با  Android Runtime (ART)  جایگزین شد. قبل از اندروید 5.0 ،Dalvik  اندروید  Runtime بود.  اگر برنامه شما به خوبی روی ART اجرا شود، روی Dalvik نیز کار می کند ، اما ممکن است عکس این قضیه صادق نباشد.

اندروید 7.0  یک کامپایلر JIT را با استفاده از code profiling  به Android Runtime (ART)  اضافه کرد که به طور مداوم عملکرد برنامه های اندرویدی را در زمان اجرا افزایش می دهد.

برای دستگاه های دارای نسخه اندروید 5.0 ( API 21) و یا بالاتر، هر برنامه در فرآیند خود و با نمونه خود از Runtime Android (ART) اجرا می شود. ART  برای اجرای چندین ماشین مجازی در دستگاه های با حافظه کم  برای اجرای فایل ها DEX، که فرمت به ویژه ای است که برای اندروید طراحی شده، نوشته شده است.

برخی از ویژگی های اصلی ART عبارتند از:

  • کامپایل به صورت Ahead-of-time (AOT) و just-in-time (JIT)
  • garbage collection بهینه سازی شده (GC)
  • پشتیبانی بهتر از اشکال زدایی، از جمله پروفیل نمونه گیری اختصاصی، تشخیص دقیق و گزارش استثناها و …

اندروید همچنین شامل مجموعه ای از کتابخانه های core  در runtime خود می باشد که اکثر قابلیت های زبان برنامه نویسی جاوا را شامل می شوند، از جمله برخی از ویژگی های زبان جاوا 8، که فریم ورک جاوا API از آن استفاده می کند.

 

لایه Java API Framework

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

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

  • Activity Manager : کل چرخه عمر یک برنامه توسط Manager Activity فراهم شده است، و همچنین مسئول مدیریت حالت های مختلف اکتیویتی ها می باشد تا اطمینان حاصل شود که برنامه های کاربردی با فرآیندهای مختلف به سادگی اجرا می شوند.
  • Content Providers : این جزء به برنامه ها اجازه می دهد تا داده ها را با دیگر برنامه ها منتشر و به اشتراک بگذارند. کپسوله بندی داده ها، محتویات داده ها، تعریف امنیت داده ها و مدیریت ساختار داده ها توسط ارائه دهنده محتوا مورد توجه قرار گرفته می گیرد. به عنوان مثال تمام ورودی های ارائه شده توسط کاربر به برنامه، ساختار دادهی می شود و در پایگاه داده SQLite ذخیره می شود.
  • Resource Manager : دسترسی به تمام منابع embedded که در برنامه نوشته نشده اند برای مثال گرافیک، رشته های محلی و دیگر فایل های طرح بندی ، توسط Resource Manager انجام می شود.
  • Notifications Manager : این جزء اعلان های کاربر تلفن همراه و نمایش هشدار را فراهم می کند.
  • View System : مجموعه های مختلف view ، توزیع رویدادها، و دیگر دکمه ها و لیست های مهم توسط View System مورد استفاده قرار می گیرند.
  • Package Manager : این قسمت همه پکیج های برنامه های نصب شده بر روی دستگاه را مدیریت می کند.
  • Telephony Manager : این، سرویس های تلفن که بر روی دستگاه موجود هستند را فراهم می کند، مانند وضعیت و اطلاعات مشترک.
  • Location Manager : این، سرویس های مکان را در مورد تغییرات مکان فراهم می کند، که به برنامه اجازه می دهد تا به روز رسانی ها را دریافت کند.
  • Window Manager : این، مسئولیت سازماندهی صفحه نمایش است که به کاربر نمایش داده می شود.

در توسعه برنامه های اندروید بیشتر تمرکز بر روی این بخش پشته خواهد بود و می توانید از بسیاری از کامپاننت های این فریم ورک استفاده کنید.

 

لایه برنامه ها

لایه برنامه یا لایه های برنامه های سیستم بالاترین لایه است که کاربر می تواند به طور مستقیم با دستگاه ارتباط برقرار کند. دو نوع از برنامه های کاربردی وجود دارد : از پیش نصب شده و برنامه های کاربردی نصب شده توسط کاربر.

برنامه های کاربردی که از قبل نصب شده (برنامه های سیستمی) ، توسط OEM نصب شده اند و همراه با تلفن همراه ارائه می شوند.  برنامه های بارگذاری شده به طور پیش فرض شامل پست الکترونیکی، برنامه اس ام اس، تلفن، تقویم، نقشه ها، شماره گیر تلفن، مرورگر، مخاطبین و… است.  این برنامه ها را به طور معمول نمی توان از دستگاه حذف کرد و در پوشه /system قابل مشاهده هستند.

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

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

 

گردآورنده و مترجم : مریم مکاریان خراسانی

 

منابع:

 

  • https://developer.android.com/guide/platform
  • Learning Android, Second Edition,Copyright © 2014,Marko Gargenta and Masumi Nakamura,Published by O’Reilly Media, Inc.
  • Mobile Application Penetration Testing,Copyright © 2016,Vijay Kumar Velu,Published by Packt Publishing Ltd.