افزونه اندروید گریدل ۳.۰.۰ (اکتبر ۲۰۱۷)

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

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

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

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

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

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

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

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

این یک به‌روزرسانی جزئی برای پشتیبانی از اندروید استودیو ۳.۰.۱ است و شامل رفع اشکالات کلی و بهبود عملکرد می‌شود.

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

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

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

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

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

    گرووی

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    کاتلین

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • پیکربندی وابستگی جدید androidTestUtil به شما امکان می‌دهد قبل از اجرای تست‌های instrumentation خود، یک 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 برای پشتیبانی از تست‌های واحد که به منابع اندروید نیاز دارند، مانند Roboelectric ، اضافه شده است. وقتی این ویژگی را روی true تنظیم می‌کنید، افزونه قبل از اجرای تست‌های واحد شما، ادغام منابع، دارایی‌ها و مانیفست را انجام می‌دهد. سپس تست‌های شما می‌توانند com/android/tools/test_config.properties را در مسیر کلاس برای کلیدهای زیر بررسی کنند:

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

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

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

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

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

  • پشتیبانی از فونت‌ها به عنوان منابع (که یک ویژگی جدید معرفی شده در اندروید ۸.۰ (سطح API ۲۶) است).
  • پشتیبانی از APK های مختص زبان با Android Instant Apps SDK 1.1 و بالاتر.
  • اکنون می‌توانید دایرکتوری خروجی را برای پروژه ساخت بومی خارجی خود تغییر دهید، همانطور که در زیر نشان داده شده است:

    گرووی

            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"
                    }
                }
            }
            
  • اکنون می‌توانید هنگام ساخت پروژه‌های بومی از اندروید استودیو، از 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"))
            }
            

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

  • افزونه اندروید نسخه ۳.۰.۰ برخی از APIها را حذف می‌کند و در صورت استفاده از آنها، ساخت شما با مشکل مواجه خواهد شد. برای مثال، دیگر نمی‌توانید از API مربوط به Variants برای دسترسی به اشیاء outputFile() استفاده کنید یا از processManifest.manifestOutputFile() برای دریافت فایل manifest برای هر نوع استفاده کنید. برای کسب اطلاعات بیشتر، تغییرات API را مطالعه کنید.
  • دیگر نیازی به مشخص کردن نسخه برای ابزارهای ساخت ندارید (بنابراین، اکنون می‌توانید ویژگی android.buildToolsVersion را حذف کنید). به طور پیش‌فرض، افزونه به طور خودکار از حداقل نسخه ابزارهای ساخت مورد نیاز برای نسخه افزونه اندرویدی که استفاده می‌کنید، استفاده می‌کند.
  • اکنون می‌توانید فشرده‌سازی 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
              }
            }
          }
          
  • افزونه اندروید اکنون به طور خودکار فایل‌های اجرایی را که در پروژه‌های خارجی CMake خود پیکربندی می‌کنید، می‌سازد.
  • اکنون باید با استفاده از پیکربندی وابستگی annotationProcessor پردازنده‌های حاشیه‌نویسی را به مسیر کلاس پردازنده اضافه کنید .
  • استفاده از ndkCompile منسوخ‌شده اکنون محدودتر شده است. در عوض، باید برای کامپایل کد بومی که می‌خواهید در APK خود بسته‌بندی کنید، به استفاده از CMake یا ndk-build مهاجرت کنید. برای کسب اطلاعات بیشتر، Migrate from ndkcompile را مطالعه کنید.