إذا كان تطبيق Android يتضمّن مكتبات أصلية، يمكنك تفعيل عمليات تتبُّع تسلسل استدعاء الدوال البرمجية الكاملة وتقارير الأعطال التفصيلية للرمز البرمجي الأصلي من Firebase Crashlytics من خلال إجراء بعض التعديلات الصغيرة على إعدادات إنشاء تطبيقك.
يوضّح هذا الدليل كيفية إعداد ميزة "إعداد تقارير الأعطال" باستخدام Firebase Crashlytics SDK لنظام NDK.
إذا كنت تبحث عن كيفية بدء استخدام Crashlytics في مشاريع Unity، يمكنك الاطّلاع على دليل بدء استخدام Unity.
قبل البدء
أضِف Firebase إلى مشروع Android الخاص بك، في حال لم يسبق لك إجراء ذلك. إذا لم يكن لديك تطبيق Android، يمكنك تنزيل تطبيق تجريبي.
يُنصح بما يلي: للحصول تلقائيًا على سجلّات مسار التنفيذ لفهم إجراءات المستخدمين التي أدّت إلى حدوث عُطل أو خطأ غير فادح أو حدث ANR، عليك تفعيل Google Analytics في مشروعك على Firebase.
إذا لم يتم تفعيل Google Analytics في مشروعك الحالي على Firebase، يمكنك تفعيل Google Analytics من علامة التبويب عمليات الدمج ضمن
في وحدة تحكّم > إعدادات المشروعFirebase. إذا كنت بصدد إنشاء مشروع جديد في Firebase، فعِّل Google Analytics أثناء خطوات إنشاء المشروع.
تأكَّد من أنّ تطبيقك يتضمّن الحدّ الأدنى المطلوب من الإصدارات التالية:
- Gradle 8.0
- الإصدار 8.1.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android
- الإصدار 4.4.1 من المكوّن الإضافي لخدمات Google في Gradle
الخطوة 1: إضافة حزمة تطوير البرامج 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) الخاصة بخدمة "إحصاءات Google" لبرنامج Firebase إلى تطبيقك.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.2.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:20.0.1") implementation("com.google.firebase:firebase-analytics:23.0.0") }
الخطوة 2: إضافة إضافة Crashlytics Gradle إلى تطبيقك
في ملف Gradle على مستوى الجذر (على مستوى المشروع) (
<project>/build.gradle.kts
أو<project>/build.gradle
)، أضِف المكوّن الإضافي Crashlytics Gradle إلى الحظرplugins
:Kotlin
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.3" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.6" apply false }
Groovy
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.3' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.6' apply false }
في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً
<project>/<app-module>/build.gradle.kts
أو<project>/<app-module>/build.gradle
)، أضِف المكوّن الإضافي Crashlytics Gradle:Kotlin
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") }
Groovy
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.
Kotlin
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 } } } }
Groovy
// ... 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 plugin
المهمة uploadCrashlyticsSymbolFileBUILD_VARIANT
لأتمتة هذه العملية.
للوصول إلى مهمة تحميل الرموز تلقائيًا، تأكَّد من ضبط
nativeSymbolUploadEnabled
علىtrue
في ملف Gradle الخاص بالوحدة (على مستوى التطبيق).لكي تظهر أسماء الطرق في عمليات تتبُّع تسلسل استدعاء الدوال البرمجية، عليك استدعاء مهمة
uploadCrashlyticsSymbolFileBUILD_VARIANT
بشكل صريح بعد كل إصدار من مكتبة NDK. على سبيل المثال:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
تعتمد كلّ من Crashlytics حزمة تطوير البرامج (SDK) الخاصة بـ NDK وCrashlytics المكوّن الإضافي لنظام Gradle على توفّر معرّف الإصدار GNU ضمن الكائنات المشتركة الأصلية.
يمكنك التأكّد من توفّر هذا المعرّف من خلال تنفيذ الأمر
على كل ملف ثنائي. إذا كان رقم تعريف الإصدار غير متوفّر، أضِفreadelf -n
إلى علامات نظام الإصدار لحلّ المشكلة.-Wl,--build-id
الخطوة 5: فرض حدوث عُطل تجريبي لإكمال عملية الإعداد
لإكمال عملية إعداد Crashlytics والاطّلاع على البيانات الأولية في لوحة بيانات Crashlytics ضمن وحدة تحكّم Firebase، عليك فرض حدوث عُطل تجريبي.
أضِف رمزًا برمجيًا إلى تطبيقك يمكنك استخدامه لإحداث عُطل تجريبي.
يمكنك استخدام الرمز التالي في
MainActivity
لتطبيقك لإضافة زر إلى تطبيقك يؤدي إلى تعطُّل التطبيق عند الضغط عليه. يتم تصنيف الزر على أنّه "اختبار تعطُّل".Kotlin
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))
Java
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 بشكلٍ صريح ويستخدم أحدث إصدار من Crashlytics حزمة تطوير البرامج (SDK) الخاصة بـ NDK (الإصدار 18.3.6 أو إصدار أحدث أو Firebase BoM الإصدار 31.3.0 أو إصدار أحدث).
تخصيص إعدادات تقارير الأعطال من خلال إضافة ميزة إعداد التقارير عند الموافقة، والسجلات، والمفاتيح، وتتبُّع الأخطاء غير القاتلة
يمكنك الدمج مع Google Play حتى تتمكّن من فلترة تقارير الأعطال في تطبيق Android حسب مسار Google Play مباشرةً في لوحة بيانات Crashlytics. يتيح لك ذلك التركيز بشكل أفضل على إصدارات معيّنة في لوحة البيانات.
تحديد المشاكل وحلّها
إذا كنت ترى عمليات تتبُّع تسلسل استدعاء الدوال البرمجية مختلفة في وحدة تحكّم Firebase وفي logcat، يُرجى الرجوع إلى دليل تحديد المشاكل وحلّها.
خيارات بديلة لتحميل الرموز
يسري سير العمل الرئيسي في هذه الصفحة أعلاه على عمليات إنشاء Gradle العادية. ومع ذلك، تستخدم بعض التطبيقات إعدادات أو أدوات مختلفة (على سبيل المثال، عملية إنشاء غير Gradle). في هذه الحالات، قد تكون الخيارات التالية مفيدة لتحميل الرموز بنجاح.
الخيار: تحميل الرموز لوحدات المكتبة والتبعيات الخارجية
يمكن أن يكون هذا الخيار مفيدًا في الحالات التالية:
- في حال استخدام عملية إصدار NDK مخصّصة ضمن Gradle
- إذا تم إنشاء المكتبات الأصلية في وحدة مكتبة أو وحدة ميزات أو تم توفيرها من خلال جهة خارجية
- إذا كانت مهمة التحميل التلقائي للرموز لا تعمل أو كنت ترى أعطالاً غير مصحوبة برموز في لوحة البيانات
الخيار: تحميل الرموز البرمجية للإصدارات غير المستندة إلى Gradle أو المكتبات الأصلية غير المضغوطة التي لا يمكن الوصول إليها
يمكن أن يكون هذا الخيار مفيدًا في الحالات التالية:
في حال استخدام عملية إنشاء غير Gradle
إذا تم توفير المكتبات الأصلية غير المضغوطة لك بطريقة لا يمكن الوصول إليها أثناء عمليات إنشاء Gradle