تحسين سرعة الإصدار

تؤدي مدة التصميم الطويلة إلى إبطاء عملية التطوير. توفر هذه الصفحة بعض الأساليب لمساعدتك لحل معوقات سرعة البناء.

في ما يلي تفاصيل العملية العامة لتحسين سرعة إصدار تطبيقك:

  1. تحسين إعدادات تصميمك من خلال اتّباع بعض الخطوات التي تفيد فورًا معظم مشاريع استوديو Android.
  2. الملف الشخصي للإصدار الذي يتيح لك تحديد وتشخيص بعض المعوقات الأصعب التي قد تكون خاصة بمشروعك أو محطة عملك.

عند تطوير التطبيق، انشره على جهاز يعمل بنظام التشغيل Android 7.0 (مستوى واجهة برمجة التطبيقات 24) أو أعلى كلما أمكن ذلك. إصدارات أحدث من نظام Android الأساسي تنفيذ آليات أفضل لإرسال التحديثات إلى تطبيقك مثل نظام التشغيل Android وقت التشغيل (ART) والدعم الأصلي لملفات DEX المتعددة.

ملاحظة: بعد الانتهاء من أول إصدار خالٍ من الأخطاء، قد تلاحظ أن التغييرات التالية التي يتم أحدها، سواء كانت نظيفة أو متزايدة، تعمل بشكل أسرع بكثير حتى بدون استخدام أي من التحسينات الموضحة في هذه الصفحة. ويرجع ذلك إلى البرنامج الخفي لـ Gradle لديه "الاستعداد" فترة لتحسين الأداء، على غرار JVM والعمليات.

تحسين إعدادات تصميمك

اتّبِع هذه النصائح لتحسين الإصدار سرعة مشروع Android Studio.

تحديث أدواتك باستمرار

تتلقّى أدوات Android تحسينات على التصميم وميزات جديدة مع كل تحديث. تفترض بعض النصائح الواردة في هذه الصفحة أنك تستخدم أحدث إصدار . للاستفادة من أحدث التحسينات، ننصحك بمواصلة متابعتك حتى الآن:

استخدام KSP بدلاً من kapt

أداة معالجة التعليقات التوضيحية بلغة Kotlin (kapt) أبطأ بكثير من لغة Kotlin. معالج الرموز (KSP). فإذا كنت تكتب مصدر Kotlin مع تعليقات توضيحية وتستخدم أدوات معالجة التعليقات التوضيحية (مثل الغرفة) التي تتوافق مع KSP، وستحتاج إلى نقل البيانات إلى KSP.

تجنب تجميع الموارد غير الضرورية

تجنب تجميع الموارد التي لا تختبرها وتغليفها، مثل مزيد من عمليات الأقلمة للغات وموارد كثافة الشاشة. بدلاً من ذلك، حدِّد خيارًا واحدًا فقط مورد اللغة وكثافة الشاشة الخاص بالمطوّر النكهة، كما هو موضح في العينة التالية:

Groovy

android {
    ...
    productFlavors {
        dev {
            ...
            // The following configuration limits the "dev" flavor to using
            // English stringresources and xxhdpi screen-density resources.
            resourceConfigurations "en", "xxhdpi"
        }
        ...
    }
}

Kotlin

android {
    ...
    productFlavors {
        create("dev") {
            ...
            // The following configuration limits the "dev" flavor to using
            // English stringresources and xxhdpi screen-density resources.
            resourceConfigurations("en", "xxhdpi")
        }
        ...
    }
}

تجربة وضع بوابة مكوّن Gradle الإضافي أخيرًا

في نظام Android، يمكن العثور على جميع المكوّنات الإضافية في google() mavenCentral() مستودع. ومع ذلك، قد يكون تصميمك ستحتاج إلى مكوّنات إضافية من جهات خارجية تم حلّها باستخدام gradlePluginPortal() خدمة ما.

يبحث Gradle في المستودعات بالترتيب الذي تم الإعلان عنه، لذلك يتم تحسين أداء الإصدار إذا كانت المستودعات المدرجة أولاً تحتوي على معظم المكونات الإضافية. وبالتالي، يمكنك تجربة "gradlePluginPortal()". من خلال وضعه في النهاية في كتلة المستودع في settings.gradle الملف. وفي معظم الحالات، يؤدي هذا إلى تقليل عدد عمليات البحث عن المكونات الإضافية المكررة إلى تحسين سرعة إنشاء موقعك الإلكتروني

لمزيد من المعلومات حول كيفية التنقل في مستودعات Gradle المتعددة، يُرجى الاطلاع على الإعلان عن مستودعات متعددة في وثائق Gradle.

استخدام قيم إعدادات الإصدار الثابتة مع إصدار تصحيح الأخطاء

استخدم دائمًا القيم الثابتة للخصائص التي تدخل في ملف البيان أو ملفات الموارد نوع إصدار تصحيح الأخطاء.

استخدام رموز الإصدار الديناميكية أو أسماء الإصدارات أو الموارد أو أي منطق إصدار آخر يغيّر ملف البيان يتطلب إصدارًا كاملاً من التطبيق. في كل مرة تريد فيها إجراء تغيير، حتى لو كان التغيير الفعلي وإلا تتطلب التبديل السريع فقط. إذا كانت تهيئة تصميمك تتطلب الخصائص الديناميكية، ثم عزل تلك الخصائص لمتغيرات إصدار الإصدار الخاص بك القيم الثابتة لإصدارات تصحيح الأخطاء، كما هو موضّح في النموذج التالي:

  ...
  // Use a filter to apply onVariants() to a subset of the variants.
  onVariants(selector().withBuildType("release")) { variant ->
      // Because an app module can have multiple outputs when using multi-APK, versionCode
      // is only available on the variant output.
      // Gather the output when we are in single mode and there is no multi-APK.
      val mainOutput = variant.outputs.single { it.outputType == OutputType.SINGLE }

      // Create the version code generating task.
      val versionCodeTask = project.tasks.register("computeVersionCodeFor${variant.name}", VersionCodeTask::class.java) {
          it.outputFile.set(project.layout.buildDirectory.file("versionCode${variant.name}.txt"))
      }

      // Wire the version code from the task output.
      // map will create a lazy Provider that:
      // 1. Runs just before the consumer(s), ensuring that the producer (VersionCodeTask) has run
      //    and therefore the file is created.
      // 2. Contains task dependency information so that the consumer(s) run after the producer.
      mainOutput.versionCode.set(versionCodeTask.flatMap { it.outputFile.map { it.asFile.readText().toInt() } })
  }
  ...

  abstract class VersionCodeTask : DefaultTask() {

    @get:OutputFile
    abstract val outputFile: RegularFileProperty

    @TaskAction
    fun action() {
        outputFile.get().asFile.writeText("1.1.1")
    }
  }

اطّلِع على وصفة setVersionsFromTask على GitHub لمعرفة كيفية رمز إصدار ديناميكي في مشروعك.

استخدام إصدارات التبعية الثابتة

عند الإفصاح عن الموارد التابعة في ملفات build.gradle، تجنَّب استخدام الإصدار الديناميكي. الأرقام (التي تحتوي على علامة زائد في نهايتها، مثل 'com.android.tools.build:gradle:2.+'). استخدام أرقام الإصدارات الديناميكية يمكن أن يؤدي إلى إجراء تحديثات غير متوقعة للإصدار وصعوبة في التعامل مع الإصدار الاختلافات، والإصدارات الأبطأ بسبب البحث عن التحديثات في Gradle. استخدِم أرقام إصدارات ثابتة بدلاً من ذلك.

إنشاء وحدات مكتبة

ابحث عن رمز في تطبيقك يمكنك تحويله إلى وحدة مكتبة Android. يسمح تقسيم التعليمة البرمجية بهذه الطريقة لنظام الإصدار بتجميع الوحدات التي تعدّلها وتخزّنها في ذاكرة التخزين المؤقت للإصدار المستقبلي. يؤدي التقسيم النمطي أيضًا إلى تنفيذ المشروعات الموازية بشكل أكثر فعالية عند لتمكين هذا التحسين.

إنشاء مهام وفقًا لمنطق الإصدار المخصّص

بعد إنشاء ملف شخصي لإنشاء، إذا كان الإصدار أن وقتًا طويلاً نسبيًا من وقت الإصدار يستغرق المشاريع**، راجِع نصوصك البرمجية البالغ عددها build.gradle وابحث عن التعليمة البرمجية لتضمينها في مهمة Gradle المخصصة. من خلال تغيير منطق الإصدار في مهمة ما، فإنك تساعد في التأكد من أن المهمة تعمل فقط عند الحاجة، ويمكن تخزين النتائج مؤقتًا الإصدارات اللاحقة، ويصبح منطق الإصدار هذا مؤهَّلاً للعمل بالتوازي في حال تفعيل تنفيذ المشروع الموازي. مزيد من المعلومات حول taks للإصدار المخصّص اقرأ وثائق Gradle الرسمية.

ملاحظة: إذا كان الإصدار يتضمّن عددًا كبيرًا من المهام المخصّصة، يمكنك تريد تنظيم ملفات build.gradle من خلال إنشاء فئات مهام مخصصة. أضِف صفوفك إلى دليل project-root/buildSrc/src/main/groovy/ يشتمل Gradle تلقائيًا على هذه الفئات في مسار الفئة للجميع build.gradle ملف في مشروعك.

تحويل الصور إلى تنسيق WebP

WebP هو ملف صورة. تنسيق يوفر الضغط مع فقدان البيانات (مثل JPEG) بالإضافة إلى الشفافية (مثل PNG). يمكن أن يوفر تنسيق WebP ضغطًا أفضل من تنسيق JPEG أو PNG.

تقليل أحجام ملفات الصور بدون الحاجة إلى ضغط وقت الإصدار إمكانية تسريع التصميمات، خاصةً إذا كان التطبيق يستخدم الموارد. ومع ذلك، قد تلاحظ زيادة طفيفة في استخدام وحدة المعالجة المركزية (CPU) للجهاز أثناء فك ضغط صور WebP. استخدام "استوديو Android" لتسهيل تحويل صورك إلى WebP.

إيقاف الطحن بتنسيق PNG

في حال عدم تحويل ملف PNG من الصور إلى تنسيق WebP، سيظل بإمكانك تسريع عملية الإنشاء من خلال إيقاف ضغط الصور في كل مرة تنشئ فيها تطبيقك.

إذا كنت تستخدم الإصدار 3.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android أو أعلى، يتم إيقاف معالجة ملفات PNG افتراضيًا في وضع "تصحيح الأخطاء" ونوع التصميم. لإيقاف هذا تحسين أنواع الإصدارات الأخرى، أضِف ما يلي إلى ملف build.gradle:

Groovy

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

Kotlin

android {
    buildTypes {
        getByName("release") {
            // Disables PNG crunching for the "release" build type.
            isCrunchPngs = false
        }
    }
}

بما أنّ أنواع التصميمات أو نكهات المنتجات لا تحدّد هذه السمة، يجب أن لضبط هذه السمة يدويًا على true عند إنشاء الإصدار من تطبيقك.

التجريب مع جهاز تجميع البيانات المهملة المتوازٍ في آلة متجه الدعم

يمكن تحسين أداء التصميم من خلال ضبط جهاز تجميع نفايات JVM المثالي الذي تستخدمه Gradle. في حين يتم ضبط JDK 8 على استخدام أداة تجميع البيانات المهملة الموازية تلقائيًا، يتم ضبط الإصدار JDK 9 والإصدارات الأعلى منه مهيأ للاستخدام أداة تجميع البيانات المهملة G1.

لتحسين أداء الإصدار، ننصحك اختبار إصدارات Gradle باستخدام التوازي لجمع القمامة. في gradle.properties، اضبط ما يلي:

org.gradle.jvmargs=-XX:+UseParallelGC

إذا كانت هناك خيارات أخرى سبق تحديدها في هذا الحقل، أضِف خيارًا جديدًا:

org.gradle.jvmargs=-Xmx1536m -XX:+UseParallelGC

ولقياس سرعة الإصدار من خلال إعدادات مختلفة، اطّلِع على اشرح التصميم الخاص بك.

زيادة حجم كومة الذاكرة المؤقتة لـ JVM

إذا لاحظت بطء عمليات الإنشاء، وخاصةً عملية جمع البيانات غير المرغوب فيها تستغرق أكثر من 15% من وقت البناء في أداة تحليل الإصدار النتائج، فيجب عليك زيادة حجم الذاكرة المخصصة لـ Java Virtual Machine (JVM). في ملف gradle.properties، اضبط الحدّ الأقصى على 4 أو 6 أو 8 غيغابايت. كما هو موضح في المثال التالي:

org.gradle.jvmargs=-Xmx6g

بعد ذلك، أجرِ اختبارًا لتحسين سرعة الإصدار. الطريقة الأسهل لتحديد المقاطع المثلى الحجم هو زيادة الحد بمبلغ صغير ثم اختبار الإصدار الكافي تحسين السرعة.

إذا كنت تستخدم أيضًا أداة تجميع البيانات المهملة المتوازية من JVM، فمن المفترض أن يبدو الخط بأكمله كما يلي:

org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g

يمكنك تحليل أخطاء ذاكرة JVM من خلال تحويل HeapDumpOnOutOfMemoryError إلى خطأ. عليه. وبهذه الطريقة، سينشئ JVM نَسْخًا لأجزاء من الذاكرة عند نفاد الذاكرة.

استخدم فئات R غير الانتقالية

يمكنك استخدام صفَّين (R) غير انتقاليَين للحصول على إصدارات أسرع. للتطبيقات ذات الوحدات المتعددة. ويساعد إجراء ذلك في منع تكرار الموارد من خلال ضمان تتضمن فئة R لكل وحدة مراجع لمواردها الخاصة فقط بدون سحب المراجع من وتبعياتها. تؤدي هذه الطريقة إلى إنشاء إصدارات أسرع والاستفادة من المزايا المرتبطة بتجميع البيانات. والتجنب. هذا هو السلوك التلقائي في الإصدار 8.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android والإصدارات الأحدث.

بدءًا من Android Studio Bumblebee، يتم تلقائيًا تفعيل صفوف R غير الانتقالية في المشاريع الجديدة. بالنسبة إلى المشاريع التي تم إنشاؤها باستخدام إصدارات سابقة من "استوديو Android"، يجب تحديثها لاستخدام تقنية النقل غير الانتقالي. R صف عن طريق الانتقال إلى إعادة ضبط الإعدادات > نقل البيانات إلى فئات R غير الانتقالية

لمزيد من المعلومات حول موارد التطبيقات وصف R، يمكنك الاطّلاع على نظرة عامة على موارد التطبيقات

استخدم فئات R غير الثابتة

استخدام فئة R غير ثابتة ومجالات في التطبيقات والاختبارات لتحسين تزايد تجميع ملفات Java وتسمح بتقليل الموارد بدقة أكبر. R حقل للصف لا تكون دائمًا ثابتة بالنسبة للمكتبات، حيث يتم ترقيم الموارد عند تجميع حزمة APK للتطبيق أو الاختبار الذي يعتمد على تلك المكتبة. هذا هو السلوك التلقائي في الإصدار 8.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android والإصدارات الأحدث.

إيقاف علامة Jetifier

بما أنّ معظم المشاريع تستخدم مكتبات AndroidX مباشرةً، يمكنك إزالة ضَع علامة Jetifier لتحسين أداء التصميم. لإزالة علامة Jetifier، وضبط android.enableJetifier=false في ملف gradle.properties.

يمكن لأداة تحليل الإصدار إجراء تحقق لمعرفة ما إذا كان بإمكان العلامة إزالتها بأمان لتمكين مشروعك من الحصول على أداء أفضل و الانتقال من مكتبات دعم Android التي لم يتم الحفاظ عليها. لمعرفة المزيد عن أداة تحليل الإصدار، راجع تحديد مشاكل الإصدار وحلّها:

استخدام ذاكرة التخزين المؤقت للإعدادات

تشير رسالة الأشكال البيانية ذاكرة التخزين المؤقت للإعدادات تتيح لنظام Gradle تسجيل المعلومات حول إنشاء الرسم البياني لمهام الإنشاء وإعادة استخدامه في الإصدارات اللاحقة، ولن تحتاج أداة Gradle إلى إعادة ضبط الإصدار بالكامل مرة أخرى.

لتمكين ذاكرة التخزين المؤقت للتهيئة، اتبع الخطوات التالية:

  1. تأكد من أن جميع المكونات الإضافية للمشروع متوافقة.

    يمكنك استخدام تعمل أداة تحليل الإصدار على التحقق مما إذا كان مع ذاكرة التخزين المؤقت للتهيئة. تجري أداة تحليل الإصدار سلسلة من الاختبارات لتحديد ما إذا كان يمكن تشغيل الميزة للمشروع. عرض المشكلة رقم 13490 بشأن قائمة بالمكوّنات الإضافية المتوافقة.

  2. أضِف الرمز التالي إلى ملف gradle.properties:

      org.gradle.configuration-cache=true
      # Use this flag carefully, in case some of the plugins are not fully compatible.
      org.gradle.configuration-cache.problems=warn

عند تفعيل ذاكرة التخزين المؤقت للإعدادات، يكون ناتج الإصدار عند تشغيل مشروعك لأول مرة يقول Calculating task graph as no configuration cache is available for tasks. خلال عمليات التشغيل اللاحقة، فإن ناتج الإصدار يذكر Reusing configuration cache.

لمزيد من المعلومات حول ذاكرة التخزين المؤقت للإعدادات، يُرجى الاطّلاع على مشاركة المدوّنة. المراجعة التفصيلية للتخزين المؤقت للضبط وثائق Gradle حول ذاكرة التخزين المؤقت للإعدادات.

مشاكل ذاكرة التخزين المؤقت الخاصة بالإعدادات التي تم تقديمها في الإصدار 8.1 من Gradle 8.1 والإصدار 8.1 من المكوّن الإضافي Android Gradle

أصبحت ذاكرة التخزين المؤقت للإعدادات مستقرة في الإصدار 8.1 من Gradle 8.1، وتم تقديم واجهة برمجة تطبيقات الملفات. التتبع. يتم تسجيل المكالمات مثل File.exists() وFile.isDirectory() وFile.list() من قِبل نظام Gradle لتتبع ملفات إدخال التهيئة.

إنّ الإصدار 8.1 من المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) يستخدِم واجهات File API هذه لبعض الملفات التي يجب أن تدرجها Gradle. لا تعتبر مدخلات ذاكرة التخزين المؤقت. يؤدي ذلك إلى إيقاف ذاكرة التخزين المؤقت الإضافية عند استخدامها مع الإصدار 8.1 من Gradle أو الإصدارات الأحدث، ما يؤدي إلى إبطاء أداء الإصدار. يتم التعامل مع ما يلي كإدخالات ذاكرة التخزين المؤقت في الإصدار AGP 8.1:

الإدخال أداة تتبع المشكلات ثابت في
$GRADLE_USER_home/android/FakeDependency.jar المشكلة رقم 289232054 8.2 دولار أسترالي
إخراج cmake المشكلة رقم 287676077 8.2 دولار أسترالي
$GRADLE_USER_home/.android/analytics.settings المشكلة رقم 278767328 8.3 دولار أسترالي

في حال استخدام واجهات برمجة التطبيقات هذه أو مكوّن إضافي يستخدم قد تواجه تراجعًا في وقت إنشاء الإصدار، نظرًا لأن بعض الطرق تستند إلى استخدام واجهات برمجة التطبيقات إلى إيقاف إضافي لذاكرة التخزين المؤقت. يُرجى مراجعة تحسينات في تتبُّع إدخالات إعدادات الإصدار لمناقشة هذه الأنماط وكيفية إصلاح منطق التصميم، أو تعطيل تتبع واجهة برمجة التطبيقات للملفات.