اگر برنامه اندروید شما حاوی کتابخانههای بومی است، میتوانید با چند بهروزرسانی کوچک در پیکربندی ساخت برنامه، ردیابی کامل پشته و گزارشهای خرابی دقیق را برای کد بومی خود از Firebase Crashlytics فعال کنید.
این راهنما نحوه پیکربندی گزارش خرابی با Firebase Crashlytics SDK برای NDK را شرح میدهد.
اگر به دنبال نحوه شروع کار با Crashlytics در پروژههای یونیتی خود هستید، راهنمای شروع به کار با یونیتی را بررسی کنید.
قبل از اینکه شروع کنی
اگر هنوز Firebase را به پروژه اندروید خود اضافه نکردهاید، آن را اضافه کنید. اگر برنامه اندروید ندارید، میتوانید یک برنامه نمونه را دانلود کنید.
توصیه میشود : برای اینکه گزارشهای breadcrumb به طور خودکار اقدامات کاربر را که منجر به خرابی، عدم موفقیت یا رویداد ANR میشود، درک کنند، باید Google Analytics در پروژه Firebase خود فعال کنید.
اگر پروژه Firebase فعلی شما Google Analytics فعال نکرده است، میتوانید Google Analytics از تب Integrations فعال کنید.
> تنظیمات پروژه در کنسول Firebase . اگر در حال ایجاد یک پروژه جدید Firebase هستید، در طول فرآیند ایجاد پروژه، Google Analytics فعال کنید.
مطمئن شوید که برنامه شما حداقل نسخههای مورد نیاز زیر را دارد:
- گریدل ۸.۰
- افزونه اندروید گریدل ۸.۱.۰
- افزونه Gradle سرویسهای گوگل نسخه ۴.۴.۱
مرحله 1 : Crashlytics SDK for NDK را به برنامه خود اضافه کنید
در فایل Gradle ماژول (سطح برنامه) خود (معمولاً<project>/<app-module>/build.gradle.kts یا <project>/<app-module>/build.gradle )، وابستگی مربوط به کتابخانه Crashlytics NDK برای اندروید را اضافه کنید. توصیه میکنیم برای کنترل نسخهبندی کتابخانه Firebase Android BoM استفاده کنید.برای یک تجربه بهینه با Crashlytics ، توصیه میکنیم Google Analytics در پروژه Firebase خود فعال کنید و Firebase SDK را برای Google Analytics به برنامه خود اضافه کنید.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.4.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 استفاده خواهد کرد.
(جایگزین) اضافه کردن وابستگیهای کتابخانه 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.3") 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.4" 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.4' 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' }
مرحله ۳ : افزونه 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 } } } }
مرحله ۴ : تنظیم آپلود خودکار نمادهای بومی
برای تولید ردپاهای پشتهای خوانا از خرابیهای NDK، Crashlytics باید از نمادهای موجود در فایلهای باینری بومی شما مطلع باشد. افزونه Crashlytics Gradle شامل وظیفه uploadCrashlyticsSymbolFile BUILD_VARIANT برای خودکارسازی این فرآیند است.
برای اینکه بتوانید به وظیفه آپلود خودکار نمادها دسترسی داشته باشید، مطمئن شوید که
nativeSymbolUploadEnabledدر فایل Gradle ماژول (سطح برنامه) شما رویtrueتنظیم شده است.برای اینکه نام متدها در ردپاهای پشته شما ظاهر شوند، باید پس از هر بار ساخت کتابخانه NDK خود، صریحاً وظیفه
uploadCrashlyticsSymbolFile BUILD_VARIANTفراخوانی کنید. برای مثال:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
هم Crashlytics SDK برای NDK و هم افزونه Crashlytics Gradle به وجود شناسه ساخت GNU در اشیاء مشترک بومی بستگی دارند.
شما میتوانید با اجرای دستور زیر، وجود این شناسه را تأیید کنید.
readelf -nروی هر باینری قرار دهید. اگر شناسه ساخت وجود ندارد، اضافه کنیدبرای رفع مشکل -Wl,--build-idبه پرچمهای سیستم ساخت خود اضافه کنید.
مرحله ۵ : برای اتمام راهاندازی، یک کرش آزمایشی را اعمال کنید
برای تکمیل راهاندازی Crashlytics و مشاهده دادههای اولیه در داشبورد Crashlytics کنسول Firebase ، باید یک crash آزمایشی را اجباری کنید.
کدی را به برنامه خود اضافه کنید که بتوانید از آن برای ایجاد خطای تست استفاده کنید.
شما میتوانید با استفاده از کد زیر در
MainActivityبرنامه خود، دکمهای به برنامه خود اضافه کنید که با فشردن آن، برنامه از کار بیفتد (Crash). این دکمه با عنوان "Test Crash" نامگذاری شده است.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 ادغام شوید تا بتوانید گزارشهای خرابی برنامه اندروید خود را بر اساس مسیر Google Play مستقیماً در داشبورد Crashlytics فیلتر کنید. این به شما امکان میدهد داشبورد خود را بهتر روی نسخههای خاص متمرکز کنید.
عیبیابی
اگر ردپاهای پشتهای متفاوتی را در کنسول Firebase و logcat مشاهده میکنید، به راهنمای عیبیابی مراجعه کنید.
گزینههای جایگزین برای آپلود نمادها
گردش کار اصلی در این صفحه بالا برای بیلدهای استاندارد Gradle قابل استفاده است. با این حال، برخی از برنامهها از پیکربندی یا ابزار متفاوتی استفاده میکنند (برای مثال، فرآیند ساختی غیر از Gradle). در این شرایط، گزینههای زیر ممکن است برای آپلود موفقیتآمیز نمادها مفید باشند.
گزینه : بارگذاری نمادها برای ماژولهای کتابخانه و وابستگیهای خارجی
این گزینه میتواند در شرایط زیر مفید باشد:
- اگر از یک فرآیند ساخت NDK سفارشی در Gradle استفاده میکنید
- اگر کتابخانههای بومی شما در یک ماژول کتابخانه/ویژگی ساخته شدهاند یا توسط شخص ثالث ارائه شدهاند
- اگر آپلود خودکار نمادها با مشکل مواجه میشود یا در داشبورد با خطاهای بدون نماد مواجه میشوید
وظیفه استاندارد آپلود نماد Crashlytics فرض میکند که شما در حال ساخت کتابخانههای بومی خود به عنوان بخشی از ساخت Gradle ماژول برنامه خود، با استفاده از ابزارهای ساخت استاندارد NDK مانند CMake هستید.
با این حال، اگر از یک فرآیند ساخت NDK سفارشی در Gradle استفاده میکنید، یا کتابخانههای بومی شما در یک ماژول کتابخانه/ویژگی ساخته شدهاند یا توسط یک شخص ثالث ارائه شدهاند، ممکن است لازم باشد مسیر کتابخانههای unstripped شده خود را به صراحت مشخص کنید. برای انجام این کار، میتوانید ویژگی 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<CrashlyticsExtension> { 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 Gradle نسخه ۳.۰.۰) چندین دایرکتوری را در محصولات جداگانه جمعآوری کنید و flavorها را بسازید.
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 CLI اجرا کنید.
مطمئن شوید که وظایف اولیه زیر را از گردش کار اصلی که قبلاً در این صفحه آمده است، انجام دادهاید:
Crashlytics SDK برای NDK و افزونه Crashlytics Gradle اضافه شد.
توجه داشته باشید که با این گزینه، نیازی به اضافه کردن افزونه
firebaseCrashlyticsیا تنظیم آپلود خودکار نمادها ندارید، زیرا در عوض از Firebase CLI (مراحل بعدی در زیر) برای تولید و آپلود فایلهای نماد خود استفاده خواهید کرد.محیط و پروژه خود را برای آپلود نماد تنظیم کنید:
برای نصب Firebase CLI دستورالعملها را دنبال کنید.
اگر قبلاً CLI را نصب کردهاید، حتماً آن را به آخرین نسخه بهروزرسانی کنید .
(فقط برای برنامههایی که از API اندروید سطح ۳۰+ استفاده میکنند) قالب
AndroidManifest.xmlبرنامه خود را بهروزرسانی کنید تا برچسبگذاری اشارهگر غیرفعال شود:کادر تنظیمات پخشکننده اندروید > تنظیمات انتشار > ساخت > مانیفست اصلی سفارشی را علامت بزنید.
قالب مانیفست واقع در
Assets/Plugins/Android/AndroidManifest.xmlرا باز کنید.ویژگی زیر را به تگ application اضافه کنید:
<application android:allowNativeHeapPointerTagging="false" ... />
پروژه خود را بسازید.
اطلاعات نمادهای خود را بارگذاری کنید.
پس از اتمام ساخت، یک فایل نماد سازگار با Crashlytics ایجاد کنید و با اجرای دستور Firebase CLI زیر، آن را در سرورهای Firebase آپلود کنید:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : شناسه برنامه اندروید Firebase شما (نه نام بسته شما)
مثالی از شناسه برنامه اندروید فایربیس:1:567383003300:android:17104a2ced0c9b9bدر اینجا دو روش برای یافتن شناسه برنامه Firebase شما وجود دارد:
در فایل
google-services.jsonشما، شناسه برنامه شما مقدارmobilesdk_app_idاست؛ یادر کنسول Firebase ، به تنظیمات پروژه خود بروید. به پایین اسکرول کنید تا به کارت «برنامههای شما» برسید، سپس روی برنامه فایربیس مورد نظر کلیک کنید تا شناسه برنامه آن را پیدا کنید.
PATH/TO/SYMBOLS : مسیر فایل نماد تولید شده توسط رابط خط فرمان (CLI)
به یک پروژه اندروید استودیو صادر میشود - PATH/TO/SYMBOLS میتواند هر دایرکتوری باشد. رابط خط Firebase به صورت بازگشتی دایرکتوری مشخص شده را برای کتابخانههای بومی با پسوند
.soجستجو میکند.APK را مستقیماً از داخل Unity ساختید - PATH/TO/SYMBOLS مسیر فایل نماد فشرده شدهای است که پس از اتمام ساخت، در دایرکتوری ریشه پروژه ایجاد شده است (برای مثال:
myproject/myapp-1.0-v100.symbols.zip).
گزینههای پیشرفته برای استفاده از دستور Firebase CLI برای تولید و آپلود فایل نماد را مشاهده کنید
پرچم توضیحات --generator=csymبه جای مولد پیشفرض Breakpad، از مولد فایل نماد قدیمی cSYM استفاده میکند.
برای استفاده توصیه نمیشود. توصیه میکنیم از مولد فایل نماد پیشفرض Breakpad استفاده کنید.
--generator=breakpadاز مولد فایل نماد Breakpad استفاده میکند
توجه داشته باشید که پیشفرض برای تولید فایل نماد، Breakpad است. فقط در صورتی از این پرچم استفاده کنید که ... را اضافه کرده باشید.
symbolGenerator { csym() }در پیکربندی ساخت خود دارید و میخواهید آن را لغو کنید تا به جای آن از Breakpad استفاده کنید.--dry-runفایلهای نماد را تولید میکند اما آنها را آپلود نمیکند
این پرچم در صورتی مفید است که بخواهید محتوای فایلهای ارسالی را بررسی کنید.
--debugاطلاعات اشکالزدایی اضافی ارائه میدهد در نهایت، برای اتمام راهاندازی Crashlytics و مشاهده دادههای اولیه در داشبورد Crashlytics کنسول Firebase ، یک کرش آزمایشی را اعمال کنید .
بعد از اینکه برنامه خود را به عنوان بخشی از فرآیند جلوگیری از خرابی ساختید، حتماً دستور
crashlytics:symbols:uploadFirebase CLI را اجرا کنید تا فایل نماد خود را آپلود کنید.