پلاگین Android Gradle 3.0.0 (اکتبر 2017)

پلاگین Android Gradle 3.0.0 شامل تغییرات مختلفی است که هدف آنها رفع مشکلات عملکرد پروژه های بزرگ است.

به عنوان مثال، در یک پروژه اسکلت نمونه با 130 ماژول و تعداد زیادی وابستگی خارجی (اما بدون کد یا منابع)، می توانید بهبودهای عملکردی مشابه موارد زیر را تجربه کنید:

نسخه پلاگین اندروید + نسخه Gradle افزونه اندروید 2.2.0 + Gradle 2.14.1 پلاگین اندروید 2.3.0 + Gradle 3.3 پلاگین اندروید 3.0.0 + Gradle 4.1
پیکربندی (به عنوان مثال در حال اجرا ./gradlew --help ) ~ 2 دقیقه ~ 9 ثانیه ~ 2.5 ثانیه
تغییر جاوا 1 خطی (تغییر پیاده سازی) ~ 2 دقیقه 15 ثانیه ~ 29 ثانیه ~6.4 ثانیه

برخی از این تغییرات، ساخت‌های موجود را می‌شکنند. بنابراین، شما باید در نظر بگیرید
تلاش برای مهاجرت پروژه شما قبل از استفاده از افزونه جدید.

اگر بهبودهای عملکردی که در بالا توضیح داده شد را تجربه نکردید، لطفاً یک اشکال را ثبت کنید و با استفاده از Gradle Profiler ردی از ساخت خود را وارد کنید.

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

  • درجه 4.1 یا بالاتر. برای کسب اطلاعات بیشتر، بخش مربوط به به‌روزرسانی Gradle را بخوانید.
  • Build Tools 26.0.2 یا بالاتر. با این به روز رسانی، دیگر نیازی به تعیین نسخه برای ابزارهای ساخت ندارید—این افزونه به طور پیش فرض از حداقل نسخه مورد نیاز استفاده می کند. بنابراین، اکنون می توانید ویژگی android.buildToolsVersion حذف کنید.

3.0.1 (نوامبر 2017)

این یک به‌روزرسانی کوچک برای پشتیبانی از Android Studio 3.0.1 است و شامل رفع اشکالات کلی و بهبود عملکرد است.

بهینه سازی ها

  • موازی سازی بهتر برای پروژه های چند ماژول از طریق یک نمودار وظیفه ریز دانه.
  • هنگام ایجاد تغییرات در وابستگی، Gradle با عدم کامپایل مجدد ماژول هایی که به API آن وابستگی دسترسی ندارند، ساخت های سریع تری انجام می دهد. باید با استفاده از پیکربندی‌های وابستگی جدید Gradle ، وابستگی‌ها را به ماژول‌های دیگر محدود کنید: implementation ، api ، compileOnly و runtimeOnly .
  • سرعت ساخت افزایشی بیشتر به دلیل دکس کردن در هر کلاس. اکنون هر کلاس در فایل‌های DEX جداگانه کامپایل می‌شود و فقط کلاس‌هایی که اصلاح شده‌اند دوباره dex می‌شوند. همچنین باید انتظار بهبود سرعت ساخت برنامه‌هایی را داشته باشید که minSdkVersion روی 20 یا کمتر تنظیم می‌کنند و از Multi-dex قدیمی استفاده می‌کنند.
  • بهبود سرعت ساخت با بهینه سازی وظایف خاص برای استفاده از خروجی های chached. برای بهره مندی از این بهینه سازی، ابتدا باید کش ساخت Gradle را فعال کنید .
  • بهبود پردازش منابع افزایشی با استفاده از AAPT2، که اکنون به طور پیش فرض فعال است. اگر هنگام استفاده از AAPT2 با مشکلاتی مواجه شدید، لطفاً یک اشکال را گزارش کنید . همچنین می توانید AAPT2 را با تنظیم android.enableAapt2=false در فایل gradle.properties خود و راه اندازی مجدد Daemon Gradle با اجرای ./gradlew --stop از خط فرمان غیرفعال کنید.

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

  • مدیریت وابستگی با آگاهی از متغیرها هنگام ساخت یک نوع خاص از یک ماژول، اکنون افزونه به طور خودکار انواع وابستگی های ماژول کتابخانه محلی را با نوع ماژولی که در حال ساخت آن هستید مطابقت می دهد.
  • شامل یک افزونه ماژول ویژگی جدید برای پشتیبانی از برنامه‌های فوری Android و SDK برنامه‌های فوری Android (که می‌توانید با استفاده از مدیر SDK دانلود کنید). برای کسب اطلاعات بیشتر درباره ایجاد ماژول‌های ویژگی با افزونه جدید، ساختار یک برنامه فوری با ویژگی‌های متعدد را بخوانید.
  • پشتیبانی داخلی برای استفاده از برخی ویژگی های زبان جاوا 8 و کتابخانه های جاوا 8. جک اکنون منسوخ شده است و دیگر مورد نیاز نیست ، و ابتدا باید جک را غیرفعال کنید تا از پشتیبانی بهبود یافته جاوا 8 که در زنجیره ابزار پیش فرض تعبیه شده است استفاده کنید. برای اطلاعات بیشتر، استفاده از ویژگی های زبان جاوا 8 را بخوانید.
  • پشتیبانی از اجرای آزمایش‌ها با Android Test Orchestrator اضافه شده است، که به شما امکان می‌دهد هر یک از آزمایش‌های برنامه خود را با فراخوانی خودش از Instrumentation اجرا کنید. از آنجایی که هر آزمایش در نمونه ابزار دقیق خود اجرا می‌شود، هیچ حالت مشترک بین آزمایش‌ها در CPU یا حافظه دستگاه شما جمع نمی‌شود. و حتی اگر یک تست خراب شود، فقط نمونه خودش از Instrumentation را حذف می‌کند، بنابراین تست‌های دیگر شما همچنان اجرا می‌شوند.

    • testOptions.execution اضافه شد تا مشخص شود که آیا از هماهنگی تست روی دستگاه استفاده شود یا خیر. اگر می‌خواهید از Android Test Orchestrator استفاده کنید ، باید ANDROID_TEST_ORCHESTRATOR مانند شکل زیر مشخص کنید. به طور پیش‌فرض، این ویژگی روی HOST تنظیم شده است که هماهنگی روی دستگاه را غیرفعال می‌کند و روش استاندارد اجرای آزمایش‌ها است.

    شیار

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    کاتلین

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • پیکربندی جدید وابستگی androidTestUtil به شما امکان می‌دهد قبل از اجرای تست‌های ابزار دقیق خود، مانند Android Test Orchestrator، یک APK کمک آزمایشی دیگر نصب کنید:

    شیار

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    کاتلین

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • testOptions.unitTests.includeAndroidResources برای پشتیبانی از تست‌های واحدی که به منابع Android نیاز دارند، مانند Roboelectric اضافه شد. وقتی این ویژگی را روی true تنظیم می‌کنید، افزونه قبل از اجرای آزمایش‌های واحد شما، ادغام منابع، دارایی و مانیفست را انجام می‌دهد. سپس تست‌های شما می‌توانند com/android/tools/test_config.properties در مسیر کلاس برای کلیدهای زیر بررسی کنند:

    • android_merged_assets : مسیر مطلق به فهرست دارایی های ادغام شده.

      توجه: برای ماژول های کتابخانه، دارایی های ادغام شده حاوی دارایی های وابستگی نیستند (به شماره 65550419 مراجعه کنید).

    • android_merged_manifest : مسیر مطلق فایل مانیفست ادغام شده.

    • android_merged_resources : مسیر مطلق به فهرست منابع ادغام شده، که شامل تمام منابع ماژول و تمام وابستگی های آن است.

    • android_custom_package : نام بسته کلاس R نهایی. اگر به صورت پویا شناسه برنامه را تغییر دهید، این نام بسته ممکن است با ویژگی package در مانیفست برنامه مطابقت نداشته باشد.

  • پشتیبانی از فونت ها به عنوان منابع (که یک ویژگی جدید است که در اندروید 8.0 (سطح API 26) معرفی شده است).
  • پشتیبانی از فایل‌های APK مختص زبان با SDK برنامه‌های فوری Android نسخه ۱.۱ و بالاتر.
  • اکنون می توانید دایرکتوری خروجی را برای پروژه ساخت داخلی خارجی خود تغییر دهید، همانطور که در زیر نشان داده شده است:

    شیار

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    کاتلین

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • اکنون می توانید هنگام ساخت پروژه های بومی از Android Studio از CMake 3.7 یا بالاتر استفاده کنید .
  • پیکربندی جدید وابستگی lintChecks به شما امکان می دهد یک JAR بسازید که قوانین پرزهای سفارشی را تعریف می کند و آن را در پروژه های AAR و APK خود بسته بندی کنید.

    قوانین لینت سفارشی شما باید به یک پروژه مجزا تعلق داشته باشد که یک JAR را خروجی می دهد و فقط وابستگی های compileOnly را شامل می شود. دیگر ماژول های برنامه و کتابخانه می توانند با استفاده از پیکربندی lintChecks به پروژه lint شما وابسته باشند:

    شیار

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks project(':lint-checks')
            }
            

    کاتلین

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks(project(":lint-checks"))
            }
            

تغییر رفتار

  • افزونه اندروید 3.0.0 برخی از API ها را حذف می کند و در صورت استفاده از آنها، ساخت شما خراب می شود. به عنوان مثال، دیگر نمی توانید از Variants API برای دسترسی به اشیاء outputFile() استفاده کنید یا از processManifest.manifestOutputFile() برای دریافت فایل مانیفست برای هر گونه استفاده کنید. برای کسب اطلاعات بیشتر، تغییرات API را بخوانید.
  • دیگر نیازی به تعیین نسخه برای ابزارهای ساخت ندارید (بنابراین، اکنون می توانید ویژگی android.buildToolsVersion را حذف کنید). به‌طور پیش‌فرض، افزونه به‌طور خودکار از حداقل نسخه ابزارهای ساخت مورد نیاز برای نسخه افزونه اندرویدی که استفاده می‌کنید استفاده می‌کند.
  • همانطور که در زیر نشان داده شده است، اکنون Crunching PNG را در بلوک buildTypes فعال یا غیرفعال می کنید. Crunching PNG به طور پیش‌فرض برای همه ساخت‌ها به جز ساخت‌های اشکال‌زدایی فعال است، زیرا زمان ساخت پروژه‌هایی را که شامل بسیاری از فایل‌های PNG هستند، افزایش می‌دهد. بنابراین، برای بهبود زمان ساخت برای انواع دیگر، باید PNG crunching را غیرفعال کنید یا تصاویر خود را به WebP تبدیل کنید .

    شیار

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    کاتلین

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • پلاگین Android اکنون به طور خودکار اهداف اجرایی را ایجاد می کند که شما در پروژه های CMake خارجی خود پیکربندی می کنید.
  • اکنون باید با استفاده از پیکربندی وابستگی annotationProcessor ، پردازنده های حاشیه نویسی را به مسیر کلاس پردازنده اضافه کنید .
  • استفاده از ndkCompile منسوخ شده اکنون محدودتر شده است. در عوض باید به استفاده از CMake یا ndk-build برای کامپایل کد بومی که می خواهید در APK خود بسته بندی کنید، مهاجرت کنید. برای کسب اطلاعات بیشتر، مهاجرت از ndkcompile را بخوانید.