افزایه Android Gradle نسخه ۳.۶.۰ (فوریه ۲۰۲۰)

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

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

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

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

مشاهده صحافی

نمای پیونددهی هنگام ارجاع دادن به نماها در کد شما، ایمنی زمان ترجمه فراهم می‌کند. اکنون می‌توانید findViewById() را با مرجع کلاس پیوند تولیدشده به‌طور خودکار جایگزین کنید. برای شروع استفاده از «اتصال نما»، مورد زیر را در فایل 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 را باز کنید و chrome://tracing را در نوار جستجو تایپ کنید.

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

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

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

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

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

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

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

  • اندازه نصب برنامه کوچک‌تر است زیرا پلاتفرم می‌تواند مستقیماً از کتابخانه‌های بومی در APK نصب‌شده بدون ایجاد نسخه کپی از کتابخانه‌ها استفاده کند.
  • اندازه بارگیری کوچک‌تر زیرا فشرده‌سازی «فروشگاه Play» معمولاً وقتی کتابخانه‌های بومی فشرده‌نشده را در فایل APK یا Android App Bundle قرار می‌دهید بهتر است.

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

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

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

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

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

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

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

  • ازآنجایی‌که کامپایلر کلاس‌های 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 اکنون خط‌مشی نگهداری CLASS را برای گزارمان‌ها رعایت می‌کند

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

تغییرات دیگر در رفتار

  • ‫aaptOptions.noCompress دیگر در همه پلاتفرم‌ها (هم برای APK و هم برای دسته‌ها) به حروف بزرگ و کوچک حساس نیست و مسیرهایی را که از حروف بزرگ استفاده می‌کنند رعایت می‌کند.
  • ترابست داده‌ها اکنون به‌طور پیش‌فرض افزایشی است. برای کسب اطلاعات بیشتر، شماره مشکل ۱۱۰۶۱۵۳۰ را ببینید.

  • اکنون همه آزمایش‌های واحد، ازجمله آزمایش‌های واحد Roboelectric، به‌طور کامل قابل‌ذخیره در حافظه نهان هستند. برای کسب اطلاعات بیشتر، مسئله شماره ۱۱۵۸۷۳۰۴۷ را ببینید.

رفع اشکال‌ها

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

  • اکنون در واحدهای کتابخانه‌ای که از اتصال داده استفاده می‌کنند، از آزمون‌های واحد Robolectric پشتیبانی می‌شود. برای کسب اطلاعات بیشتر، مسئله شماره ۱۲۶۷۷۵۵۴۲ را ببینید.
  • اکنون می‌توانید connectedAndroidTest تکلیف را در چندین واحد اجرا کنید درحالی‌که حالت اجرای موازی Gradle فعال است.

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

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

عملکرد کند تکلیف Android Lint

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

این مشکل به‌عنوان اشکال در IDEA گزارش شده است و در «افزایه Android Gradle» نسخه ۴.۰ رفع خواهد شد.

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

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

تولید کلاس مانیفست در افزایه Android Gradle نسخه ۳.۶.۰ خراب است. اگر برنامه‌تان را با این نسخه افزایه بسازید و به کلاس مانیفست ارجاع دهد، ممکن است با استثنای 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";
                  }
                }