فصل سوم : ساخت پروژه در اندروید استودیو، بررسی محیط توسعه و ساختار کلی پروژه

به نام خدا. در جلسه گذشته با نحوه‌ی نصب اندروید استودیو و همچنین ساختار SDK آشنا شدیم. در این جلسه قصد دارم شما را با محیط اندروید استودیو، نحوه‌ی ساخت پروژه اندروید و ساختار آن آشنا کنم.

ساخت پروژه اندروید

ساخت پروژه اندروید در اندروید استودیو

پس از اجرای اندروید استودیو روی گزینه‌ی Start a new Android Studio project کلیک می‌کنم.

انتخاب نوع اپلیکیشن و اکتیویتی

در این مرحله نوع پروژه اندروید و نوع اکتیویتی (Activity) را باید تعیین کنیم. هدف من ساخت اپلیکیشن برای تلفن همراه و تبلت است بنابراین همان تب نخست یعنی Phone and Tablet را انتخاب می‌کنم.
سایر گزینه‌ها هرکدام برای یک هدف خاص پیش بینی شده. Wear OS برای ساخت اپلیکیشن ابزار پوشیدنی (مانند ساعت هوشمند)، TV برای تلویزیون‌های هوشمند، Android Auto برای خودروهایی که از سیستم عامل اندروید استفاده می‌کنند و Android Things مربوط به حوزه‌ی اینترنت اشیاء می‌شود.
اندروید استودیو چند نوع مختلف از اکتیویتی را پیشنهاد می‌دهد. من نوع ساده‌ی آن یعنی Empty Activity (اکتیویتی خالی) را انتخاب می‌کنم. با مفهوم اکتیویتی در ادامه بحث آشنا خواهید شد. به مرحله‌ی بعد می‌روم:

انتخاب نام پروژه اندروید ، API Level و زبان پروژه اندروید

Name: در فیلد Name نام اپلیکیشن را وارد می‌کنم. این نام به همراه آیکونی که بعدا برای برنامه‌ی خود انتخاب می‌کنیم، در لیست اپلیکیشن‌های نصب شده‌ی روی دیوایس اندرویدی به کاربر نمایش داده می‌شود.
Package name: هر اپلیکیشن در اپ استورهایی مانند گوگل پلی ، بازار و … بر اساس Package name آن تشخیص داده می‌شود و نام اپلیکیشن ملاک نیست. به عنوان مثال ممکن است چندین اپلیکیشن با نام Shop در مارکت‌ها موجود باشد. اما Package name برای هر اپلیکیشن یکتاست و اگر نام پکیج من با یک اپلیکیشن دیگر موجود در مارکت یکسان باشد، مارکت اجازه‌ی انتشار آن‌را نمی‌دهد. مارکت‌ها بر اساس همین نام پکیج بروزرسانی‌های منتشر شده برای اپلیکیشن‌های نصب شده روی دیوایس کاربر را بررسی و اعلام می‌کنند. Package name از دو بخش تشکیل می‌شود. بخش اول یک نام دامنه (Domain name) و بخش دوم نام اصلی برنامه. مزیت استفاده از دامین (دامنه) این است که احتمال تشابه نام پکیج انتخاب شده برای توسعه دهندگان مختلف را از بین می‌برد. برای مثال من از دامین وب سایت android-studio.ir استفاده می‌کنم که بنا برا الگوی پیشنهادی اندروید استودیو ابتدا پسوند دامین یعنی ir و سپس نام دامین قید شده. بعد از دامین یک نام اضافه می‌شود که معمولا همان نام اپلیکیشن است. البته در انتخاب پکیج نیم هیچ قاعده‌ی خاصی وجود ندارد. برای مثال الزامی به استفاده از دامین نیست و مقدار زیر هم صحیح است:

android_studio.androidcourses

یا قسمت دوم حتما نباید نام اصلی پروژه باشد و می‌تواند هر عبارت دیگری را شامل شود. اگر مالک یک دامین هستید بهتر است آنرا بکار ببرید اما اگر مالک هیچ دامینی نیستید طبق خط بالا یک مقدار دلخواه وارد کنید. از بکار بردن دامینی که در اختیار سایر افراد یا شرکت‌هاست خودداری کنید.
Save Location: این فیلد مربوط به محل ذخیره سازی پروژه اندروید است.
Language: در این قسمت زبان پیش فرض پروژه اندروید را تعیین می‌کنیم. مدتی از معرفی زبان کاتلین (Kotlin) برای اندروید می‌گذرد و حالا از نسخه‌ی ۳٫۳٫۲ اندروید استودیو انتخاب زبان به wizard پروژه اضافه شده. من فعلا با جاوا کار می‌کنم بنابراین انتخاب من Java است.
Minimum API Level: که در نسخه‌های قبل Minimum SDK نام داشت این امکان را به برنامه نویس می‌دهد تا پایین‌ترین نسخه‌ی اندرویدی که اپلیکیشن پشتیبانی می‌کند را تعیین کند. لغت Minimum به معنی حداقل بوده و در اینجا به این معنی است که باید تعیین کنم اپلیکیشن من پایین‌ترین نسخه اندرویدی که پشتیبانی خواهد کرد کدام API است. در زمان تهیه‌ی این آموزش نزدیک به ۱۰۰% دیوایس‌های اندرویدی که در اختیار کاربران است از API 19 به بالا هستند بنابراین من همین نسخه را انتخاب می‌کنم. علت الزامی بودن تعیین مینیمم این است که در هر نسخه‌ی جدید از اندروید، امکانات و قابلیت‌هایی اضافه می‌شود که اگر این امر را لحاظ نکنیم، ممکن است دارندگان دیوایس با نسخه‌های پایین‌تر در مواردی با مشکلاتی مواجه شوند. با انتخاب هر گزینه به عنوان مینیمم، اطلاعاتی در مورد آن API و سطح گستردگی آن نمایش داده می‌شود. در زمان نگارش این متن، ۹۵٫۳% دیوایس‌ها API 19 و به بالا هستند و نیازی نیست از API پایین‌تری استفاده کنم.
احتمالا می‌پرسید چرا پایین‌ترین نسخه یعنی API 9 را انتخاب نکردم تا اطمینان پیدا کنم ۱۰۰% دیوایس‌ها می‌توانند از این اپلیکیشن استفاده کنند؟ برخی قابلیت‌های اندروید که در نسخه‌های جدید معرفی شده، پیاده سازی آن برای نسخه‌های قدیمی غیرممکن و یا پیچیده است. بنابراین منطقی نیست من برای تعداد انگشت شمار گوشی و تبلت‌های مربوط به ۱۰ سال پیش بخواهم وقت و انرژی بیشتری صرف کنم یا برخی محدودیت‌ها را بپذیرم.
با کلیک روی گزینه Help me choose به نمودار کاملی در این خصوص دسترسی خواهید داشت.

نکته: در فصل قبل با SDK و همچنین Platform ها آشنا شدیم و دانستیم که با انتشار هر نسخه از اندروید، یک API برای آن منتشر می‌شود. هر پروژه اندروید در سه ویژگی compileSdkVersion، targetSdkVersion و minSdkVersion با Platform ها سروکار دارد. هنگامی که پروژه جدیدی می‌سازیم دو ویژگی اول یعنی کامپایل و نسخه هدف (Target) برابر با آخرین API نصب شده است و ویژگی Minimum همان API ای است که در این مرحله انتخاب می‌کنیم. البته نیازی به داشتن API مربوط به Minimum API Level در SDK نیست و صرفا آخرین API استفاده می‌شود.

instant apps: این ویژگی مدتی پیش معرفی شد و امکانی را برای کاربر فراهم می‌کند تا بدون نیاز به نصب اپلیکیشن بتواند یک پیش‌ نمایش (Demo) از برنامه را مشاهده و بررسی کند.
AndroidX artifacts: اندروید به تازگی نحوه نامگذاری کتابخانه‌های خود را تغییر داده. با انتخاب این گزینه، کتابخانه‌های support موجود در پروژه بر اساس شیوه‌ی جدید نامگذاری می‌شود. (با مفهوم و کاربرد کتابخانه‌ها در مباحث آتی آشنا خواهید شد).

نصب کامپوننت‌های مربوط به لایه‌ی ConstraintLayout

در این مرحله کامپوننت‌های مربوط به لایه‌ی ConstraintLayout از SDK فراخوانی و نصب می‌شود. این مرحله فقط در ساخت اولین پروژه اندروید انجام می‌شود و در پروژه‌های بعدی از نسخه‌ی کش (ذخیره) شده در خود اندروید استودیو استفاده می‌شود و نیاز به دریافت مجدد از SDK نیست.

بیلد (Build) شدن پروژه اندروید

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

دانلود بیلد سیستم Gradle

یک فایل زیپ با نام gradle-4.10.1-all.zip از سرور gradle.org در حال دانلود است که در حدود ۱۱۰ مگابایت حجم دارد. تا این لحظه که من در حال تهیه‌ی این آموزش هستم سایت گریدل بر روی آی‌پی ایران تحریمی اعمال نکرده و دانلود این فایل به راحتی انجام می‌شود. با اینحال اگر به هر دلیل این مرحله با موفقیت انجام نشد یا رایانه شما به اینترنت دسترسی ندارد، در صفحه‌ی ۱۳ روشی را معرفی کردم که Gradle را می‌توانید به صورت آفلاین نصب کنید. هرچند بعد از گریدل، تعدادی کامپوننت دیگر نیز باید از سرورهای گوگل و jcenter دریافت شوند که نیاز به تغییر آی‌پی جهت عبور از تحریم هم هست اما گریدل حجم بیشتری نسبت به بقیه دارد و احتمال بروز مشکل بخصوص در سرعت پایین اینترنت بیشتر است.
گریدل دریافت و نصب شد. حالا با اخطار مواجه می‌شوم:

ارور دریافت کتابخانه‌های اندروید استودیو

اندروید استودیو برای دریافت کامپوننت‌ها و کتابخانه‌های موردنیاز خود به اتصال به dl.google.com نیاز دارد که قبلا گفتیم IP های ایران تحت تحریم هستند. به ناچار آی‌پی را تغییر داده و مجدد پروژه را Sync (سینک به معنی همگام سازی) می‌کنم:

مشکل سینک (Sync) کردن پروژه اندروید استودیو

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

مشکل دانلود کتابخانه‌های اندروید استودیو

مشکل بیلد نشدن پروژه اندروید استودیو

فایل‌های مورد نیاز دریافت و پروژه با موفقیت بیلد شد و پروژه آماده‌ی استفاده است:

آموزش ساخت پروژه در اندروید استودیو

نکته: ممکن است در این مرحله بارها با خطا مواجه شوید. علت می‌تواند مربوط به سرعت پایین اینترنت یا اختلال موقت (یا دائم) در سرویس تغییر آی‌پی باشد. اگر با خطا مواجه شدید Sync کردن پروژه را چند بار دیگر تکرار کنید و اگر مشکل حل نشد از یک روش و سرویس دیگر برای تغییر آی‌پی استفاده کنید. یا چند لحظه صبر و مجدد تکرار کنید. سرویس‌های تغییر آی‌پی ممکن است در مقاطعی دچار اختلال یا کندی سرعت شوند. بهرحال دور زدن تحریم بدون دردسر نیست!

دو فایل MainActivity.java و activity_main.xml مربوط به همان Activity هستند که هنگام ساخت پروژه، نوع Empty را انتخاب کردم.

بیلد سیستم Gradle (گریدل) چیست؟

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

مشکل Gradle در اندروید استودیو

Gradle یک بیلد سیستم (Build System) متن باز و رایگان است که گوگل در سال ۲۰۱۳ اعلام کرد که از این بیلد سیستم در اندروید استودیو استفاده می‌کند.
بیلد سیستم یا سیستم ساخت، ابزاری ست که طیف وسیعی از عملیات موردنیاز برای توسعه و ساخت یک نرم افزار از جمله ساخت پروژه، پکیج کردن، فشرده سازی منابع، کامپایل کدها و… را انجام می‌دهد.
بهتر است به این چند خط توضیح بسنده نکرده و چند دقیقه‌ای را در خصوص گریدل در وب جستجو و مطالعه کنید.

نصب آفلاین Gradle

چنانچه به هر دلیلی گریدل بصورت خودکار و آنلاین روی اندروید استودیو نصب نشد با خطای زیر مواجه خواهید شد:

نصب آفلاین Gradle در اندروید استودیو

Unknown host ‘service.gradle.org’. You may need to adjust the proxy settings…

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

Users\[UserName]\.gradle\wrapper\dists\gradle-xx

داخل این فولدر یک فولدر با نامی متشکل از کاراکترهای تصادفی و بدون معنی ساخته شده. داخل این فولدر یک فایل با پسوند zip.part قرار دارد. هنگامی که گریدل به صورت آنلاین نصب می‌شود، پس از دریافت کامل فایل، فایل تبدیل به zip شده و از حالت فشرده خارج می‌شود. این تمامِ کاری است که ما باید به صورت دستی انجام دهیم!

محل نصب گریدل (Gradle) در اندروید استودیو

برای دانلود فایل گریدل کافیست نام فایل زیپ را گوگل کنید:

دانلود Gradle از gradle.org

در صفحه‌ی Gradle Distributions فایل موردنظر را پیدا کرده و دانلود کنید. دقت کنید نام و نسخه‌ی گریدل باید عینا مطابق باشد. برای یافتن سریع لینک، در صفحه‌ی مرورگر Ctrl + F زده و نام فایل زیپ را سرچ کنید:

دانلود Gradle از gradle.org

یا خیلی ساده تر؛ لینک دانلود گریدل در کادر build اندروید استودیو نمایش داده می‌شود. روی لینک کلیک و کپی (Ctrl + C) کنید (تصویر صفحه‌ی قبل).
پس از دانلود فایل، ابتدا اندروید استودیو را ببندید. سپس فایل‌های موجود در فولدر را حذف و فایل زیپ را جایگزین کنید:

دانلود Gradle از gradle.org

حالا اندروید استودیو را باز کرده و مجدد پروژه را سینک کنید. این‌بار گریدل از فایل محلی نصب می‌شود:

نصب آفلاین گریدل در اندروید استودیو

Activity (اکتیویتی) در اندروید

هر پروژه اندروید حداقل یک اکتیویتی دارد. اکتیویتی همان صفحه‌ای است که محتوای مدنظر ما را به کاربر نمایش می‌دهد. تعداد اکتیویتی‌های هر اپلیکیشن به میزان و نوع محتوا و سلیقه‌ی توسعه دهنده بستگی دارد. یک اپلیکیشن ساده ممکن است فقط یک اکتیویتی داشته باشد در حالی که یک اپلیکیشن دیگر می‌تواند شامل ده‌ها اکتیویتی باشد. هر اکتیویتی از دو بخش تشکیل می‌شود؛ یک فایل xml و دیگری فایل java که اولی شامل اِلِمان‌های تشکیل دهنده‌ی رابط کاربری صفحه و دومی مربوط به کدهای عملکردی مرتبط با آن است. پروژه‌ای که ساختیم به صورت پیش فرض یک اکتیویتی دارد. activity_main.xml و MainActivity.java فایل‌های این اکتیویتی هستند. توضیحات بیشتر در مباحث آتی بیان شده است.

آشنایی با محیط پروژه اندروید استودیو

اندروید استودیو از چند بخش تشکیل شده که هر قسمت وظیفه‌ای به عهده دارد.

اندروید استودیو

ستون سمت چپ ساختار پروژه اندروید را نشان می‌دهد. نحوه‌ی نمایش ساختار پروژه چند حالت دارد که حالت پیش فرض Android است. در این حالت پروژه به دو قسمت کلی app و Gradle تقسیم می‌شود:

ساختار پروژه اندروید در اندروید استودیو

محتویات زیرمجموعه‌ی app به اینصورت است:

ساختار app

AndroidManifest.xml:

AndroidManifest.xml

این فایل حاوی اطلاعات اصلی پروژه است. ازجمله نام و آیکون پروژه (خط‌های ۷ و ۸)، پکیج نیم (خط ۳)، قالب یاtheme برنامه (خط ۱۱)، اکتیویتی‌ها و… . برای باز کردن فایل‌ها دوبار روی آن کلیک کنید.
پوشه‌ی java یک پکیج پیش فرض دارد که فایل جاوای اکتیویتی درون آن قرار دارد. دو پکیج دیگر با عنوان AndroidTest و test در قسمت java ساخته شده که مربوط به فرایند تست پروژه بوده و در صورت عدم نیاز می‌توانید این دو مورد را حذف کنید. تمامی کلاس‌های جاوای پروژه درون این فولدر قرار می‌گیرند.
پوشه‌ی res (مخفف Resource به معنی منابع) حاوی منابع مختلفی است:
– Drawable: شامل تصاویر مورد استفاده در اپلیکیشن، برخی فایل‌های xml مانند بیت مپ‌ها و … که از طریق کلاس R.drawable قابل دسترسی هستند.
– Layout: شامل لایه‌های واسط کاربری (مانند activity_main.xml) که از طریق کلاس R.layout قابل دسترسی می‌باشند.
– mipmap: تصاویر مربوط به آیکون اپلیکیشن در این پوشه قرار می‌گیرد.
– Values: فایل‌های xml با محتوای آرایه‌ها (strings.xml)، استایل‌ها (styles.xml)، رنگ‌ها (colors.xml)، ابعاد و اندازه‌ها (dimens.xml) و … در این دایرکتوری نگهداری می‌شود.
Gradle Scripts: در این قسمت چند فایل وجود دارد که مربوط به تنظیمات پروژه و اندروید استودیو می‌باشد. دو فایل build.gradle را باز کنید. اولی (Project) حاوی اطلاعات کلی از جمله مخازن (Repository) دریافت کتابخانه‌ها است:

build.gradle (Project) اندروید استودیو

کتابخانه‌هایی که در پروژه‌های اندرویدی استفاده می‌کنیم از سرورهای google.com و jcenter.com دریافت می‌شوند که به علت تحریم دسترسی به هردو مسدود شده و به همین دلیل نیاز به تغییر آی‌پی داریم.

build.gradle Module: app) اندروید استودیو

فایل دوم (Module: app) شامل اطلاعات پایه‌ی پروژه ازجمله Minimum API (minSdkVersion)، Target API (targetSdkVersion) و Compile SDK (compileSdkVersion) و کتابخانه‌هایی که در پروژه استفاده می‌شوند (بلاک dependencies).

نوار ابزار Tool در اندروید استودیو

شماره ۱: اجرا (Run) کردن پروژه روی دیوایس مجازی یا حقیقی جهت تست و عیب‌یابی پروژه اندروید.
شماره ۲: قابلیت Instant Run یک تفاوت با Run دارد. با هربار Run کردن پروژه روی شبیه ساز یا دیوایس واقعی، کل پروژه از ابتدا مجدد کامپایل شده و به دیوایس منتقل می‌گردد که زمان زیادی را تلف می‌کند اما برای پروژه‌ای که در حال اجراست و تغییراتی را اعمال کرده‌ایم، با استفاده از Instant run بجای Run تنها بخش‌هایی از پروژه که تغییر کرده به دیوایس منتقل شده و بروزرسانی پروژه با سرعت بیشتری انجام می‌شود. البته برای استفاده از این قابلیت باید Platform API دیوایس یا دیوایس‌های مدنظر را در SDK نصب داشته باشید. به عنوان مثال اگر می‌خواهید پروژه را روی دیوایس‌های با API 26 و API 27 تست کنید و قصد دارید از این ویژگی بهره ببرید باید API این دو نسخه را نصب کنید.
شماره ۳: برای Sync (سینک یا همگام سازی) پروژه
شماره ۴: شبیه ساز اندروید استودیو (AVD)
شماره ۵: دسترسی به SDK Manager

نکته: در روند توسعه و ساخت اپلیکیشن حتما با خطاها و مشکلاتی روبرو خواهید شد. در اولین قدم برای حل مشکل، متن خطا را مطالعه و ترجمه کنید. اگر در درک زبان انگلیسی مشکل دارید از مترجم‌های آفلاین و آنلاین کمک بگیرید. با دیدن یک خطا از کوره در نروید! ضمن اینکه بروز خطا به معنی ایراد در سیستم عامل و رایانه شما نیست. بنابراین انتظار نداشته باشید با حذف و نصب مجدد اندروید استودیو یا تعویض سیستم عامل خطا رفع شود. ببینید اندروید استودیو از شما چه خواسته‌ای دارد. اگر مفهوم خطا را درک نکردید آنرا در گوگل جستجو کنید. مشکل شما با احتمال نزدیک به ۱۰۰% قبلا مشکل ده‌ها و صدها نفر دیگر بوده. پس به احتمال زیاد به جواب می‌رسید. بیشتر سوالات و مشکلات در حوزه برنامه نویسی و توسعه برنامه در وب سایت stackoverflow.com مطرح می‌شود. با سرچ ارور احتمالا اولین لینک مربوط به همین سایت است. لینک را باز کنید و پاسخ‌ها را با دقت مطالعه کنید. یا از وب‌سایت‌های فارسی کمک بگیرید. در وب‌سایت ما صفحه‌ای با نام «مشکلات و پرسش‌های رایج» تهیه شده که مشکلات متداول کاربران با راه حل آن قید شده:
پرسش مستقیم و طرح اشکال را برای مرحله‌ی آخر بگذارید. در این صورت زمان کمتری برای رسیدن به جواب صرف می‌کنید و لازم نیست چند ساعت یا چند روز را منتظر پاسخ من و بقیه بمانید!
دانلود فایل این آموزش با فرمت PDF
تعداد صفحات : ۲۰
حجم : ۱٫۵ مگابایت
قیمت : رایگان
تاریخ بروزرسانی آموزش : ۹۷/۱۲/۲۰
دانلود رایگان با حجم ۱٫۵ مگابایت لینک کمکی
این مطلب چقدر برایتان مفید بود؟ لطفا امتیاز دهید
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

آموزش‌ها در دو دسته «پایه» و «تکمیلی» منتشر می‌شوند.
آموزش‌های پایه شامل مباحث اصلی و آموزش‌های تکمیلی مطالبی است که می‌بایست در کنار مطالب اصلی از آنها استفاده کنیم.
شما با دریافت این دوره به تمامی آموزش‌های غیر رایگان و رایگان موجود در وب سایت دسترسی دارید که تخفیفی برای آموزش‌های غیر رایگان نیز درنظر گرفته شده. این پکیج به دو صورت دانلودی و ارسال پستی ارائه می‌گردد.
با خرید این دوره، به تمامی آموزش‌های غیر رایگانی که در آینده منتشر می‌شود نیز به صورت رایگان دسترسی خواهید داشت!

یک دیدگاه بنویسید

پرسش‌های زیر تایید و پاسخ داده نخواهد شد:
۱ : جزء موارد پاسخ داده شده در مطلب "مشکلات و پرسش های رایج" باشد
۲ : سوال قبلا توسط کاربران در دیدگاهها مطرح و پاسخ داده شده باشد
۳ : سوال خارج از مبحث آموزشی موجود در این صفحه باشد

پاسخی بگذارید

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

کد امنیتی *