بسمه تعالی
در این جلسه قصد داریم با نحوه ساخته شدن و اجرا شدن برنامه اندروید آشنا شویم. اول از همه اصطلاح “کامپایل” شدن را تعریف می کنیم. در این باره pc mag staff می گوید:
A compiler is computer software that transforms computer code written in one programming language (the source language) into another programming language (the target language). Compilers are a type of translator that support digital devices, primarily computers. The name compiler is primarily used for programs that translate source code from a high-level programming language to a lower level language (e.g., assembly language, object code, or machine code) to create an executable program.
کامپایل شدن به معنای کنارهم قرار دادن و تبدیل کدهای و منابع برنامه و ساخت فایلی قابل اجرا برای دستگاه مقصد است. به برنامه ای که این کار را انجام می دهد کامپایلر گفته می شود. ممکن است برنامه ای برای محیط ویندوز کامپایل شود ( برنامه های ویندوزی) و یا برای اندروید کامپایل شود. ( برنامه های اندرویدی) اما هرکدام دارای شرایط و فرمت خاصی هستند که کامپایلر آن را کنترل می کند. برای استفاده از کامپایلر های مختلف برنامه ها و ابزار توسعه خاص مورد نیاز است. به عنوان مثال برای کامپایل کردن برنامه های اندرویدی می توان از Ecilipes یا Android studio و Intellij IDEA و غیره استفاده کرد. برای ساخت و کامپایل برنامه های ویندوزی از Visual Studio، Borland delphi و غیره استفاده کرد. بحث اصلی ما در مورد کامپایل برنامه اندروید است.
به مراحل کامپایل کد اندروید در شکل زیر توجه کنید:
مرحله اول: ابتدا سورس کد ها و کتاب خانه ها توسط کامپایلر جاوا که Javac نام دارد به بایت کد جاوا تبدیل می شود. بایت کد، کد تولید شده برای اجرا روی ماشین های مجازی است. این کد معمولاً سطح خیلی پایین تری از کد نوشته شده اصلی است اما سطح آن از سطح کد ماشین بالاتر است و معمولاً توسط ماشین مجازی به کد ماشین تبدیل و روی ماشین مقصد اجرا می شود. همانطور که می دانید برنامه های جاوا برای اجرا نیاز به سیستم عامل خاصی ندارند، بلکه هرجایی که Java Virtual Machine(JVM) نصب شده باشد قابل اجرا هستند. با نصب JVM روی هر سیستم عاملی می توان برنامه های جاوا را اجرا کرد. روی گوشی های اندروید هم یک JVM بهینه شده به نام Dalvik قرار دارد که برنامه نهایی را به زبان ماشین تبدیل و اجرا می کند.
مرحله دوم: بایت کد تولید شده توسط Proguard که از ابزارهای gradle است بهینه و کدگذاری می شود که فایل نتیجه این مرحله DEX نام دارد و پسوند آن هم .dex است. ( در مورد gradle و Proguard بعداً در مقاله ای توضیح خواهم داد.)
مرحله سوم: فایل DEX تولید شده به همراه منابع و متعلقات دیگر توسط aapt(Android Asset Packaging Tool) به یک پکیج تبدیل شده و پسوند آن apk می شود.
خیلی خوب . تا اینجا برنامه ساخته شد. حال نوبت شرح اجرای آن است.
- سیستم لینوکس اندروید برای هر برنامه ای که قرار است اجرا شود، از روی یک پروسس از قبل آماده به نام Zygote یک نسخه جدید فورک می کند (فورک نوعی کپی خیلی سریع) و سپس سورس برنامه در این پردازش جدید اجرا می شود.
- سپس داده های static را به Process اضافه می کند. این داده ها عبارتند از Dalvik code، منابع برنامه و غیره… .
- سپس یک Dalvik Heap ( حافظه) برای برنامه در نظر گرفته می شود و اپ آنقدر می تواند فضا اضافه کند تا به آن حداکثر برسد. اگر اپ از حافظه تخصیص داده شده فراتر رود پیام خطای out of memory دریافت خواهیم کرد.
در ضمن باید اشاره کنم که اندروید برای مدیریت حافظه از (Last recently used) LRU استفاده می کند تا سوئیچ کردن بین اپ ها سریع تر اتفاق بیافتد. یعنی با خارج شدن کاربر از برنامه آن را از بین نمی برد، زیرا شاید فوراً نیاز شد و باعث افت راندمان می شود. اگر سیستم دچار کمبود RAM شد آن پروسسی که دروترین ارجاع را داشته را Kill می کند تا فضای خالی برای process های جدید ایجاد شود.
سلام
ببخشید من ی برنامه کتاب توی اندروید استودیو نوشتم و هیچ کدام از صفحه ها ارور نداره ولی وقتی رو بولد میزنم ارور میاد که کامپایلر اس دی کا دست انتخاب نشده ولی من با همون ورژن اس دی کا یی که برنامه خالی رو ساختم دارم بولد میکنم و اون ورژن که ۲۸ هست همه مواردش آپدیت شده لطفا اگه راه حلی دارید بهم بگید ی دنیا سپاس
سلام. مشکلتون و درست متوجه نشدم، اگر سوالتون و در اstackoverflow ایجاد کردید بگید تا نگاه کنم. اگر نه بیشتر توضیح بدین.