مفهوم JDK و SDK  و NDK و JVM و DVM و ART وJRE در اندروید

اگر شما هم android developer هستید مطمئنا این اصطلاحات تابحال به گوشتون رسیده.جی آر ای (JRE) مخفف Java Runtime Environment به معنای محیط اجرای جاوا هستش.اساسا ماشین مجازی جاوا(JVM)مکانی است که برنامه جاوا شروع به اجرا شدن میکنند).پس به طور خلاصه JRE کارش تنها فراهم کردن محیطی برای اجرای برنامه های جاواست.جی دی کا(JDK)مخفف Java Development Kit به معنای بسته توسعه جاوا هستش.JDK تمامی ویژگی های توسعه نرم افزاری جاوا را در خود جا داده است.که شامل JRE،کامپایلرها و ابزارهایی شبیه JavaDoc و Java Debugger هستش.بطور خلاصه و ساده JDK به منظور توسعه،کامپایل و اجرای برنامه های جاوا استفاده می شود.و Android SDK چیست؟مخفف Software Development Kit شامل ابزار و API های مورد نیازِ اندروید می باشد. برای مثال اگر بخواهیم یک اپ بنویسیم که روی اندروید 5 نصب شود لازم است که از طریق SDK Tools نسخه API متناسب با اندروید 5 یعنی API 21 را دانلود و نصب کنید.پس ما برای این که که بخواهیم یک برنامه اندرویدی بنویسیم باید قبلش SDK اندروید رو نصب کنیم تا بتونیم از ابزاری که برای ما فراهم کرده، استفاده کنیم و از آنجایی که اگر ما اپلیکیشن های اندرویدی رو با استفاده از زبان جاوا می سازیم قبل از نصب کردن SDK اندروید، باید SDK جاوا یا همون JDK رو نصب کنیم.و حالا API چیست؟مخفف Application Programming Interface به معنای رابط کاربردی برنامه نویسی می باشد و یکی از ابزارهای مهم موجود در پوشه SDK می باشد که به عنوان رابط عمل می کند. مثلا شما می خواهید یک اپ تولید کنید که در آن از قابلیت Bluetooth گوشی استفاده کند . برای برقراری ارتباط بین اپ و Bluetooth گوشی نیاز به API داریم. API ای که این قابلیت را پشتیبانی کند.نسخه های APIروز به روز که نسخه های اندروید آپدیت می شود امکانات جدیدی برای ساخت اپ در دسترس برنامه نویسان قرار می گیرد. ما برنامه نویسان به جای اشاره به نسخه پلتفرم (مثلا اندروید 2) از سطح API (اندروید API سطح 8) استفاده می کنیم. با نصب هر نسخه از API تمام امکانات نسخه های قبل خودش را پشتیبانی می کند.نکته: اگر اپی تولید کنید که مثلا از نسخه API سطح 21 استفاده کند روی گوشی های اندروید نسخه 5 به بالا قابل نصب می باشد. خب قبل از اینکه بگیم JVM و DVM چیست ببینیم که یک برنامه اندروید چطوری کامپایل میشه؟کامپایل شدن به معنای کنارهم قرار دادن و تبدیل کدهای و منابع برنامه و ساخت فایلی قابل اجرا برای دستگاه مقصد است. به برنامه ای که این کار را انجام می دهد کامپایلر گفته می شود. ممکن است برنامه ای برای محیط ویندوز کامپایل شود ( برنامه های ویندوزی) و یا برای اندروید کامپایل شود. ( برنامه های اندرویدی) اما هرکدام دارای شرایط و فرمت خاصی هستند که کامپایلر آن را کنترل می کند. برای استفاده از کامپایلر های مختلف برنامه ها و ابزار توسعه خاص مورد نیاز است. به عنوان مثال برای کامپایل کردن برنامه های اندرویدی می توان از Ecilipes یا Android studio و Intellij IDEA و غیره استفاده کرد.مرحله اول: ابتدا سورس کد ها و کتاب خانه ها توسط کامپایلر جاوا که Javac نام دارد به بایت کد جاوا تبدیل می شود. بایت کد، کد تولید شده برای اجرا روی ماشین های مجازی است. این کد معمولاً سطح خیلی پایین تری از کد نوشته شده اصلی است اما سطح آن از سطح کد ماشین بالاتر است و معمولاً توسط ماشین مجازی به کد ماشین تبدیل و روی ماشین مقصد اجرا می شود. برنامه های جاوا برای اجرا نیاز به سیستم عامل خاصی ندارند، بلکه هرجایی که Java Virtual Machine(JVM) نصب شده باشد قابل اجرا هستند. با نصب JVM روی هر سیستم عاملی می توان برنامه های جاوا را اجرا کرد. روی گوشی های اندروید هم یک JVM بهینه شده به نام(DVM )مخفف Dalvic virtual machine قرار دارد که برنامه نهایی را به زبان ماشین تبدیل و اجرا می کند.در واقع Dalvik همون ماشین مجازی جاوا هست که توسط گوگل پیاده سازی شده، و اونجوری که خودشون اعلام کردن برای محیط های با حافظه پایین و محدودیت انرژی بهینه سازی شده.مرحله دوم: بایت کد تولید شده توسط Proguard که از ابزارهای gradle است بهینه و کدگذاری می شود که فایل نتیجه این مرحله DEX نام دارد و پسوند آن هم .dex است. ( در مورد gradle هم مقاله خواهم نوشت.)مرحله سوم: فایل DEX تولید شده به همراه منابع و متعلقات دیگر توسط aapt(Android Asset Packaging Tool) به یک پکیج تبدیل شده و پسوند آن apk می شود.خیلی خوب . تا اینجا برنامه ساخته شد. حال نوبت شرح اجرای آن است.سیستم لینوکس اندروید برای هر برنامه ای که قرار است اجرا شود، از روی یک پروسس از قبل آماده به نام Zygote یک نسخه جدید فورک می کند (فورک نوعی کپی خیلی سریع) و سپس سورس برنامه در این پردازش جدید اجرا می شود.سپس داده های static را به Process اضافه می کند. این داده ها عبارتند از Dalvik code، منابع برنامه و غیره… .سپس یک Dalvik Heap ( حافظه) برای برنامه در نظر گرفته می شود و اپ آنقدر می تواند فضا اضافه کند تا به آن حداکثر برسد. اگر اپ از حافظه تخصیص داده شده فراتر رود پیام خطای out of memory دریافت خواهیم کرد.در ضمن باید اشاره کنم که اندروید برای مدیریت حافظه از (Last recently used) LRU استفاده می کند تا سوئیچ کردن بین اپ ها سریع تر اتفاق بیافتد. یعنی با خارج شدن کاربر از برنامه آن را از بین نمی برد، زیرا شاید فوراً نیاز شد و باعث افت راندمان می شود. اگر سیستم دچار کمبود RAM شد آن پروسسی که دروترین ارجاع را داشته را Kill می کند تا فضای خالی برای process های جدید ایجاد شود.و Art هم که مخفف Android runtime هستش و جایگزین dalvik شد.پس از اینجا به بعد تمرکز می کنیم روی ART.هدف از معماری ART ، بهبود سرعت اجرای برنامه ها بود.به نظرم نقطه بزرگ تغییر در art نسبت به Dalvik قابلیت Ahead of time compilation بود. (انقدر گسترده بوده که گوگل مجبور شده از Refactor کردن کد فعلی Dalvik صرف نظر کنه و با هزینه زیاد Art رو تولید کنه).یعنی ART در زمان نصب برنامه، کد رو به کد ماشین compile می کنه.و اما NDK چیست ؟در واقع NDK یک ابزاری است که به شما اجازه میده تا برنامه هایی که به زبان های C یا C++ نوشته شده است را در گوشی اندرویدی اجرا کنید. NDK برای ادغام با SDK در نظر گرفته شده است به همین علت یک companion tool (یک ابزار همراه) نامیده می شود و فقط برای بخش های عملکردی یک پروژه استفاده می شود هنگامی که یک برنامه به صورت ساده در اندروید نوشته می شود این برنامه توسط مفسرها به byte کد جاوا تبدیل می شود اما زمانی که یک برنامه به زبان C یا c++ نوشته می شود برنامه دیگر نیازی به مفسر ندارد چون براساس ساختر ماشین نوشته شده است و به صورت مستقیم با CPU در ارتباط است و زمانی که از NDK استفاده می کنید شما به صورت مستقیم با Cpu در ارتباط هستید (یعنی دیگر لازم نیست که به یک زبان واسطه مانند جاوا تبدیل شده و بعد به CPU برسند). از این طریق میتوانید بیشترین عملکرد دستگاه را استفاده کنید.پس می شود کارهایی کرد که به صورت عادی در اندروید امکان پذیر نیست را انجام داد. خلاصه که شما با فعال کردن این ویژگی می توانید از کل performance اندروید رو بکشید بیرون و ازش استفاده کنید.نرم‌افزار Native چیست؟ساخت و توسعه نرم‌افزارهای Native به این معناست که برای برنامه نویسی و توسعه نرم‌افزار خود از زبان‌های اصلی سیستم عامل استفاده کنید. مثلا برای توسعه نرم‌افزار اندروید باید از زبان برنامه نویسی Java و برای توسعه نرم‌افزار آیفون باید از زبان برنامه نویسی Objective-C استفاده کنید. بزرگترین مزیت این حالت بازدهی (performance) بالای نرم‌افزار است، زمانی که شما برنامه خود را بصورت Native می‌نویسید کدهای شما به زبان ماشین کامپایل خواهند شد(Dalvik bytecode در اندروید) که همین موضوع باعث می‌شود شما حداکثر بازدهی ممکن از نرم‌افزار را داشته باشید. بازدهی بالا می‌تواند شامل افکت‌های انیمیشن، روان کار کردن بخش‌های مختلف برنامه، امکان استفاده از multi touch و خیلی موارد دیگه باشه که بدلیل دسترسی مستقیم به موقعیت‌های حافظه و سخت‌افزار گوشی اتفاق میفته.امیدوارم مفید واقع شده باشد.دوستان عزیز هرجایی از مقاله دچار اشکال میباشد خوشحال میشم در کامنت ذکر کنید.