پلاگین Android Gradle 3.6.0 (فوریه 2020)

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

حداقل نسخه نسخه پیش فرض یادداشت ها
گریدل 5.6.4 5.6.4 برای کسب اطلاعات بیشتر، به روز رسانی Gradle را ببینید.
ابزارهای ساخت SDK 28.0.3 28.0.3 ابزارهای ساخت SDK را نصب یا پیکربندی کنید .

3.6.4 (ژوئیه 2020)

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

برای جزئیات به یادداشت های انتشار 4.0.1 مراجعه کنید.

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

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

مشاهده صحافی

View binding ایمنی زمان کامپایل را هنگام ارجاع به نماها در کد شما فراهم می کند. اکنون می توانید findViewById() با مرجع کلاس binding تولید شده خودکار جایگزین کنید. برای شروع استفاده از View binding، موارد زیر را در فایل 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 می تواند یک ردیابی کروم را که حاوی مهرهای زمانی برای این رویدادهای کامپایلر است، خروجی دهد تا بتوانید زمان لازم برای ساخت پروژه خود را بهتر درک کنید. برای خروجی این فایل Attribution ساخت، موارد زیر را انجام دهید:

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

    gradlew assembleDebug -Pandroid.enableProfileJson=true

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

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

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

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

تغییر رفتار

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

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

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

  • اندازه نصب برنامه کوچکتر است زیرا پلتفرم می تواند مستقیماً از APK نصب شده به کتابخانه های بومی دسترسی داشته باشد، بدون اینکه نسخه ای از کتابخانه ها ایجاد کند.
  • اندازه دانلود کوچکتر است زیرا فشرده سازی Play Store معمولاً زمانی بهتر است که کتابخانه های بومی فشرده نشده را در 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 استفاده کند. برای اطلاعات بیشتر، درباره تنظیمات وابستگی بخوانید.

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

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

D8 اکنون به خط مشی حفظ کلاس برای حاشیه نویسی احترام می گذارد

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

رفتارهای دیگر تغییر می کند

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

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

رفع اشکال

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

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

مسائل شناخته شده

این بخش مشکلات شناخته شده ای را که در افزونه Android Gradle نسخه 3.6.0 وجود دارد، توضیح می دهد.

عملکرد آهسته وظایف Android Lint

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

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

کلاس مانیفست گمشده {:#agp-missing-manifest}

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

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