إذا كان تطبيق Android يحتوي على مكتبات أصلية، يمكنك تفعيل عمليات تتبُّع تسلسل استدعاء الدوال البرمجية بالكامل وتقارير الأعطال التفصيلية للرمز البرمجي الأصلي بدءًا من Firebase Crashlytics من خلال إجراء بعض التعديلات الصغيرة على إعدادات ملف APK لتطبيقك.
يوضِّح هذا الدليل كيفية ضبط إعدادات ميزة الإبلاغ عن الأعطال باستخدام IDE IDE Firebase Crashlytics SDK لـ NDK.
إذا كنت تبحث عن كيفية بدء استخدام Crashlytics فيمشاريع Unity، يمكنك الاطّلاع على دليل بدء استخدام Unity.
قبل البدء
أضِف Firebase إلى مشروع Android إذا لم يسبق لك إجراء ذلك. إذا لم يكن لديك تطبيق Android، يمكنك تنزيل نموذج تطبيق.
إجراء مقترَح: للحصول تلقائيًا على سجلّات مسار التنقل لفهم إجراءات المستخدم التي أدّت إلى حدوث تعذّر أو خطأ غير قاتل أو حدث ANR، عليك تفعيل Google Analytics في مشروعك على Firebase.
إذا لم يكن Google Analytics مفعّلاً في مشروعك الحالي على Firebase، يمكنك تفعيله من علامة التبويب عمليات الدمج ضمن
في وحدة تحكّم > إعدادات المشروعFirebase.Google Analytics إذا كنت بصدد إنشاء مشروع جديد على Firebase، فعِّل Google Analytics أثناء سير عمل إنشاء المشروع.
تأكَّد من أنّ تطبيقك يحتوي على الحدّ الأدنى من الإصدارات المطلوبة التالية:
- Gradle 8.0
- الإصدار 8.1.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android
- المكوّن الإضافي 4.4.1 لنظام Gradle في "خدمات Google"
الخطوة 1: إضافة حزمة تطوير البرامج (SDK) لنظام التشغيل Crashlytics باستخدام حزمة تطوير البرامج (NDK) إلى تطبيقك
في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً<project>/<app-module>/build.gradle.kts
أو
<project>/<app-module>/build.gradle
)،
أضِف الاعتمادية لمكتبة Crashlytics NDK لنظام التشغيل Android. ننصحك باستخدام الرمز
Firebase Android BoM
للتحكّم في إصدارات المكتبة.
للحصول على تجربة مثالية مع Crashlytics، ننصحك بتفعيل Google Analytics في مشروعك على Firebase وإضافة حزمة تطوير البرامج (SDK) لمنصّة Firebase في "إحصاءات Google" إلى تطبيقك.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.9.0")) // Add the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk") implementation("com.google.firebase:firebase-analytics") }
باستخدام Firebase Android BoM، سيستخدم تطبيقك دائمًا إصدارات متوافقة من مكتبات Firebase لنظام التشغيل Android.
(بديل) إضافة تبعيات مكتبة Firebase بدون استخدام BoM
إذا اخترت عدم استخدام Firebase BoM، عليك تحديد كل إصدار من مكتبة Firebase في سطر التبعية الخاص به.
يُرجى العلم أنّه في حال استخدام مكتبات Firebase متعدّدة في تطبيقك، ننصحك بشدة باستخدام BoM لإدارة إصدارات المكتبة، ما يضمن توافق جميع الإصدارات.
dependencies { // Add the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-crashlytics-ndk:19.4.0") implementation("com.google.firebase:firebase-analytics:22.2.0") }
الخطوة 2: إضافة المكوّن الإضافي Crashlytics Gradle إلى تطبيقك
في ملف Gradle على مستوى الجذر (مستوى المشروع) (
<project>/build.gradle.kts
أو<project>/build.gradle
)، أضِف المكوّن الإضافي Crashlytics Gradle إلى القسمplugins
:plugins { // Make sure that you have the AGP plugin 8.1+ dependency id("com.android.application") version "8.1.4" apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id("com.google.gms.google-services") version "4.4.2" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.3" apply false }
plugins { // Make sure that you have the AGP plugin 8.1+ dependency id 'com.android.application' version '8.1.4' apply false // ... // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency id 'com.google.gms.google-services' version '4.4.2' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.3' apply false }
في ملف Gradle الخاص بالوحدة (على مستوى التطبيق) (عادةً
<project>/<app-module>/build.gradle.kts
أو<project>/<app-module>/build.gradle
)، أضِف المكوّن الإضافي Crashlytics Gradle:plugins { id("com.android.application") // ... // Make sure that you have the Google services Gradle plugin id("com.google.gms.google-services") // Add the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") }
plugins { id 'com.android.application' // ... // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' }
الخطوة 3: إضافة إضافة Crashlytics إلى حِزمك
في ملف Gradle الخاص بالوحدة (على مستوى التطبيق)
(عادةً <project>/<app-module>/build.gradle.kts
أو
<project>/<app-module>/build.gradle
)، اضبط إضافة Crashlytics.
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { getByName("release") { // Add this extension configure<CrashlyticsExtension> { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled = true } } } }
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
الخطوة 4: إعداد التحميل التلقائي للرموز الأصلية
لإنشاء مسارات تتبع تسلسل استدعاء الدوال البرمجية قابلة للقراءة من أعطال NDK، يجب أن يعرف Crashlytics
عن الرموز في الملفات الثنائية الأصلية. يتضمّن المكوّن الإضافي Crashlytics Gradle
مهمة uploadCrashlyticsSymbolFileBUILD_VARIANT
لأتمتة هذه العملية.
لكي تتمكّن من الوصول إلى مهمة تحميل الرموز المبرمَجة، تأكَّد من ضبط
nativeSymbolUploadEnabled
علىtrue
في ملف Gradle الخاص بالوحدة (على مستوى التطبيق).لكي تظهر أسماء الطرق في قوائم تتبُّع تسلسل استدعاء الدوال البرمجية، عليك استدعاء مهمة
uploadCrashlyticsSymbolFileBUILD_VARIANT
بشكل صريح بعد كل عملية إنشاء لمكتبة NDK. على سبيل المثال:>./gradlew app:assemble
BUILD_VARIANT \ app:uploadCrashlyticsSymbolFileBUILD_VARIANT تعتمد كل من حزمة Crashlytics SDK لنظام NDK ومكوّن Crashlytics الإضافي لنظام Gradle على توفّر معرّف إنشاء GNU داخل العناصر المشترَكة الأصلية.
يمكنك التحقّق من توفّر هذا المعرّف من خلال تشغيل ملف برمجي ثنائي باستخدام الرمز البرمجي
. إذا لم يكن رقم تعريف الإصدار متوفّرًا، أضِفreadelf -n
إلى علامات نظام الإنشاء لحلّ المشكلة.-Wl,--build-id
الخطوة 5: فرض تعطُّل اختباري لإنهاء عملية الإعداد
لإكمال عملية إعداد Crashlytics والاطّلاع على البيانات الأولية في لوحة بيانات Crashlytics في وحدة تحكّم Firebase، عليك فرض تعطُّل اختباري.
أضِف رمزًا إلى تطبيقك يمكنك استخدامه لإجبار الاختبار على تعطُّل.
يمكنك استخدام الرمز التالي في
MainActivity
لتطبيقك لإضافة زر إلى تطبيقك يؤدي إلى تعطُّله عند الضغط عليه. يظهر الزرّ بعنوان "اختبار الأعطال".val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
أنشئ تطبيقك وشغِّله.
يمكنك فرض حدوث عطل في الاختبار لإرسال أول تقرير عن عطل في تطبيقك:
افتح تطبيقك من جهاز الاختبار أو المحاكي.
في تطبيقك، اضغط على الزر "اختبار الأعطال" الذي أضفته باستخدام الرمز المعروض أعلاه.
بعد تعطُّل تطبيقك، أعِد تشغيله حتى يتمكّن من إرسال تقرير الأعطال إلى Firebase.
انتقِل إلى لوحة بيانات Crashlytics في وحدة تحكّم Firebase للاطّلاع على الأعطال في الاختبار.
إذا أعدنا تحميل وحدة التحكّم ولم يظهر لنا تعذُّر الاختبار بعد مرور خمس دقائق،فعِّل تسجيل تصحيح الأخطاء لمعرفة ما إذا كان تطبيقك يرسل تقارير الأعطال.
هذا كل ما في الأمر. تتتبّع أداة Crashlytics الآن تطبيقك بحثًا عن الأعطال، ويمكنك
الاطّلاع على تقارير الأعطال والإحصاءات وفحصها في لوحة بيانات
Crashlytics.
الخطوات التالية
(إجراء مقترَح) يمكنك الحصول على مساعدة في تصحيح أخطاء الأعطال الناتجة عن أخطاء الذاكرة الأصلية من خلال جمع تقارير GWP-ASan. يمكن أن تكون هذه الأخطاء المتعلّقة بالذاكرة مرتبطة بتلف الذاكرة في تطبيقك، وهو السبب الرئيسي لظهور ثغرات أمنية في التطبيقات. للاستفادة من ميزة تصحيح الأخطاء هذه، تأكَّد من أنّ تطبيقك يحتوي على GWP-ASan مفعَّل صراحةً ويستخدم أحدث حزمة تطوير برامج (SDK) من Crashlytics لنظام NDK (الإصدار 18.3.6 أو إصدار أحدث أو Firebase BoM الإصدار 31.3.0 أو إصدار أحدث).
تخصيص إعدادات تقارير الأعطال من خلال إضافة إعدادات تفعيل التقارير والسجلات والمفاتيح وتتبُّع الأخطاء غير المميتة
الدمج مع Google Play كي تتمكّن من فلترة تقارير أعطال تطبيق Android حسب Google Play المسار مباشرةً في لوحة بيانات Crashlytics يتيح لك ذلك التركيز بشكل أفضل على لوحة البيانات في عمليات الإنشاء المحدّدة.
تحديد المشاكل وحلّها
إذا ظهرت لك قوائم تتبُّع تسلسل استدعاء الدوال البرمجية مختلفة في وحدة تحكُّم Firebase وفي logcat، يُرجى الرجوع إلى دليل تحديد المشاكل وحلّها.
خيارات بديلة لتحميل الرموز
ينطبق سير العمل الرئيسي في هذه الصفحة أعلاه على عمليات إنشاء Gradle العادية. ومع ذلك، تستخدم بعض التطبيقات إعدادات أو أدوات مختلفة (على سبيل المثال، عملية معالجة ملف APK مختلفة عن Gradle). في هذه الحالات، قد تكون الخيارات التالية مفيدة لتحميل الرموز بنجاح.
الخيار: تحميل رموز وحدات المكتبة والموارد التابعة الخارجية
يمكن أن يكون هذا الخيار مفيدًا في الحالات التالية:
- في حال استخدام عملية إنشاء مخصّصة لـ NDK ضمن Gradle
- إذا كانت المكتبات الأصلية مضمّنة في مكتبة/وحدة ميزة أو تقدّمها جهة خارجية
- إذا تعذّر إكمال مهمة تحميل الرموز التلقائية أو إذا ظهرت لك أعطال غير مرمزة في لوحة البيانات
عرض تعليمات هذا الخيار
تفترض مهمة تحميل الرموز Crashlytics العادية أنّك تُنشئ مكتباتك المجمّعة من الرموز البرمجية الأصلية كجزء من عملية إنشاء Gradle لوحدة تطبيقك، باستخدام أدوات إنشاء NDK العادية مثل CMake.
ومع ذلك، إذا كنت تستخدِم عملية إنشاء مخصّصة لـ NDK ضمن Gradle، أو تم إنشاء مكتباتك المُجمَّعة من رموز برمجية أصلية في مكتبة/وحدة ميزة أو تم توفيرها من قِبل جهة خارجية، قد تحتاج إلى تحديد المسار إلى مكتباتك غير المُعرَّاة صراحةً. ولإجراء ذلك، يمكنك إضافة unstrippedNativeLibsDir
السمة ضمن إضافة Crashlytics في ملف إنشاء Gradle.
تأكَّد من إكمال المهام الأولية التالية من خطوات المعالجة الرئيسية في وقت سابق من هذه الصفحة:
لكي تتمكّن مهمة تحميل الرموز التلقائية من العثور على معلومات رموزها، أضِف ما يلي إلى ملف Gradle الخاص بالوحدة (على مستوى التطبيق) (عادةً
<project>/<app-module>/build.gradle.kts
أو<project>/<app-module>/build.gradle
):import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("
PATH/TO/UNSTRIPPED/DIRECTORY ") } } } }// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("
PATH/TO/UNSTRIPPED/DIRECTORY ") } } } }سيبحث المكوّن الإضافي Crashlytics بشكل متكرّر في الدليل المحدّد عن المكتبات الأصلية التي تحمل امتداد
.so
. بعد ذلك، يستخرج Crashlytics رموزاً لتحديد الأخطاء وحلّها من كل هذه المكتبات ويحمّلها إلى Firebase servers.في ما يلي ما يمكنك تحديده في السمة
unstrippedNativeLibsDir
:أي وسيطة مسموح بها لسمة
org.gradle.api.Project#files(Object...)
، بما في ذلك: أوjava.lang.String
أوjava.io.File
org.gradle.api.file.FileCollection
دلائل متعددة لنكهة إصدار واحدة من خلال تقديم قائمة أو مثيل
FileCollection
(بدءًا من Crashlytics الإصدار 3.0.0 من المكوّن الإضافي Gradle) تجميع عدة directories في منتجات فردية وإنشاء النُسخ المخصّصة
عرض مثال يتضمّن أدلة متعددة
buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("
MY/NATIVE/LIBS ") } } productFlavors { flavorDimensions += "feature" create("basic") { dimension = "feature" // ... } create("featureX") { dimension = "feature" configure<CrashlyticsExtension> { unstrippedNativeLibsDir = file("MY/FEATURE_X/LIBS ") } } } }لن تحمِّل مهمة
uploadCrashlyticsSymbolFilesBasicRelease
سوى الرموز فيMY/NATIVE/LIBS
، ولكن ستحمِّل مهمةuploadCrashlyticsSymbolFilesFeatureXRelease
الرموز في كلاً منMY/NATIVE/LIBS
وMY/FEATURE_X/LIBS
.أخيرًا، عليك فرض تعطُّل اختباري لإنهاء إعداد Crashlytics والاطّلاع على البيانات الأولية في لوحة بيانات Crashlytics في وحدة تحكّم Firebase.
الخيار: تحميل الرموز لعمليات الإنشاء التي لا تستخدم Gradle أو المكتبات المجمّعة من الرموز البرمجية الأصلية غير القابلة للوصول إليها
يمكن أن يكون هذا الخيار مفيدًا في الحالات التالية:
في حال استخدام عملية إنشاء غير Gradle
إذا تم تزويدك بالمكتبات المجمّعة من رموز برمجية أصلية غير مُعرَّاة بطريقة تجعل الوصول إليها غير ممكن أثناء عمليات إنشاء Gradle
عرض تعليمات هذا الخيار
يتطلب هذا الخيار تنفيذ أمر سطر أوامر Firebase عند إنشاء إصدار أو أي إصدار تريد الاطّلاع على عمليات تتبُّع تسلسل استدعاء الدوال البرمجية المُشفَّرة له في وحدة تحكّم Firebase.
تأكَّد من إكمال المهام الأولية التالية من خطوات المعالجة الرئيسية في وقت سابق من هذه الصفحة:
تمت إضافة حزمة تطوير البرامج (SDK) لنظام التشغيل NDK من Crashlytics و مكوّن Gradle الإضافي لنظام التشغيل Crashlytics.
يُرجى العِلم أنّه باستخدام هذا الخيار، لن تحتاج إلى إضافة
firebaseCrashlytics
الإضافة أو إعداد تحميل الرموز تلقائيًا لأنّك ستستخدم بدلاً من ذلك واجهة FirebaseCLI (الخطوات التالية أدناه) لإنشاءملفّات الرموز وتحميلها.اضبط البيئة والمشروع لتحميل الرموز:
اتّبِع التعليمات لتثبيت واجهة برمجة التطبيقات Firebase.
إذا سبق لك تثبيت واجهة برمجة التطبيقات، احرص على تحديثها إلى أحدث إصدار.
(للتطبيقات التي تستخدم المستوى 30 أو أعلى من Android API فقط) عدِّل
AndroidManifest.xml
نموذج تطبيقك لإيقاف وضع علامات على المؤشرات:ضَع علامة في المربّع بجانب إعدادات مشغّل Android > إعدادات النشر > الإصدار > البيان الرئيسي المخصّص.
افتح نموذج البيان المتوفّر في
Assets/Plugins/Android/AndroidManifest.xml
.أضِف السمة التالية إلى علامة التطبيق:
<application android:allowNativeHeapPointerTagging="false" ... />
أنشئ مشروعك.
حمِّل معلومات الرموز.
بعد الانتهاء من عملية الإنشاء، أنشئ ملفًا لرمز متوافق معCrashlytics وحمِّله إلى خوادم Firebase من خلال تنفيذ الأمر التالي لFirebase CLI:
firebase crashlytics:symbols:upload --app=
FIREBASE_APP_ID PATH/TO/SYMBOLS FIREBASE_APP_ID: رقم تعريف تطبيق Firebase لنظام التشغيل Android (وليس اسم الحزمة)
مثال على رقم تعريف تطبيق Firebase لنظام التشغيل Android:1:567383003300:android:17104a2ced0c9b9b
هل تحتاج إلى العثور على معرّف تطبيقك في Firebase؟
في ما يلي طريقتان للعثور على معرّف تطبيقك في Firebase:
في ملف
google-services.json
، يكون رقم تعريف التطبيق هو القيمةmobilesdk_app_id
.في وحدة تحكّم Firebase، انتقِل إلى إعدادات المشروع. انتقِل إلى أسفل البطاقة تطبيقاتك، ثم انقر على تطبيق Firebase المطلوب للعثور على رقم تعريفه.
PATH/TO/SYMBOLS: مسار ملف الرموز الذي تم إنشاؤه باستخدام واجهة سطر الأوامر
تم تصديرها إلى مشروع في "استوديو Android": PATH/TO/SYMBOLS يمكن أن يكون أي دليل. سيبحث Firebase CLI بشكل متكرر في الدليل المحدّد عن المكتبات الأصلية التي تحمل امتداد
.so
.تم إنشاء حزمة APK مباشرةً من داخل Unity: PATH/TO/SYMBOLS هو مسار ملف الرموز المضغوط الذي تم إنشاؤه في الدليل الجذر للمشروع عند انتهاء عملية الإنشاء (على سبيل المثال:
).myproject/myapp-1.0-v100.symbols.zip
عرض الخيارات المتقدّمة لاستخدام Firebase أمر سطر الأوامر لإنشاء ملفات الرموز وتحميلها
الإبلاغ الوصف --generator=csym
يستخدم أداة إنشاء ملفات الرموز cSYM القديمة بدلاً من أداة إنشاء Breakpad التلقائية
لا يُنصح باستخدامها. ننصحك باستخدام ملف الترميز التلقائي لبرنامج Breakpad.
--generator=breakpad
استخدام أداة إنشاء ملفات الرموز البرمجية Breakpad
يُرجى العِلم أنّ الإعداد التلقائي لإنشاء ملف الرموز هو Breakpad. لا تستخدِم هذا الإعداد إلا إذا أضفت
في إعدادات الإنشاء وأردت إلغاء استخدامه لاستخدام Breakpad بدلاً من ذلك.symbolGenerator { csym() }
--dry-run
إنشاء ملفات الرموز بدون تحميلها
تكون هذه العلامة مفيدة إذا كنت تريد فحص محتوى الملفات المُرسَلة.
--debug
يوفّر معلومات إضافية عن تصحيح الأخطاء أخيرًا، عليك فرض تعطُّل اختباري لإنهاء إعداد Crashlytics والاطّلاع على البيانات الأولية في لوحة بيانات Crashlytics في وحدة تحكّم Firebase.
بعد إنشاء تطبيقك كجزء من فرض حدوث عطل، احرص على تنفيذ الأمر Firebase CLI
crashlytics:symbols:upload
لتحميل ملف الرمز العميق.