ایمپورت (import) سورس پروژه در اندروید استودیو

آموزش ایمپورت (import) سورس پروژه در اندروید استودیو

برای ما به عنوان برنامه نویس و توسعه دهنده اندروید، استفاده از سورس‌ها و پروژه‌هایی که قبلا توسط سایر افراد و یا تیم‌های برنامه نویس نوشته و منتشر شده، اجتناب ناپذیر است. بنابراین لازم است نحوه ایمپورت (import) سورس پروژه در اندروید استودیو را بیاموزیم.
همچنین ممکن است در آینده، لازم شود پروژه‌ی اندرویدی که خودمان مدت‌ها قبل آن را نوشتیم را مجدد ویرایش کرده و نسخه جدید اپلیکیشن را به کاربران عرضه کنیم. در این مبحث نحوه باز کردن یا ایمپورت کردن سورس پروژه‌های اندرویدی را به طور کامل بررسی می‌کنیم.

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

گزینه های ایمپورت کردن سورس پروژه اندرویدی در اندروید استودیو

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

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

Open: از این گزینه برای ایمپورت و باز کردن پروژه‌هایی استفاده می‌شود که قبلا هم در محیط توسعه اندروید استودیو ساخته شده‌ است.
Get from VCS: کارکرد این گزینه مشابه مورد قبلی یعنی Open بوده با این تفاوت که برای ایمپورت پروژه از مخازن VCS مانند مخازن آنلاین GitHub و GitLab مورد استفاده قرار می‌گیرد.
Import project (Gradle, Eclipse ADT, etc): چنانچه پروژه‌ای که قصد استفاده از آن را داریم در محیط دیگری غیر از Android Studio (بخصوص Eclipse) ساخته شده می‌بایست از این گزینه برای ایمپورت و تبدیل آن به پروژه‌ای با ساختار اندروید استودیو استفاده کنیم.
Import an Android code sample: از این گزینه برای وارد کردن Sample code یا نمونه کدهای اندروید استفاده می‌شود که خارج از این مبحث بوده و به همین اشاره کلی اکتفا می‌کنیم.

تفاوت پروژه‌ی ساخته شده در محیط اکلیپس و اندروید استودیو

قبل از پرداختن به گزینه‌های فوق بهتر است ابتدا به بررسی تفاوت پروژه‌های ساخته شده در دو محیط اکلیپس و اندروید استودیو بپردازیم.
احتمالا اولین سوالی که به ذهنتان رسید این است که تفاوت یک پروژه ساخته شده در محیط توسعه Eclipse با پروژه‌ای که توسط Android Studio ایجاد شده در چیست و چطور باید تشخیص بدهیم پروژه‌ای که از یک وب سایت دانلود کرده‌ایم در کدام محیط توسعه ساخته شده است؟
تشخیص این دو از یکدیگر بسیار ساده است. کافی است به ساختار پروژه نگاه بیندازید. به دو تصویر زیر دقت کنید:

یک پروژه اندرویدی ساخته شده در محیط Eclipse ADT
یک پروژه اندرویدی ساخته شده در محیط Eclipse ADT
یک پروژه اندرویدی ساخته شده در محیط Android Studio
یک پروژه اندرویدی ساخته شده در محیط Android Studio

تصویر نخست مربوط به یک پروژه اکلیپس است در حالی که تصویر دوم یک پروژه ساخته شده در اندروید استودیو را نشان می‌دهد. واضح‌ترین تفاوت این دو، وجود فولدر و فایل‌هایی است که در نامگذاری آنها کلمه gradle بکار رفته.
با بیلد سیستم گریدل در مباحث ابتدایی آشنا شدیم و می‌دانیم این بیلد سیستم در اندروید استودیو بکار رفته بنابراین پروژه‌ای که حاوی فایل‌های مرتبط با gradle باشد در محیط اندروید استودیو ساخته شده و در غیر اینصورت مربوط به اکلیپس است.

روش‌های import (ایمپورت) سورس پروژه در اندروید استودیو

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

import کردن پروژه‌ی اندروید استودیو

گزینه‌های شماره ۱ و ۲ مربوط به پروژه‌هایی می‌شود که در محیط اندروید استودیو ساخته و توسعه داده شده‌اند.
۱٫ Open: این گزینه برای باز کردن (ایمپورت کردن) پروژه‌هایی استفاده می‌شود که قبلا در محیط اندروید استودیو ساخته شده و یک نسخه از آن را در اختیار داریم. اینکه پروژه مربوط به خودمان باشد یا آنرا از منبع دیگری دانلود کرده باشیم اهمیتی ندارد.
با کلیک بر روی این گزینه و انتخاب پوشه مربوط به پروژه، فرایند Build (ساخته شدن) پروژه آغاز می‌شود:

باز کردن پروژه اندروید استودیو
باز کردن پروژه اندروید استودیو

همانطور که در تصویر بالا مشاهده می‌کنید تمامی سورس پروژه‌های لیست شده، دارای آیکون و نماد اندروید استدیو هستند که نشان می‌دهد این پروژه‌ها قبلا در همین IDE ساخته شده اند. در صورتی که پروژه مربوط به محیط Eclipse یا سایر موارد باشد، بجای نماد اندروید استودیو، آیکون یک پوشه عادی نمایش داده می‌شود.
در حال حاضر و با توجه به اینکه حدود ۷ سال از انتشار اولین نسخه پایدار اندروید استودیو گذشته تقریبا تمامی سورس‌های قابل استفاده موجود در سطح وب توسط این IDE ساخته شده است. سورس‌های قدیمی که در محیط اکلیپس ساخته شده احتمالا آنقدر قدیمی هستند که به دلیل بروز تغییرات متعدد در کتابخانه‌های اندرویدی و کدها، دیگر قابل استفاده نخواهند بود (مگر با درد و خونریزی فراوان!).
من در حدود ۶ ماه قبل از تهیه آموزش فعلی، پروژه‌ای با نام ReceiveSMS ساخته بودم که مربوط به آموزش دریافت SMS در برنامه نویسی اندروید می‌شود. حالا فرض می‌کنیم قصد دارم این پروژه را دوباره باز کرده و تغییراتی را روی آن اعمال کنم. این پروژه را انتخاب کرده و سپس با زدن OK عملیات ساخت پروژه در محیط اندروید استودیو آغاز می‌گردد.
ابتدا دیالوگی مانند تصویر زیر ظاهر می‌شود که از ما می‌خواهد ایمن بودن سورس را تایید یا رد کنیم:

پیغام Trust Gradle Project
پیغام Trust Gradle Project

من از ایمن بودن سورس پروژه و اینکه حاوی کدهای مخرب نیست، اطمینان دارم بنابراین گزینه Trust Project را انتخاب می‌کنم. چنانچه به هر دلیل این اطمینان را نداشته باشیم، با انتخاب گزینه Stay in Safe Mode پروژه در محیط امن و ایزوله اجرا خواهد شد.

شروع فرایند دانلود ابزار مورد نیاز پروژه از مخزن آنلاین
شروع فرایند دانلود ابزار مورد نیاز پروژه از مخزن آنلاین

پس از ورود به محیط اصلی اندروید استودیو، بلافاصله عملیات دریافت ابزار و کتابخانه‌های مورد نیاز پروژه‌ای که ایمپورت کرده‌ایم آغاز می‌شود.
مطابق تصویر فوق مشاهده می‌کنید در تب Build اروری ظاهر شده که می‌گوید فرایند نصب ابزار gradle-6.7.1-bin.zip قابل انجام نیست. علت دریافت این ارور عدم اتصال سیستم من به اینترنت بود.
بنابراین اگر اتصال اینترنت را برقرار و پروژه را سینک کنم (گزینه Sync project with Gradle files در نوار تولبار اندروید استودیو) فرایند دریافت فایل gradle-6.7.1-bin.zip آغاز خواهد شد.
علت نیاز به دریافت این نسخه از بیلد سیستم Gradle در تفاوت نسخه نصب شده در اندروید استودیو فعلی من با نسخه‌ای است که قبلا این پروژه توسط آن ساخته شده است. در حال حاضر Gradle 7.0.2 روی اندروید استودیو من نصب شده که از Gradle 6.7.1 جدیدتر است.
در اینجا ۲ انتخاب داریم. انتخاب اول این است که اتصال اینترنت را برقرار کرده و اجازه دهم گریدل و سایر ابزار و کتابخانه‌های موجود در سورس با همان نسخه‌ای که قبلا تعریف شده دانلود شود. و انتخاب دوم اینکه قبل از ایمپورت کردن پروژه، گریدل و سایر ابزار را بر اساس نسخه موجود در اندروید استودیو خودمان ویرایش کنیم.
به دو دلیل، انتخاب دوم منطقی‌تر خواهد بود. دلیل اول اینکه بهتر است پروژه با ابزار و کتابخانه‌های جدید Build شود تا بیشترین سازگاری را با دستگاه‌های اندرویدی جدید داشته باشد. و دلیل دوم عدم نیاز به دریافت چند ده مگابایت فایل برای ایمپورت هر پروژه است که صد البته دلیل اول از اهمیت بسیار بالاتری برخوردار خواهد بود.
بنابراین فعلا اندروید استودیو را می‌بندم و به سراغ پوشه سورس پروژه می‌روم. قصد دارم اصلاحات لازم بر روی پروژه را توسط یک ویرایشگر ساده مانند Notepad++ انجام دهم.

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

ساده ترین راه برای اینکه بدانیم در حال حاضر چه نسخه‌ای از ابزار در اندروید استودیو نصب هستند، ساخت یک پروژه جدید و سپس مقایسه فایل‌های دو پروژه با یکدیگر است.
مطابق آموزش ساخت پروژه‌ جدید در اندروید استودیو یک پروژه جدید با نام دلخواه Test می‌سازم. البته اگر به تازگی پروژه‌ای ساخته‌اید می‌توانید از فایل‌های آن کمک بگیرید و نیازی به ساخت پروژه دیگری نیست.
– فایل build.gradle(project): در قدم نخست، فایل build.gradle دو پروژه را با یکدیگر مقایسه می‌کنم:

اصلاح نسخه پلاگین Gradle

اصلاح نسخه پلاگین Gradle
اصلاح نسخه پلاگین Gradle

همانطور که در تصاویر مشاهده می‌کنید، عدد نسخه مربوط به پلاگین گریدل (com.android.tools.build:gradle) در دو پروژه متفاوت است. این عدد برای پروژه قدیمی که قصد ایمپورت آن را دارم ۴٫۲٫۱ و برای پروژه جدید ۷٫۰٫۳ است. بنابراین تنها کاری که در این فایل انجام می‌دهم، جایگزین کردن عدد ۷٫۰٫۳ با ۴٫۲٫۱ در build.gradle پروژه ReceiveSMS خواهد بود.
تغییر دیگری که در build.gradle این دو پروژه مشاهده می‌شود، حذف بلاک allprojects در پروژه جدید است. بودن یا نبودن این بلاک تاثیری در عملکرد این پروژه ندارد اما با اینحال ترجیح می‌دهم ساختار پروژه بیشترین شباهت را به پروژه‌ای داشته باشد که به تازگی در اندروید استودیو ساخته‌ام. بنابراین این بلاک را هم حذف می‌کنم.
در واقع با جایگزین کردن عدد مربوط به نسخه پلاگین گریدل و حذف بلاک allprojects، فایل build.gradle دو پروژه کاملا شبیه یکدیگر شده و درست مانند این است که فایل موجود در پروژه Test را جایگزین فایل موجود در پروژه ReceiveSMS کرده باشم.
اما به دلیل جلوگیری از بروز اشتباه، از جایگزین کردن کامل فایل‌ها صرف نظر می‌کنم. بخصوص در فایل‌های دیگرِ پروژه که حاوی جزئیات و کدهای مختص به هر پروژه بوده (مانند نام پکیج پروژه) که جایگزینی کامل فایل سبب بروز مشکلات متعددی خواهد شد.

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

– فایلgradle-wrapper.properties: در قدم بعد، فایل gradle-wrapper.properties در مسیر gradle > wrapper دو پروژه را با یکدیگر مقایسه می‌کنم:

اصلاح gradle-wrapper.properties

اصلاح gradle-wrapper.properties
اصلاح gradle-wrapper.properties

تصویر اول مربوط به پروژه قدیمی و تصویر دوم مربوط به پروژه جدید است. اگر بخاطر داشته باشید در ابتدای جلسه که قبل از ویرایش سورس، پروژه را ایمپورت کردیم بلافاصله با اخطار عدم دسترسی به مخزن آنلاین جهت دریافت gradle-6.7.1-bin.zip مواجه شدیم.
آدرس دریافت این فایل که مربوط به بیلد سیستم گریدل است اینجا تعریف شده. کافیست لینک فایل موجود در فایل مربوط به پروژه جدید را جایگزین لینک موجود در فایل سورس قدیمی کنیم تا از شر آن ارور راحت شویم و نیازی به دانلود گریدل نسخه قدیمی نباشد.
البته با توجه به اینکه در این دو فایل نیز تنها تفاوت مربوط به نسخه گریدل موجود در لینک دریافت فایل هست، می‌شد به راحتی فایل را جایگزین کرد. اما شاید یک ماه بعد از تهیه این آموزش، توسعه دهندگان Android Studio تصمیم بگیرند در این فایل تغییر دیگری هم لحاظ کنند که در اینصورت احتمالا با جایگزین کردن فایل با مشکل مواجه خواهیم شد.
– فایلbuild.gradle(app): در مرحله بعد باید فایل build.gradle درون فولدر app پروژه را اصلاح کنم. این همان build.gradle (Module:app) است. فایل هردو پروژه را باز می‌کنم:

اصلاح فایل build.gradle(app)

اصلاح فایل build.gradle(app)
اصلاح فایل build.gradle(app)

جزئیات مربوط به این فایل را قبلا در مبحث آموزش ساخت فایل نصبی APK توضیح داده‌ام. چه تفاوت‌هایی را در این دو تصویر مشاهده می‌کنید؟ علاوه بر اعداد مربوط به نسخه ابزار SDK، عناوین مربوط به آنها نیز تغییر کرده است.
آیتم compileSdkVersion در سورس پروژه قدیمی تبدیل به compileSdk در پروژه جدید شده است. همچنین buildToolsVersion به کلی از این فایل حذف شده و در فایل پروژه جدید وجود ندارد. البته این به معنای عدم استفاده از ابزار Build Tools نیست.
ظاهرا توسعه دهندگان اندروید استودیو اخیرا به این نتیجه رسیده‌اند که به صورت پیش فرض از آخرین نسخه بیلد تولز موجود در SDK برای بیلد شدن پروژه استفاده شود؛ بدون ذکر نسخه آن در سورس پروژه.
یعنی چنانچه در تنظیمات پروژه (File > Project Structure و یا گزینه Project Structure در نوار ابزار اصلی اندروید استودیو) نسخه مشخصی از Build Tools را برای پروژه جدید خود تعریف کنید، این آیتم به فایل build.gradle اضافه خواهد شد:

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

با انجام این کار، buildToolsVersion به بلاک android (البته انتهای بلاک) اضافه شد:


android {
    compileSdk 31

    defaultConfig {
        applicationId "ir.android_studio.tesssst"
        minSdk 16
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    buildToolsVersion '31.0.0'
}
تذکر: توجه داشته باشید شما نیازی به انجام این کار و تعیین نسخه buildToolsVersion ندارید و این توضیحات صرفا جهت آشنایی بیشتر شما با ساختار پروژه اندرویدی بود.

دو مورد minSdkVersion و targetSdkVersion هم مانند compileSdk خلاصه شده و کلمه Version از انتهای آنها حذف شده است.
البته چیزی که ما در اینجا باید تغییر دهیم نام آیتم‌ها نیست و خود اندروید استودیو در هنگام ایمپورت پروژه این تغییرات را اعمال می‌کند. مگر آنگه مثل من مقداری وسواسی باشید و دلتان بخواهد قبل از وارد کردن پروژه به محیط اندروید استودیو این تغییرات را هم خودتان به صورت دستی اعمال نمائید!
بنابراین اگر حوصله انجام کار اضافی را ندارید به تغییر عدد مقابل هرکدام اکتفا کنید. یعنی عدد ۳۰ مربوط به آیتم compileSdkVersion را به ۳۱ تغییر می‌دهم. و به همین ترتیب برای دو آیتم دیگر یعنی minSdkVersion و targetSdkVersion.
عدد مقابل compileSdk نسخه‌ای از API که پروژه با آن کامپایل خواهد شد را تعیین می‌کند بنابراین عموما آنرا بر روی جدیدترین API منتشر شده تنظیم می‌کنیم تا بیشترین سازگاری را با دستگاه‌های اندرویدی جدید داشته باشد.
نسخه targetSdk هم معمولا با نسخه compileSdk به صورت برابر تعیین می‌شود. بنابراین برای این آیتم هم عدد ۳۱ را جایگزین ۳۰ می‌کنم.
البته حتما می‌دانید آیتم minSdk مربوط به حداقل نسخه‌ای از اندروید است که می‌خواهیم برنامه ما از آن پشتیبانی کند و بر خلاف دو مورد قبل، در اینجا ما به عدد موجود در پروژه جدید کاری نداریم و آنرا بر اساس ساختار پروژه خود تعیین می‌کنیم.
برای مثال ممکن است در پروژه خود از کد یا کتابخانه‌ای استفاده کنیم که فقط در API 19 و به بالا پشتیبانی می‌شود.
بلاک release موجود در بلاک buildTypes مربوط به تنظیمات کاهش حجم خروجی برنامه و مبهم سازی کدها می‌باشد که در جلسه آموزش بهینه سازی و محافظت از سورس پروژه اندرویدی به طور مفصل به این مقوله پرداخته شده.
در بلاک compileOptions نسخه‌ای از Java که پروژه توسط آن کامپایل می‌شود تعریف شده. همانطور که مشاهده می‌کنید در هردو پروژه جاوا ۱٫۸ (JavaVersion.VERSION_1_8) استفاده شده بنابراین تغییری نیاز نیست.
و آخرین قسمت این فایل یعنی بلاک dependencies که شامل کتابخانه‌های استفاده شده در پروژه می‌شود. شاید مثل قسمت‌های قبل، این قسمت را نتوان به طور کامل اصلاح نمود.
برای مثال در هر پروژه از کتابخانه‌های متفاوتی استفاده می‌شود. ممکن است سورس پروژه‌ای که قصد ایمپورت آنرا دارید از کتابخانه Retrofit برای اتصال به وب سرویس استفاده کرده باشد در حالی که در پروژه جدید و خامی که صرفا برای مقایسه ساختار اصلی دو پروژه ساخته‌اید این کتابخانه وجود ندارد.
همچنین چنانچه سورس پروژه قبلی بر پایه support نوشته شده باشد، صرف اصلاح نام کتابخانه‌ها در بلاک dependencies موجب ارتقاء به androidX نمی‌شود و لازم است این ارتقاء و مهاجرت به صورت خودکار و در خود اندروید استودیو انجام شود که در جلسه آموزش مهاجرت به AndroidX به این مسئله مفصل پرداخته شده است.
بنابراین ویرایش این قسمت را می‌توان محدود به نسخه کتابخانه‌های پیش فرض و مشترک دانست. برای مثال در پروژه ReceiveSMS برای کتابخانه androidx.appcompat:appcompat نسخه ۱٫۳٫۰ قید شده که در پروژه جدید به ۱٫۳٫۱ ارتقاء پیدا کرده است.
همچنین کتابخانه androidx.constraintlayout:constraintlayout از ۲٫۰٫۴ به ۲٫۱٫۲ تغییر کرده است. اگر با کتابخانه ConstraintLayout آشنایی ندارید توصیه می‌کنم آموزش طراحی رابط کاربری اندروید با ConstraintLayout را مطالعه کنید.
چنانچه این اعداد را ویرایش نکنم، هنگام باز کردن پروژه، اندروید استودیو ابتدا سعی در دریافت نسخه قدیمی این کتابخانه‌ها را خواهد داشت و پس از دریافت آن، اخطاری نمایش خواهد داد مبنی بر اینکه شما در حال استفاده از نسخه قدیمی این کتابخانه‌ها هستید!
پس چه بهتر که همینجا گربه را دم حجله بکشیم و با ویرایش نسخه این کتابخانه و سایر کتابخانه‌های پیش فرض پروژه‌های اندرویدی، از اتلاف زمان بعد از ایمپورت پروژه جلوگیری کنیم.
تفاوت دیگری که البته در این دو پروژه وجود ندارد و مربوط به سورس‌های حدود ۲ سال قبل از بروزرسانی این آموزش (یعنی حدود سال ۱۳۹۸) می‌شود، جایگزینی واژه compile با implementation برای کتابخانه‌هاست.
یک کتابخانه را مثال می‌زنم:

compile 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.appcompat:appcompat:1.3.1'

خط اول برای پروژه‌های بسیار قدیمی است که در نسخه ۳ اندروید استودیو compile با implementation جایگزین شد. البته در عمل تقریبا هیچ اتفاقی صورت نگرفته و صرفا تغییر عنوان است و نیازی هم نیست اینها را خودمان اصلاح کنیم.
اگر به طور کل قصد استفاده از ابزار تست را برای پروژه خود ندارید بهتر است این چند خط را کاملا حذف کنید:

testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

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

build.gradle(Module:app)

plugins {
    id 'com.android.application'
}

android {
    compileSdk 31

    defaultConfig {
        applicationId "ir.android_studio.receivesms"
        minSdk 16
        targetSdk 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.2'

}

خب! تا اینجای کار هردو فایل build.gradle و همچنین gradle-wrapper.properties پروژه را اصلاح کردیم. حالا دوباره اندروید استودیو را اجرا کرده و توسط گزینه Open پروژه ReceiveSMS را انتخاب می‌کنم.
اینبار بدون معطلی و عدم نیاز به دریافت گریدل و سایر ابزاری که نسخه‌ای متفاوت از ابزار نصب شده بر روی سیستم ما داشته باشند، پروژه ایمپورت و آماده کار شد:

باز کردن پروژه در Android Studio بعد از اصلاح آن
باز کردن پروژه در Android Studio بعد از اصلاح آن
نکته: اگر ساختار پروژه در سمت چپ برنامه نمایش داده نمی‌شود کافیست روی گزینه Project در نوار عمودی سمت چپ کلیک کنید.
نکته: مجدد تاکید می‌کنم چنانچه پروژه شما دارای کتابخانه‌های متعددی باشد احتمالا باز هم در این مرحله لازم است صبر کنید تا فایل‌های مربوط به این کتابخانه‌ها از مخزن آنلاین گوگل دریافت شود. اما نکته مثبت اینجاست که برای دریافت نسخه قدیمی Gradle و سایر کتابخانه‌هایی که قبلا در کش اندروید استودیو ذخیره شده لازم نیست زمان و پهنای باند هدر دهیم.
نکته: چنانچه در دریافت کتابخانه‌ها و یا ابزار SDK به دلیل تحریم IP های ایران با مشکل دست و پنجه نرم می‌کنید توصیه می‌کنم حتما مبحث پپروکسی برای دور زدن تحریم اندروید استودیو را مطالعه کنید.
نکته: همیشه نیازی به ایمپورت کردن پروژه‌ها نیست. برخی سورس‌ها (از جمله سورس‌ پروژه‌های آموزشی موجود در وب سایت ما) معمولا صرفا یک یا دو اکتیویتی دارند که بجای ایمپورت آن می‌توان یک پروژه جدید ساخت و محتوای اکتیویتی‌ها و همچنین کتابخانه‌های بکار رفته را با محتوای پیش فرض پروژه (فایل‌های xml و java) جایگذاری کرد.

۲٫ Get from VCS: پرداخت به VCS (Version Controlling System) از حوصله این آموزش خارج است. خلاصه اینکه برای ایمپورت کردن مستقیم سورس پروژه‌هایی که روی مخازن VCS میزبانی می‌شود از این گزینه می‌توان استفاده کرد.
مخازن Git از پرکاربردترین مخازن VCS هستند که GitHub و GitLab از معتبرترین مخازن گیت آنلاین به شمار می‌روند.
بنابراین چنانچه بخواهیم سورس پروژه‌ای را استفاده کنیم که بر روی یکی از این مخازن موجود هست، نیازی به دانلود دستی و سپس ایمپورت آن توسط گزینه Open نبوده و به طور مستقیم از طریق این گزینه از مخزن مربوطه دریافت و ایمپورت می‌شود.
با کلیک روی گزینه Get from VCS پنجره زیر باز می‌شود:

ایمپورت کردن پروژه اندرویدی از مخزن Git
ایمپورت کردن پروژه اندرویدی از مخزن Git

در منوی سمت چپ سه گزینه وجود دارد که Repository URL در حالت پیش فرض انتخاب شده. دو گزینه دیگر مربوط به مخزن GitHub است که با ورود به حساب کاربری در گیت هاب می‌توان به سورس‌هایی که در اکانت خودمان میزبانی شده دسترسی ساده‌تر داشت.
با گزینه‌های گیت هاب کاری نداریم. فرض می‌کنیم می‌خواهیم سورس پروژه اندرویدی که توسط شخص یا تیم دیگری توسعه داده شده و بر روی یک مخزن VCS موجود هست را استفاده کنیم.
در قسمت Version Control به صورت پیش فرض Git انتخاب شده که سه گزینه دیگر شامل Google Cloud، Mercurial و Subversion هم قابل استفاده است.
من قصد دارم یک پروژه اندرویدی که توسط شخص دیگری توسعه داده شده و آنرا بر روی اکانت GitHub خود منتشر کرده را ایمپورت کنم.
این سورس مربوط به برنامه‌ای است که تصاویر را به فایل PDF تبدیل می‌کند. این پروژه با نام Images to PDF و در آدرس زیر منتشر شده است:

https://github.com/Swati4star/Images-to-PDF

تصویر زیر مربوط به صفحه این سورس در گیت هاب است:

ایمپورت کردن پروژه اندرویدی از GitHub
ایمپورت کردن پروژه اندرویدی از GitHub

همانطور که ساختار پروژه نشان می‌دهد، این سورس توسط بیلد سیستم گریدل ساخته شده بنابراین مربوط به محیط توسعه اندروید استودیو می‌باشد.
برای ایمپورت پروژه کافیست URL مربوط به Git پروژه که به پسوند .git ختم شده را کپی کرده و در فیلد Git در اندروید استودیو قرار دهیم:

آدرس git سورس پروژه اندرویدی
آدرس git سورس پروژه
وارد کردن آدرس git سورس پروژه در اندروید استودیو
وارد کردن آدرس git سورس پروژه در اندروید استودیو

در فیلد Directory محل مربوط به ذخیره پروژه تعیین می‌شود. در پایان روی دکمه Clone کلیک می‌کنم تا پروژه کلون و محیط پروژه باز شود.

فرایند کلون شدن سورس گیت در اندروید استودیو
فرایند کلون شدن سورس گیت در اندروید استودیو

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

نکته: به هر دلیلی چنانچه بخواهید سورس پروژه را به صورت دستی دانلود کرده و سپس ایمپورت کنید، بجای استفاده از آدرس git پروژه بر روی گزینه Download Zip کلیک کنید تا فایل زیپ سورس دانلود شود.
نکته: با توجه به اینکه در این حالت، سورس پروژه به صورت مستقیم از مخزن دریافت می‌شود، قبل از ایمپورت شدن پروژه دسترسی به سورس نخواهیم داشت. بنابراین بر خلاف قسمت قبل، در این حالت نمی‌توانیم نسخه گریدل و سایر ابزار را قبل از ایمپورت اصلاح کنیم و ناچارا باید اجازه دهیم تا همان نسخه‌ای که در سورس تعریف شده دانلود شود و سپس نسبت به ویرایش سورس در محیط اندروید استودیو اقدام کنیم.
البته بعد از اتمام فرایند دریافت سورس از مخزن و هنگام شروع فرایند دریافت ابزار مورد نیاز پروژه می‌توان آنرا متوقف و سپس پروژه را اصلاح نمود تا از دانلود فایل‌های اضافی جلوگیری بعمل آید.
نکته: بعد از ایمپورت شدن پروژه و یا هنگام اجرای آن روی دیوایس اندرویدی ممکن است خطاهای متعددی دریافت کنید که لازم است موارد را به دقت بررسی، ترجمه و رفع نمائید. چنانچه علت خطا و نحوه رفع آن را از متن خطا متوجه نشدید ساده‌ترین راه جستجوی آن در گوگل است.
اکثر خطاها قبلا در وب سایت‌هایی مانند Stackoverflow.com مطرح و توسط افراد با تجربه پاسخ داده شده است.
برای مثال یکی از خطاهایی که من اخیرا در ایمپورت یک پروژه دریافت کردم ارور زیر بود:

Manifest merger failed : android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required to specify an explicit value for 'android:exported' when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details

در متن این ارور گفته شده برای اپلیکیشن‌هایی که برای اندروید ۱۲ و یا بالاتر ساخته شده یا به عبارتی targetSdk 31 به بالا تعریف شده، لازم است در تگ‌های activity موجود در مانیفست پروژه که دارای intent filter هستند، یک ویژگی با نام android:exported و با یک مقدار true یا false اضافه شود.
یک لینک هم در انتهای متن اخطار قید شده که مربوط به توضیحات بیشتر این مساله است.
در برخی موارد توضیحات موجود در مستندات اندروید برای غیر حرفه‌ای ها مقداری گنگ خواهد بود که شاید با جستجوی ارور در گوگل و مطالعه بحث‌های پیرامون آن در stackoverflow و سایر نتایجی که در گوگل نمایش داده می‌شود بهتر به نتیجه برسید.

import کردن پروژه‌ی اکلیپس (ADT) در اندروید استودیو

در اواخر سال ۲۰۲۱ که در حال بروزرسانی این آموزش هستم، کمتر پروژه‌ای را می‌توان یافت که مربوط به محیط توسعه اکلیپس یا ADT باشد. با اینحال لازم می‌دانم یک اشاره کلی هم به این مساله داشته باشم. بنابراین گزینه سوم را در این بخش بررسی می‌کنیم.
۳٫ Import project (Gradle, Eclipse ADT, etc.): برای این قسمت من از یک پروژه تحت اکلیپس استفاده می‌کنم که حدود ۶ سال قبل آنرا دانلود کرده بودم. روی گزینه Import project کلیک کرده و پوشه مربوط به پروژه را انتخاب می‌کنم:

ایمپورت کردن سورس Eclipse ADT در اندروید استودیو
ایمپورت کردن سورس Eclipse ADT در اندروید استودیو

ملاحظه می‌کنید بر خلاف قسمت قبل که پروژه ReceiveSMS با نماد اندروید استودیو نمایش داده شده بود، در اینجا آیکون یک پوشه عادی را نشان می‌دهد.
از آنجایی که ساختار این پروژه با ساختار پروژه اندروید استودیو متفاوت است، در فرایند ایمپورت، این ساختار به طور کامل دگرگون می‌شود. لذا برای از بین نرفتن نسخه اصلی پروژه، هنگام ایمپورت پروژه‌های ADT، اندروید استودیو یک مسیر جداگانه برای ذخیره نسخه جدید ایجاد می‌کند و پوشه‌ی اصلی پروژه بدون تغییر باقی می‌ماند.
با انتخاب و تایید پروژه، به صفحه بعد منتقل می‌شود که در اینجا محل ذخیره نسخه ایمپورت شده پروژه را باید در قسمت Import Destination Directory تعیین کنیم:

تعیین محل ذخیره سورس تبدیل شده اکلیپس به اندروید استودیو
تعیین محل ذخیره سورس تبدیل شده اکلیپس به اندروید استودیو

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

تنظیمات ایمپورت پروژه Eclipse در Android Studio
تنظیمات ایمپورت پروژه Eclipse در Android Studio

در این مرحله چند آپشن وجود دارد که همگی به صورت پیش فرض تیک خورده و بهتر است به همین صورت باقی بماند. به عنوان مثال گزینه اول، فایل محلی کتابخانه‌ها را حذف و نسخه دریافتی از مخزن آنلاین گوگل را جایگزین می‌کند.
در نهایت با کلیک روی دکمه Finish فرایند ایمپورت پروژه در مسیر تعیین شده آغاز می‌شود. البته با توجه به قدیمی بودن سورس، درگیری‌های زیادی برای رفع خطاها و سازگار کردن پروژه با محیط اندروید استودیو خواهید داشت.
این قسمت ممکن است آنقدر زجر آورد باشد که کاملا قید استفاده از سورس یک پروژه قدیمی را بزنید!
توجه داشته باشید تغییراتی که طی فرایند تبدیل پروژه Eclipse ADT به یک پروژه سازگار با محیط توسعه جدید انجام شده در فایل import-summary.txt موجود در پوشه پروژه لیست شده است و می‌تواند راهنمای خوبی برای آگاهی از شیوه اعمال تغییرات در ساختار پروژه باشد.

دانلود فایل این آموزش با فرمت PDF
تعداد صفحات : ۲۹
حجم : ۲ مگابایت
قیمت : رایگان
تاریخ بروزرسانی آموزش : ۱۴۰۰/۰۹/۲۲
دانلود رایگان با حجم ۲ مگابایت لینک کمکی
این مطلب چقدر برایتان مفید بود؟ لطفا امتیاز دهید
4.4/5 - (9 امتیاز)
پرسش‌ها و دیدگاه‌های کاربران
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

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

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

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

  • فاطمه رضاخانی گفت:

    من وقتی می خوام apk بگیرم این خطا می دهد
    Failed to install the following Android SDK packages as some licences have not been accepted.
    build-tools;30.0.2 Android SDK Build-Tools 30.0.2
    To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
    Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html

    Using Android SDK: C:\Users\F.Rezakhani\AppData\Local\Android\Sdk

  • فرزاد عسکری گفت:

    سلام مهندس خسته نباشین/این بخش رو خوندم و تمامی اصلاحات رو انجام دادم ولی بازم داره ارور میده مشکل گریدل و کتابخانه به احتمال زیاد داره/
    https://s4.uupload.ir/files/1_l1ln.png
    https://s4.uupload.ir/files/2_ldfy.png

    • سیدمهدی مطهری گفت:

      بزرگوار اگه بخواید هر اروری که میگیرید رو اینجا یا جای دیگه ای مطرح کنید و یکی دو روز منتظر جواب بمونید که تا ۵ سال هم به جایی نمیرسید. هر اروری که شما میگیرید قبلا برای ۰زاران نفر دیگه هم اتفاق افتاده که کافیه داخل گوگل سرچ کنید تا به جواب برسید. معمولا نتیجه اول جستجوها مربوط به stackoverflow.com هستن

  • حسن نژاد گفت:

    سلام ببخشید چطور میتونم اندرویدx رو در ورژن های ۳ به بالا غیرفعال کنم؟

  • محمد گفت:

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

  • محمد.ک گفت:

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

    • سیدمهدی مطهری گفت:

      نیازی نیست پروژتون رو برای کسی ارسال کنید. ارورها رو یکی یکی سرچ کنید تا ببینید ایراد مربوط به چی هست و رفعش کنید. هر اروری که گرفتید قبلا هزاران نفر دیگه هم باهاش روبرو شدن و در وب سایتهایی مثل stackoverflow.com مطرح شده

  • محمد.ک گفت:

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

  • امیر گفت:

    باسلام وعرض خسته نباشید خدمت شما . راستش مشکلی که داشتم اینه که وقتی یه سورس اندروید استودیو رو ایمپورت می کنم عبارت “no render traget select ” رو نشون می ده و اون بالا گوشه به جای شمارهAPI نوشته “null ” حالا من می دونم که احتمالا مشکل ازمشخص نبودن API است حالا چطوری مشکل رو حل کنم یعنی به جای عبارت “null ” مثلا عبارت “API 19” جایگزین شود خواهشا کمک کنید…

  • پویا گفت:

    سلام
    سورسی که از طریق دی کامپایل کردن فایل apk داریم میشه از این روش ویرایش و اجرا کرد؟

  • mayDeveloper گفت:

    سلام و عرض ادب خدمت جناب استاد مطهری؛

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

    سپاسگزار…

  • احسان گفت:

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

  • arianhosseini گفت:

    موفق باشید ????