توزيع تطبيقات Android على المختبِرين باستخدام Gradle


يمكنك دمج App Distribution في عملية إنشاء تطبيق Android باستخدام المكوّن App Distribution الإضافي لنظام Gradle. يتيح لك المكوّن الإضافي تحديد المختبِرين و ملاحظات الإصدار في ملف Gradle الخاص بتطبيقك، ما يتيح لك ضبط عمليات التوزيع لأنواع الإصدارات ونُسخ تطبيقك المختلفة.

يوضّح هذا الدليل كيفية توزيع حِزم APK على المختبِرين باستخدام ملف App Distribution Gradle الإضافي.

قبل البدء

أضِف Firebase إلى مشروع Android، في حال لم يسبق لك إجراء ذلك.

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

الخطوة 1: إعداد مشروع Android

  1. في ملف Gradle على مستوى الجذر (على مستوى المشروع) (<project>/build.gradle.kts أو <project>/build.gradle)، أضِف المكوّن الإضافي App Distribution Gradle كعنصر تابع:

    KotlinGroovy
    plugins {
        // ...
        id("com.android.application") version "7.3.0" apply false
    
        // Make sure that you have the Google services Gradle plugin dependency
        id("com.google.gms.google-services") version "4.4.2" apply false
    
        // Add the dependency for the App Distribution Gradle plugin
        id("com.google.firebase.appdistribution") version "5.1.1" apply false
    }
    plugins {
        // ...
        id 'com.android.application' version '7.3.0' apply false
    
        // Make sure that you have the Google services Gradle plugin dependency
        id 'com.google.gms.google-services' version '4.4.2' apply false
    
        // Add the dependency for the App Distribution Gradle plugin
        id 'com.google.firebase.appdistribution' version '5.1.1' apply false
    }
  2. في ملف Gradle الخاص بالوحدة (على مستوى التطبيق) (عادةً <project>/<app-module>/build.gradle.kts أو <project>/<app-module>/build.gradle)، أضِف المكوّن الإضافي App Distribution Gradle:

    KotlinGroovy
    plugins {
      id("com.android.application")
    
      // Make sure that you have the Google services Gradle plugin
      id("com.google.gms.google-services")
    
      // Add the App Distribution Gradle plugin
      id("com.google.firebase.appdistribution")
    }
    plugins {
      id 'com.android.application'
    
      // Make sure that you have the Google services Gradle plugin
      id 'com.google.gms.google-services'
    
      // Add the App Distribution Gradle plugin
      id 'com.google.firebase.appdistribution'
    }
  3. إذا كنت تستخدم خادمًا وكيلاً أو جدار حماية تابعَين لمؤسسة، أضِف خاصية نظام Java التالية التي تتيح لتطبيق App Distribution تحميل إصداراتك إلى Firebase:

    -Djavax.net.ssl.trustStore=/path/to/truststore -Djavax.net.ssl.trustStorePassword=password
    

الخطوة 2: المصادقة باستخدام Firebase

لاستخدام المكوّن الإضافي Gradle، عليك أولاً المصادقة باستخدام مشروعك على Firebase بإحدى الطرق التالية. يبحث المكوّن الإضافي Gradle تلقائيًا عن بيانات الاعتماد من وحدة تحكّم Firebase CLI في حال عدم استخدام طريقة مصادقة أخرى.

تتيح لك المصادقة باستخدام حساب خدمة استخدام المكوّن الإضافي بمرونة مع نظام الدمج المستمر (CI). هناك طريقتان لتقديم بيانات اعتماد حساب الخدمة:

  • نقْل ملف مفتاح حساب الخدمة إلى build.gradle. قد تجد هذه المحاولة ملائمة إذا كان لديك ملف مفتاح حساب الخدمة في بيئة الإنشاء.
  • اضبط متغيّر البيئة GOOGLE_APPLICATION_CREDENTIALS للإشارة إلىملف مفتاح حساب الخدمة. قد تفضّل هذه الطريقة إذا سبق أن تم إعداد "بيانات اعتماد التطبيق التلقائية" (ADC) لخدمة أخرى من Google (مثل Google Cloud).

للمصادقة باستخدام بيانات اعتماد حساب الخدمة:

  1. في وحدة تحكّم Google Cloud، اختَر مشروعك وأنشئ حساب خدمة جديدًا.
  2. أضِف دور Firebase App Distribution المشرف.
  3. أنشئ مفتاحًا خاصًا بترميز JSON وانقل المفتاح إلى موقع يمكن لبيئة الإنشاء الوصول إليه. احرص على الاحتفاظ بهذا الملف في مكان آمن، لأنّه يمنح إذن وصول المشرف إلى App Distribution في مشروعك على Firebase.
  4. تخطّ هذه الخطوة إذا أنشأت تطبيقك بعد 20 أيلول (سبتمبر) 2019: في وحدة تحكّم Google APIs، فعِّل واجهة برمجة التطبيقات Firebase App Distribution API. اختَر المشروع الذي يحمل الاسم نفسه لمشروعك على Firebase عند ظهور طلب بذلك.
  5. قدِّم بيانات اعتماد حساب الخدمة أو حدِّد مكانها:

    1. لتمرير مفتاح حساب الخدمة إلى Gradle، اضبط السمة serviceCredentialsFile في ملف build.gradle على ملف JSON للمفتاح الخاص.
    2. لتحديد موقع بيانات الاعتماد باستخدام أداة ADC، اضبط متغيّر البيئة GOOGLE_APPLICATION_CREDENTIALS على مسار ملف JSON للمفتاح الخاص. على سبيل المثال:

       export GOOGLE_APPLICATION_CREDENTIALS=/absolute/path/to/credentials/file.json
      

      لمزيد من المعلومات عن المصادقة باستخدام ADC، يُرجى الاطّلاع على مقالة تقديم بيانات الاعتماد إلى تطبيقك.

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

الخطوة 3: ضبط إعدادات مواقع التوزيع

في ملف Gradle الخاص بالوحدة (على مستوى التطبيق) (عادةً هو <project>/<app-module>/build.gradle.kts أو <project>/<app-module>/build.gradle)، يمكنك ضبط App Distribution من خلال إضافة firebaseAppDistribution واحد على الأقل.

على سبيل المثال، لتوزيع الإصدار release على المختبِرين، اتّبِع الخطوات التالية:

KotlinGroovy
import com.google.firebase.appdistribution.gradle.firebaseAppDistribution

android {

  // ...

  buildTypes {
      getByName("release") {
          firebaseAppDistribution {
              artifactType = "APK"
              releaseNotesFile = "/path/to/releasenotes.txt"
              testers = "ali@example.com, bri@example.com, cal@example.com"
          }
      }
  }

  // ...
}
android {

  // ...

  buildTypes {
      release {
          firebaseAppDistribution {
              artifactType="APK"
              releaseNotesFile="/path/to/releasenotes.txt"
              testers="ali@example.com, bri@example.com, cal@example.com"
          }
      }
  }

  // ...
}

يمكنك ضبط App Distribution لأجل أنواع الإصدارات ونُسخ المنتجات.

على سبيل المثال، لتوزيع إصدارَي debug وrelease في طعمَي المنتج "تجريبي" و "كامل"، اتّبِع التعليمات التالية:

KotlinGroovy
import com.google.firebase.appdistribution.gradle.firebaseAppDistribution

android {

  // ...

  buildTypes {
      getByName("debug") {...}
      getByName("release") {...}
  }

  flavorDimensions += "version"
  productFlavors {
      create("demo") {
          dimension = "version"
          firebaseAppDistribution {
              releaseNotes = "Release notes for demo version"
              testers = "demo@testers.com"
          }
      }
      create("full") {
          dimension = "version"
          firebaseAppDistribution {
              releaseNotes = "Release notes for full version"
              testers = "full@testers.com"
          }
      }
  }

  // ...
}
android {

  // ...

  buildTypes {
      debug {...}
      release {...}
  }

  flavorDimensions "version"
  productFlavors {
      demo {
          dimension "version"
          firebaseAppDistribution {
              releaseNotes="Release notes for demo version"
              testers="demo@testers.com"
          }
      }
      full {
          dimension "version"
          firebaseAppDistribution {
              releaseNotes="Release notes for full version"
              testers="full@testers.com"
          }
      }
  }

  // ...
}

استخدِم المَعلمات التالية لضبط التوزيع:

App Distribution مَعلمات الإنشاء
appId

رقم تعريف تطبيقك على Firebase لا يُشترط ذلك إلا إذا لم يكن لديك المكوّن الإضافي لـ Google Services Gradle مثبّتًا. يمكنك العثور على معرّف التطبيق فيملف google-services.json أو في وحدة تحكّم Firebase في صفحة "الإعدادات العامة". تلغي القيمة الواردة في ملف build.gradle القيمة التي يتم عرضها من المكوّن الإضافي google-services.

appId="1:1234567890:android:321abc456def7890"
serviceCredentialsFile

المسار إلى ملف JSON للمفتاح الخاص في حساب الخدمة. مطلوب فقط في حال استخدام مصادقة حساب الخدمة.

artifactType

تُحدِّد نوع ملف تطبيقك. يمكن ضبطه على "AAB" أو "APK".

artifactPath

المسار المطلق لملف APK أو AAB الذي تريد تحميله

releaseNotes أو releaseNotesFile

ملاحظات الإصدار لهذا الإصدار

يمكنك تحديد ملاحظات الإصدار مباشرةً أو المسار إلى ملف نص عادي.

testers أو testersFile

عناوين البريد الإلكتروني للمختبِرين الذين تريد توزيع الإصدارات عليهم

يمكنك تحديد المختبِرين كقائمة مفصولة بفواصل لعناوين البريد الإلكتروني التالية:

testers="ali@example.com, bri@example.com, cal@example.com"

أو يمكنك تحديد مسار ملف يحتوي على قائمة مفصولة بفواصل لعناوين البريد الإلكتروني:

testersFile="/path/to/testers.txt"
groups أو groupsFile

مجموعات المختبِرين الذين تريد توزيع الإصدارات عليهم (راجِع إدارة المختبِرين). يتم تحديد المجموعات باستخدام الأسماء البديلة للمجموعات، والتي يمكنك العثور عليها في علامة التبويب المختبِرون في "وحدة تحكُّم Firebase App Distribution".

يمكنك تحديد المجموعات كقائمة مفصولة بفواصل من الأسماء البديلة للمجموعات:

groups="qa-team, android-testers"

أو يمكنك تحديد مسار ملف يحتوي على قائمة بالمرادفات للمجموعات مفصولة بفاصل:

groupsFile="/path/to/tester-groups.txt"
testDevices أو testDevicesFile

تشكّل أنواع التوزيع التالية جزءًا من الميزة التجريبية للمختبِر الآلي.

الأجهزة الاختبارية التي تريد توزيع الإصدارات عليها (راجِع الاختبارات المبرمَجة).

يمكنك تحديد الأجهزة الاختبارية كقائمة مفصولة بفواصل منقوطة ل مواصفات الأجهزة:

testDevices="model=shiba,version=34,locale=en,orientation=portrait;model=b0q,version=33,locale=en,orientation=portrait"

أو يمكنك تحديد مسار ملف يحتوي على قائمة بمواصفات الجهاز مفصولة بنقطتَي فاصلة:

testDevicesFile="/path/to/testDevices.txt"
testUsername

اسم المستخدم لتسجيل الدخول التلقائي الذي سيتم استخدامه أثناء الاختبارات المبرمَجة.

testPassword أو testPasswordFile

كلمة مرور تسجيل الدخول التلقائي التي سيتم استخدامها أثناء الاختبارات المبرمَجة

أو يمكنك تحديد مسار ملف نصي عادي يحتوي على كلمة مرور:

testPasswordFile="/path/to/testPassword.txt"
testUsernameResource

اسم المورد لحقل اسم المستخدم لتسجيل الدخول التلقائي الذي سيتم استخدامه أثناء الاختبارات المبرمَجة.

testPasswordResource

اسم المورد لحقل كلمة المرور لتسجيل الدخول التلقائي الذي سيتم استخدامه أثناء الاختبارات المبرمَجة.

testNonBlocking

تنفيذ الاختبارات المبرمَجة بشكل غير متزامن انتقِل إلى "وحدة تحكُّم Firebase" للاطّلاع على نتائج الاختبار التلقائي.

stacktrace

تُطبع تتبع تسلسل استدعاء الدوال البرمجية لاستثناءات المستخدم. ويساعد ذلك في تصحيح الأخطاء.

الخطوة 4: توزيع تطبيقك على المختبِرين

  1. أخيرًا، لحزمة تطبيقك التجريبي ودعوتك للمختبِرين، يمكنك إنشاء الاستهدافين BUILD-VARIANT و appDistributionUploadBUILD-VARIANT باستخدام ملف Gradle wrapper في مشروعك، حيث يكون BUILD-VARIANT هو نوع المنتج ونوع الإصدار الاختياريَين اللذَين أعددتهما في الخطوة السابقة. لمزيد من المعلومات عن أنواع المنتجات، يُرجى الاطّلاع على مقالة ضبط أنواع الإصدار.

    على سبيل المثال، لتوزيع تطبيقك باستخدام إصدار release، يمكنك تنفيذ الرمز التالي:

    ./gradlew assembleRelease appDistributionUploadRelease
    

    أو إذا سجّلت الدخول باستخدام حسابك على Google ولم تقدِّم بيانات الاعتماد في ملف إنشاء Gradle، أدرِج المتغيّر FIREBASE_TOKEN:

    export FIREBASE_TOKEN=1/a1b2c3d4e5f67890
    ./gradlew --stop // Only needed for environment variable changes
    ./gradlew assembleRelease appDistributionUploadRelease
    
  2. يمكنك أيضًا إلغاء القيم المحدّدة في ملف build.gradle من خلال تمرير وسيطات سطر الأوامر في شكل --<property-name>=<property-value>. على سبيل المثال:

    • لتحميل إصدار مخصّص لتصحيح الأخطاء إلى App Distribution:

      ./gradlew bundleDebug appDistributionUploadDebug
          --artifactType="APK"
    • لدعوة مختبِرين إضافيين أو إزالة مختبِرين حاليين من مشروعك على Firebase:

      ./gradlew appDistributionAddTesters
          --projectNumber=<project_number>
          --emails="anothertester@email.com, moretesters@email.com"
      ./gradlew appDistributionRemoveTesters
          --projectNumber=<project_number>
          --emails="anothertester@email.com, moretesters@email.com"

      بعد إضافة مختبِر إلى مشروعك على Firebase، يمكنك إضافته إلى إصدارات فردية. لن يعود بإمكان المختبِرين الذين تمت إزالتهم الوصول إلى الإصدارات في مشروعك، ولكن قد يظل بإمكانهم الوصول إلى إصداراتك لفترة زمنية.

    يمكنك أيضًا تحديد المختبِرين باستخدام --file="/path/to/testers.txt" بدلاً من --emails.

    تقبل مهمتَا appDistributionAddTesters وappDistributionRemoveTesters الوسيطات التالية أيضًا:

    • projectNumber: رقم مشروعك على Firebase.

    • serviceCredentialsFile: مسار ملف بيانات اعتماد خدمة Google هذه هي الوسيطة نفسها المستخدَمة في إجراء التحميل.

يعرض المكوّن الإضافي Gradle الروابط التالية بعد تحميل الإصدار. تساعدك هذه السلسلة من الخطوات في إدارة الملفات الثنائية والتأكّد من حصول المختبِرين والمطوّرين الآخرين على الإصدار الصحيح:

  • firebase_console_uri - رابط إلى وحدة تحكّم Firebase يعرض إصدارًا واحدًا. يمكنك مشاركة هذا الرابط مع مطوّرين آخرين في مؤسستك.
  • testing_uri - رابط يؤدي إلى الإصدار في تجربة المختبِر (تطبيق أصلي لنظام التشغيل Android) يتيح للمختبِرين الاطّلاع على ملاحظات الإصدار وتثبيت التطبيق على أجهزتهم. يحتاج المختبِر إلى إذن بالوصول إلى الإصدار لاستخدام الرابط.
  • binary_download_uri - رابط موقَّع يتيح تنزيل ملف التطبيق الثنائي (ملف APK أو حزمة AAB) و تثبيته مباشرةً. تنتهي صلاحية الرابط بعد ساعة واحدة.

بعد توزيع الإصدار، يصبح متوفّرًا في لوحة بيانات App Distribution في وحدة تحكّم Firebase لمدة 150 يومًا (خمسة أشهر). عندما تبقى 30 يومًا على انتهاء صلاحية الإصدار، يظهر إشعار بانتهاء الصلاحية في كلٍّ من وحدة التحكّم وقائمة الإصدارات لدى المختبِر على جهاز الاختبار.

يتلقّى المختبِرون الذين لم تتم دعوتهم لاختبار التطبيق دعوات عبر البريد الإلكتروني لبدء الاختبار، ويتلقّى المختبِرون الحاليون إشعارات عبر البريد الإلكتروني تفيد بأنّ الإصدار الجديد جاهز للاختبار (اطّلِع على دليل إعداد المختبِر للحصول على تعليمات حول كيفية تثبيت الإصدار الاختباري من التطبيق). يمكنك مراقبة حالة كل مختبِر، سواء قبل الدعوة أو نزَّل التطبيق، في وحدة تحكّم Firebase.

يمكن للمختبِرين قبول دعوة لاختبار التطبيق خلال 30 يومًا قبل أن تنتهي صلاحيتها. عندما تبقى 5 أيام على انتهاء صلاحية الدعوة، يظهر إشعار بانتهاء الصلاحية في وحدة تحكّم Firebase بجانب المختبِر في الإصدار. يمكن تجديد الدعوة من خلال إعادة إرسالها باستخدام القائمة المنسدلة في صف المختبِر.

الخطوات التالية