افزایه Android Gradle نسخه ۳.۰.۰ (اکتبر ۲۰۱۷)

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

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

نسخه افزایه Android + نسخه Gradle افزایه Android نسخه ۲.۲.۰ + Gradle نسخه ۲.۱۴.۱ افزایه Android نسخه ۲.۳.۰ + Gradle نسخه ۳.۳ افزایه Android نسخه ۳.۰.۰ + Gradle نسخه ۴.۱
پیکربندی (برای نمونه، درحال اجرای ./gradlew --help) تقریباً ۲ دقیقه ‫~۹ ثانیه ‫~۲٫۵ ثانیه
تغییر یک‌خطی جاوا (تغییر پیاده‌سازی) تقریباً ۲ دقیقه و ۱۵ ثانیه ‫~۲۹ ثانیه ‫~۶٫۴ ثانیه

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

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

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

حداقل نسخه نسخه پیش‌فرض یادداشت‌ها
Gradle ‫۱-۴ ‫۱-۴ برای کسب اطلاعات بیشتر، به‌روزرسانی Gradle را ببینید.
ابزارهای ساخت کیت توسعه نرم‌افزار ‫۲۶.۰.۲ ‫۲۶.۰.۲ «ابزارهای ساخت کیت توسعه نرم‌افزار» را نصب یا پیکربندی کنید. با این به‌روزرسانی، دیگر نیازی نیست نسخه‌ای برای ابزارهای ساخت مشخص کنید—افزایه به‌طور پیش‌فرض از حداقل نسخه موردنیاز استفاده می‌کند. بنابراین، اکنون می‌توانید دارایی android.buildToolsVersion را بردارید.

‫۳.۰.۱ (نوامبر ۲۰۱۷)

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

بهینه‌سازی‌ها

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

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

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

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

    شیک

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    کاتلین

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

    شیک

            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 در مانیفست برنامه مطابقت نداشته باشد.

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

    شیک

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

    قوانین سفارشی lint شما باید متعلق به پروژه جداگانه‌ای باشد که یک 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"))
            }
            

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

  • افزایه Android نسخه ۳.۰.۰ برخی‌از میاناهای برنامه‌سازی کاربردی را برمی‌دارد و اگر از آن‌ها استفاده کنید، ساخت شما ازکار خواهد افتاد. برای مثال، دیگر نمی‌توانید از «میانای برنامه‌سازی کاربردی گونه‌ها» برای دسترسی به outputFile() هدف یا استفاده از processManifest.manifestOutputFile() برای دریافت فایل مانیفست برای هر گونه استفاده کنید. برای کسب اطلاعات بیشتر، تغییرات «میانای برنامه‌سازی کاربردی» را بخوانید.
  • دیگر لازم نیست نسخه‌ای برای ابزارهای ساخت مشخص کنید (بنابراین، اکنون می‌توانید دارایی android.buildToolsVersion را بردارید). به‌طور پیش‌فرض، افزایه به‌طور خودکار از حداقل نسخه موردنیاز ابزارهای ساخت برای نسخه افزایه Android که استفاده می‌کنید استفاده می‌کند.
  • اکنون فشرده‌سازی PNG را در بلوک buildTypes فعال/غیرفعال می‌کنید، همان‌طور که در زیر نشان داده شده است. فشرده‌سازی PNG به‌طور پیش‌فرض برای همه ساخت‌ها فعال است به‌جز ساخت‌های اشکال‌زدایی، زیرا زمان ساخت را برای پروژه‌هایی که شامل فایل‌های PNG زیادی هستند افزایش می‌دهد. بنابراین، برای بهبود زمان ساخت انواع دیگر ساخت، باید یا فشرده‌سازی PNG را غیرفعال کنید یا تصاویرتان را به 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 را بخوانید.