افزونه اندروید گریدل ۳.۶.۰ (فوریه ۲۰۲۰)

این نسخه از افزونه اندروید به موارد زیر نیاز دارد:

حداقل نسخه نسخه پیش‌فرض یادداشت‌ها
گرادل ۵.۶.۴ ۵.۶.۴ برای کسب اطلاعات بیشتر، به به‌روزرسانی Gradle مراجعه کنید.
ابزارهای ساخت SDK ۲۸.۰.۳ ۲۸.۰.۳ ابزارهای ساخت SDK را نصب یا پیکربندی کنید .

۳.۶.۴ (ژوئیه ۲۰۲۰)

این به‌روزرسانی جزئی از سازگاری با تنظیمات پیش‌فرض جدید و ویژگی‌های مربوط به قابلیت مشاهده بسته در اندروید ۱۱ پشتیبانی می‌کند.

برای جزئیات بیشتر به یادداشت‌های انتشار ۴.۰.۱ مراجعه کنید.

ویژگی‌های جدید

این نسخه از افزونه Android Gradle شامل ویژگی‌های جدید زیر است.

مشاهده اتصال

اتصال View هنگام ارجاع به viewها در کد شما، ایمنی زمان کامپایل را فراهم می‌کند. اکنون می‌توانید findViewById() با مرجع کلاس اتصال خودکار تولید شده جایگزین کنید. برای شروع استفاده از اتصال View، موارد زیر را در فایل build.gradle هر ماژول وارد کنید:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

برای کسب اطلاعات بیشتر، مستندات View Binding را مطالعه کنید.

پشتیبانی از افزونه Maven Publish

افزونه Android Gradle شامل پشتیبانی از افزونه Maven Publish Gradle است که به شما امکان می‌دهد مصنوعات ساخت را در مخزن Apache Maven منتشر کنید. افزونه Android Gradle برای هر مصنوع نوع ساخت در ماژول برنامه یا کتابخانه شما یک کامپوننت ایجاد می‌کند که می‌توانید از آن برای سفارشی‌سازی یک انتشار در مخزن Maven استفاده کنید.

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

ابزار بسته‌بندی پیش‌فرض جدید

هنگام ساخت نسخه اشکال‌زدایی برنامه شما، افزونه از یک ابزار بسته‌بندی جدید به نام zipflinger برای ساخت APK شما استفاده می‌کند. این ابزار جدید باید بهبود سرعت ساخت را فراهم کند. اگر ابزار بسته‌بندی جدید آنطور که انتظار دارید کار نمی‌کند، لطفاً اشکال را گزارش دهید . می‌توانید با وارد کردن موارد زیر در فایل gradle.properties خود، به استفاده از ابزار بسته‌بندی قدیمی برگردید:

        android.useNewApkCreator=false
      

انتساب ساخت بومی

اکنون می‌توانید مدت زمانی که Clang برای ساخت و پیوند هر فایل C/C++ در پروژه شما صرف می‌کند را تعیین کنید. Gradle می‌تواند یک ردیابی Chrome که حاوی مهرهای زمانی برای این رویدادهای کامپایلر است را خروجی دهد تا بتوانید زمان مورد نیاز برای ساخت پروژه خود را بهتر درک کنید. برای خروجی گرفتن از این فایل نسبت ساخت، موارد زیر را انجام دهید:

  1. هنگام اجرای یک نسخه Gradle، پرچم -Pandroid.enableProfileJson=true را اضافه کنید. برای مثال:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. مرورگر کروم را باز کنید و در نوار جستجو chrome://tracing را تایپ کنید.

  3. روی دکمه‌ی بارگذاری کلیک کنید و برای یافتن فایل به <var>project-root</var>/build/android-profile بروید. نام فایل profile-<var>timestamp</var>.json.gz است.

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

ردیابی انتساب ساخت بومی در کروم

تغییرات رفتاری

هنگام استفاده از این نسخه از افزونه، ممکن است با تغییرات رفتاری زیر مواجه شوید.

کتابخانه‌های بومی به طور پیش‌فرض فشرده نشده بسته‌بندی شده‌اند

وقتی برنامه خود را می‌سازید، افزونه اکنون extractNativeLibs به طور پیش‌فرض روی "false" تنظیم می‌کند. یعنی کتابخانه‌های بومی شما به صورت غیرفشرده در صفحه قرار می‌گیرند و بسته‌بندی می‌شوند. اگرچه این منجر به حجم آپلود بیشتر می‌شود، کاربران شما از موارد زیر بهره‌مند می‌شوند:

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

اگر می‌خواهید افزونه‌ی Android Gradle به جای کتابخانه‌های بومی فشرده، آن‌ها را بسته‌بندی کند، موارد زیر را در مانیفست برنامه‌ی خود وارد کنید:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

نکته: ویژگی manifest extractNativeLibs با گزینه useLegacyPackaging DSL جایگزین شده است. برای اطلاعات بیشتر، به یادداشت انتشار «از DSL برای بسته‌بندی کتابخانه‌های بومی فشرده استفاده کنید» مراجعه کنید.

نسخه پیش‌فرض NDK

اگر چندین نسخه از NDK را دانلود کنید، افزونه Android Gradle اکنون یک نسخه پیش‌فرض را برای استفاده در کامپایل فایل‌های کد منبع شما انتخاب می‌کند. پیش از این، افزونه آخرین نسخه دانلود شده NDK را انتخاب می‌کرد. از ویژگی android.ndkVersion در فایل build.gradle ماژول برای لغو پیش‌فرض انتخاب شده توسط افزونه استفاده کنید.

تولید کلاس R ساده شده

افزونه‌ی اندروید گریدل (Android Gradle) با تولید تنها یک کلاس R برای هر ماژول کتابخانه در پروژه‌ی شما و به اشتراک گذاشتن آن کلاس‌های R با سایر وابستگی‌های ماژول، کامپایل classpath را ساده می‌کند. این بهینه‌سازی باید منجر به ساخت سریع‌تر شود، اما مستلزم آن است که موارد زیر را در نظر داشته باشید:

  • از آنجا که کامپایلر کلاس‌های R را با وابستگی‌های ماژول بالادستی به اشتراک می‌گذارد، مهم است که هر ماژول در پروژه شما از یک نام بسته منحصر به فرد استفاده کند.
  • قابلیت مشاهده کلاس R یک کتابخانه برای سایر وابستگی‌های پروژه توسط پیکربندی مورد استفاده برای گنجاندن کتابخانه به عنوان یک وابستگی تعیین می‌شود. به عنوان مثال، اگر کتابخانه A شامل کتابخانه B به عنوان یک وابستگی 'api' باشد، کتابخانه A و سایر کتابخانه‌هایی که به کتابخانه A وابسته هستند به کلاس R کتابخانه B دسترسی دارند. با این حال، سایر کتابخانه‌ها ممکن است به کلاس R کتابخانه B دسترسی نداشته باشند. اگر کتابخانه A از پیکربندی وابستگی implementation استفاده کند. برای کسب اطلاعات بیشتر، درباره پیکربندی‌های وابستگی مطالعه کنید.

منابع از دست رفته را از پیکربندی پیش‌فرض حذف کنید

برای ماژول‌های کتابخانه، اگر منبعی را برای زبانی اضافه کنید که در مجموعه پیش‌فرض منابع قرار ندارد - برای مثال، اگر hello_world به عنوان یک منبع رشته‌ای در /values-es/strings.xml اضافه کنید اما آن منبع را در /values/strings.xml تعریف نکنید - افزونه Android Gradle دیگر هنگام کامپایل پروژه شما آن منبع را شامل نمی‌کند. این تغییر رفتار باید منجر به کاهش خطاهای زمان اجرای Resource Not Found و بهبود سرعت ساخت شود.

D8 اکنون از سیاست حفظ کلاس برای حاشیه‌نویسی‌ها پیروی می‌کند

هنگام کامپایل برنامه شما، D8 اکنون به زمانی که حاشیه‌نویسی‌ها یک سیاست حفظ کلاس (CLASS retention policy) اعمال می‌کنند، احترام می‌گذارد و آن حاشیه‌نویسی‌ها دیگر در زمان اجرا در دسترس نیستند. این رفتار همچنین هنگام تنظیم SDK هدف برنامه روی API سطح ۲۳ وجود دارد، که قبلاً امکان دسترسی به این حاشیه‌نویسی‌ها را در زمان اجرا هنگام کامپایل برنامه شما با استفاده از نسخه‌های قدیمی‌تر افزونه Android Gradle و D8 فراهم می‌کرد.

سایر تغییرات رفتاری

  • aaptOptions.noCompress دیگر در همه پلتفرم‌ها (برای APK و بسته‌ها) به حروف بزرگ و کوچک حساس نیست و به مسیرهایی که از حروف بزرگ استفاده می‌کنند، احترام می‌گذارد.
  • اتصال داده اکنون به طور پیش‌فرض افزایشی است. برای کسب اطلاعات بیشتر، به شماره #110061530 مراجعه کنید.

  • تمام تست‌های واحد، از جمله تست‌های واحد Roboelectric، اکنون کاملاً قابل ذخیره در حافظه پنهان هستند. برای کسب اطلاعات بیشتر، به شماره #115873047 مراجعه کنید.

رفع اشکالات

این نسخه از افزونه Android Gradle شامل رفع اشکالات زیر است:

  • تست‌های واحد Robolectric اکنون در ماژول‌های کتابخانه‌ای که از اتصال داده استفاده می‌کنند، پشتیبانی می‌شوند. برای کسب اطلاعات بیشتر، به شماره #126775542 مراجعه کنید.
  • اکنون می‌توانید وظایف connectedAndroidTest را در چندین ماژول اجرا کنید، در حالی که حالت اجرای موازی Gradle فعال است.

مشکلات شناخته شده

این بخش مشکلات شناخته‌شده‌ای را که در افزونه‌ی اندروید Gradle نسخه ۳.۶.۰ وجود دارد، شرح می‌دهد.

عملکرد کند وظیفه Lint اندروید

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

این مشکل به عنوان یک اشکال در IDEA گزارش شده است و در Android Gradle Plugin 4.0 برطرف خواهد شد.

کلاس Manifest موجود نیست {:#agp-missing-manifest}

اگر برنامه شما مجوزهای سفارشی را در مانیفست خود تعریف کند، افزونه Android Gradle معمولاً یک کلاس Manifest.java ایجاد می‌کند که شامل مجوزهای سفارشی شما به عنوان ثابت‌های رشته‌ای است. این افزونه این کلاس را با برنامه شما بسته‌بندی می‌کند، بنابراین می‌توانید در زمان اجرا راحت‌تر به آن مجوزها مراجعه کنید.

تولید کلاس manifest در افزونه Android Gradle نسخه ۳.۶.۰ با مشکل مواجه است. اگر برنامه خود را با این نسخه از افزونه بسازید و به کلاس manifest ارجاع دهد، ممکن است با خطای ClassNotFoundException مواجه شوید. برای حل این مشکل، یکی از موارد زیر را انجام دهید:

  • مجوزهای سفارشی خود را با نام کامل آنها ارجاع دهید. برای مثال، "com.example.myapp.permission.DEADLY_ACTIVITY" .

  • ثابت‌های خودتان را مانند زیر تعریف کنید:

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }