إذا كان تطبيق Android الخاص بك يحتوي على مكتبات أصلية ، فيمكنك تمكين تتبع المكدس الكامل وتقارير الأعطال التفصيلية للرمز الأصلي الخاص بك من Firebase Crashlytics مع بعض التحديثات الصغيرة لتهيئة بنية التطبيق.
يصف هذا الدليل كيفية تكوين تقارير الأعطال باستخدام Firebase Crashlytics SDK لـ NDK.
إذا كنت تبحث عن كيفية بدء استخدام Crashlytics في مشاريع الوحدة الخاصة بك ، فراجع دليل بدء التشغيل Unity .
قبل ان تبدأ
أضف Firebase إلى مشروع Android ، إذا لم تكن قد قمت بذلك بالفعل. إذا لم يكن لديك تطبيق Android ، فيمكنك تنزيل نموذج للتطبيق .
موصى به : للحصول على ميزات مثل المستخدمين الذين لم يتعرضوا للأعطال وسجلات التنقل وتنبيهات السرعة ، تحتاج إلى تمكين Google Analytics في مشروع Firebase.
إذا لم يتم تمكين Google Analytics لمشروع Firebase الحالي ، فيمكنك تمكين Google Analytics من علامة التبويب "التكامل" في > إعدادات المشروع في وحدة تحكم Firebase.
إذا كنت تنشئ مشروع Firebase جديدًا ، فقم بتمكين Google Analytics أثناء سير عمل إنشاء المشروع.
الخطوة 1 : أضف Crashlytics SDK لـ NDK إلى تطبيقك
في ملف Gradle (على مستوى التطبيق) الوحدة النمطية الخاصة بك (عادةً<project>/<app-module>/build.gradle.kts
أو <project>/<app-module>/build.gradle
) ، أضف تبعية Crashlytics NDK مكتبة Android. نوصي باستخدام Firebase Android BoM للتحكم في إصدارات المكتبة.للحصول على تجربة مثالية مع Crashlytics ، نوصي بتمكين Google Analytics في مشروع Firebase وإضافة Firebase SDK لـ Google Analytics إلى تطبيقك.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.3.1")) // 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-ktx") }
باستخدام 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:18.4.3") implementation("com.google.firebase:firebase-analytics-ktx:21.3.0") }
Java
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.3.1")) // 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:18.4.3") implementation("com.google.firebase:firebase-analytics:21.3.0") }
الخطوة 2 : أضف المكوّن الإضافي Crashlytics Gradle إلى تطبيقك
في ملف Gradle على مستوى الجذر (على مستوى المشروع) (
<project>/build.gradle.kts
أو<project>/build.gradle
) ، أضف إضافة Crashlytics Gradle إلى كتلةplugins
:Kotlin
plugins { id("com.android.application") version "7.2.0" apply false // ... // Make sure that you have the Google services Gradle plugin dependency id("com.google.gms.google-services") version "4.3.15" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "2.9.9" apply false }
Groovy
plugins { id 'com.android.application' version '7.2.0' apply false // ... // Make sure that you have the Google services Gradle plugin dependency id 'com.google.gms.google-services' version '4.3.15' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '2.9.9' 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 مهمة uploadCrashlyticsSymbolFile BUILD_VARIANT
لأتمتة هذه العملية.
حتى تتمكن من الوصول إلى مهمة التحميل الآلي للرموز ، تأكد من ضبط
nativeSymbolUploadEnabled
علىtrue
في ملف Gradle (مستوى التطبيق) الخاص بالوحدة.لكي تظهر أسماء الطرق في تتبعات المكدس ، يجب أن تستدعي بشكل صريح مهمة
uploadCrashlyticsSymbolFile BUILD_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+KTX
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 v31.3.0 +).
قم بتخصيص إعداد تقرير الأعطال عن طريق إضافة تقارير الاشتراك والسجلات والمفاتيح وتتبع الأخطاء غير الفادحة.
تكامل مع Google Play حتى تتمكن من تصفية تقارير أعطال تطبيق Android الخاص بك عن طريق مسار Google Play مباشرة في لوحة معلومات Crashlytics. يتيح لك هذا التركيز بشكل أفضل على لوحة القيادة الخاصة بك على تصميمات محددة.
استكشاف الأخطاء وإصلاحها
إذا كنت ترى آثار مكدس مختلفة في وحدة تحكم Firebase وفي logcat ، فراجع دليل استكشاف الأخطاء وإصلاحها .
خيارات بديلة لتحميل الرموز
إن سير العمل الرئيسي في هذه الصفحة أعلاه قابل للتطبيق على إصدارات Gradle القياسية. ومع ذلك ، تستخدم بعض التطبيقات تكوينًا أو أدوات مختلفة (على سبيل المثال ، عملية إنشاء بخلاف Gradle). في هذه المواقف ، قد تكون الخيارات التالية مفيدة لتحميل الرموز بنجاح.
الخيار : تحميل الرموز لوحدات المكتبة والتبعيات الخارجية
يمكن أن يكون هذا الخيار مفيدًا في المواقف التالية:
- إذا كنت تستخدم عملية إنشاء NDK مخصصة داخل Gradle
- إذا تم إنشاء مكتباتك الأصلية في وحدة مكتبة / ميزة أو تم توفيرها بواسطة جهة خارجية
- إذا فشلت مهمة التحميل التلقائي للرمز أو كنت ترى أعطالًا غير رمزية في لوحة القيادة
تفترض مهمة تحميل رمز Crashlytics القياسية أنك تقوم ببناء مكتباتك الأصلية كجزء من بناء Gradle لوحدة التطبيق الخاصة بك ، باستخدام أدوات إنشاء NDK القياسية مثل CMake.
ومع ذلك ، إذا كنت تستخدم عملية إنشاء NDK مخصصة داخل Gradle ، أو كانت مكتباتك الأصلية مبنية في وحدة مكتبة / ميزة أو تم توفيرها من قبل جهة خارجية ، فقد تحتاج إلى تحديد المسار إلى مكتباتك غير المعزولة بشكل صريح. لإنجاز ذلك ، يمكنك إضافة خاصية unstrippedNativeLibsDir
داخل ملحق Crashlytics في ملف إنشاء Gradle الخاص بك.
تأكد من إكمال المهام الأولية التالية من سير العمل الرئيسي سابقًا في هذه الصفحة:
حتى تتمكن مهمة تحميل الرمز التلقائي من العثور على معلومات الرمز الخاص بك ، أضف ما يلي إلى ملف Gradle (على مستوى التطبيق) للوحدة النمطية الخاصة بك (عادةً
<project>/<app-module>/build.gradle.kts
أو<project>/<app-module>/build.gradle
):Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure
{ nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } } Groovy
// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
سيبحث المكون الإضافي Crashlytics بشكل متكرر في الدليل المحدد عن المكتبات الأصلية بامتداد
.so
. ثم تقوم Crashlytics باستخراج رموز تصحيح الأخطاء من كل هذه المكتبات وتحميلها إلى خوادم Firebase.إليك ما يمكنك تحديده في خاصية
unstrippedNativeLibsDir
:أي وسيطة مسموح بها لـ
org.gradle.api.Project#files(Object...)
، بما في ذلك:java.lang.String
أوjava.io.File
أوorg.gradle.api.file.FileCollection
أدلة متعددة لنكهة بناء واحدة من خلال توفير قائمة أو مثيل
FileCollection
أخيرًا ، فرض تعطلًا تجريبيًا لإنهاء إعداد Crashlytics ولرؤية البيانات الأولية في لوحة معلومات Crashlytics لوحدة تحكم Firebase.
الخيار : تحميل الرموز للبنيات غير Gradle أو المكتبات الأصلية التي لا يمكن الوصول إليها
يمكن أن يكون هذا الخيار مفيدًا في المواقف التالية:
إذا كنت تستخدم عملية إنشاء بخلاف Gradle
إذا تم توفير مكتباتك الأصلية غير المخططة لك بطريقة ما بحيث لا يمكن الوصول إليها أثناء إنشاءات Gradle
يتطلب هذا الخيار تشغيل أمر Firebase CLI عند إنشاء بنية إصدار أو أي بنية تريد رؤية تتبعات مكدس ذات رمز في وحدة تحكم Firebase.
تأكد من إكمال المهام الأولية التالية من سير العمل الرئيسي سابقًا في هذه الصفحة:
لاحظ أنه باستخدام هذا الخيار ، لن تحتاج إلى إضافة ملحق
firebaseCrashlytics
أو إعداد تحميل تلقائي للرموز لأنك ستستخدم بدلاً من ذلك Firebase CLI (الخطوات التالية أدناه) لإنشاء ملفات الرموز الخاصة بك وتحميلها.قم بإعداد بيئتك ومشروعك لتحميل الرموز:
اتبع التعليمات لتثبيت Firebase CLI .
إذا كنت قد قمت بالفعل بتثبيت CLI ، فتأكد من التحديث إلى أحدث إصدار له .
(فقط للتطبيقات التي تستخدم Android API المستوى 30+) قم بتحديث قالب
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:
في ملف
google-services.json
، يكون معرف التطبيق هو قيمةmobilesdk_app_id
؛ أوفي وحدة تحكم Firebase ، انتقل إلى إعدادات المشروع . قم بالتمرير لأسفل إلى بطاقة التطبيقات الخاصة بك ، ثم انقر فوق تطبيق Firebase المطلوب للعثور على معرف التطبيق الخاص به.
PATH/TO/SYMBOLS : المسار إلى ملف الرمز الذي تم إنشاؤه بواسطة CLI
تم تصديره إلى مشروع Android Studio - يمكن أن يكون PATH/TO/SYMBOLS أي دليل. سيبحث Firebase CLI بشكل متكرر في الدليل المحدد عن المكتبات الأصلية بامتداد
.so
.أنشئ ملف APK مباشرةً من داخل Unity - PATH/TO/SYMBOLS هو مسار ملف الرمز المضغوط الذي تم إنشاؤه في الدليل الجذر للمشروع عند انتهاء الإنشاء (على سبيل المثال:
myproject/myapp-1.0-v100.symbols.zip
).
اعرض الخيارات المتقدمة لاستخدام أمر Firebase CLI لإنشاء ملف الرموز وتحميله
علَم وصف --generator=csym
يستخدم منشئ ملفات رموز cSYM القديم بدلاً من منشئ Breakpad الافتراضي
لا يوصى باستخدامه. نوصي باستخدام منشئ ملفات رموز Breakpad الافتراضي.
--generator=breakpad
يستخدم مولد ملفات رموز Breakpad
لاحظ أن الإعداد الافتراضي لإنشاء ملف الرموز هو Breakpad. استخدم هذه العلامة فقط إذا كنت قد أضفت
symbolGenerator { csym() }
في تكوين البناء الخاص بك وتريد تجاوزه لاستخدام Breakpad بدلاً من ذلك.--dry-run
يولد ملفات الرموز ولكن لا يقوم بتحميلها
هذه العلامة مفيدة إذا كنت تريد فحص محتوى الملفات المرسلة.
--debug
يوفر معلومات تصحيح أخطاء إضافية أخيرًا ، فرض تعطلًا تجريبيًا لإنهاء إعداد Crashlytics ولرؤية البيانات الأولية في لوحة معلومات Crashlytics لوحدة تحكم Firebase.
بعد إنشاء تطبيقك كجزء من فرض تعطل ، تأكد من تشغيل
crashlytics:symbols:upload
الأمر لتحميل ملف الرمز الخاص بك.