ادغام خارج از جعبه Sentry با Jetpack Compose به شما امکان می دهد تا به سرعت خطاها و مشکلات عملکرد را در برنامه های Android خود شناسایی و حل کنید. در اینجا نحوه شروع به کار آمده است.
Jetpack Compose ابزار پیشنهادی Android برای ساخت رابطهای کاربری بومی است که نشاندهنده تغییر آشکار پلتفرم از رابطهای کاربری ضروری به اعلانی است. گوگل فشار زیادی را برای پذیرش پذیرش انجام می دهد و نتیجه می دهد. همانطور که در Android Dev Summit ’22 اکتبر گذشته اعلام شد ، ۱۶۰ برنامه از ۱۰۰۰ برنامه برتر در فروشگاه Google Play، Jetpack Compose را ارسال می کنند، از جمله شرکت هایی مانند Airbnb، Lyft، و Square.
Jetpack Compose مزایای بسیاری را ارائه میکند—بصریتر است، به کد کمتری نیاز دارد و توسعه را تسریع میکند. اما بدون چالش نیست. انتقال از یک جعبه ابزار ضروری به Jetpack Compose با یک منحنی یادگیری همراه است که با اسناد محدود، جامعه کوچکتر و مشکلات عملکرد تشدید می شود.
Sentry اخیراً پشتیبانی خود از Jetpack Compose را با یکپارچگی خارج از جعبه که اجازه می دهد تا توسعه دهندگان برای شناسایی و حل سریع مشکلات در برنامه خود. دقیقاً در اینجا آمده است که چگونه Sentry به تیمها کمک میکند برای شروع کار با Jetpack Compose< /a>.
با Android Studio شروع کنید
اگر در حال ساختن یک برنامه جدید از ابتدا با Jetpack Compose هستید، ابتدا Android Studio را دانلود و نصب کنید، یک محیط توسعه یکپارچه (IDE) که برای برنامه های اندروید بهینه شده است. سپس، یک پروژه جدید ایجاد کنید و یا Empty Compose Activity را انتخاب کنید که از Material v2 استفاده می کند، یا Empty Compose Activity (Material3) که از Material v3 استفاده می کند. می توانید هر دو گزینه را در سمت راست بالای این اسکرین شات ببینید:
اگر میخواهید Jetpack Compose را در یک برنامه Android موجود ادغام کنید، پیکربندیهای ساخت زیر را در فایل build.gradle برنامه خود اضافه کنید.
android { buildFeatures { // this flag enables Jetpack Compose compose true } composeOptions { // the compiler version should match // your project's Kotlin version kotlinCompilerExtensionVersion = "1.3.2" } }
سپس، Compose BOM (Bill of Materials) و زیر مجموعه را اضافه کنید از وابستگی ها را به وابستگی های خود بنویسید.
dependencies { def composeBom = platform('androidx.compose:compose-bom:2023.01.00') implementation composeBom androidTestImplementation composeBom // Choose one of the following: // Material Design 3 implementation 'androidx.compose.material3:material3' // or Material Design 2 implementation 'androidx.compose.material:material' // or skip Material Design and build directly on top of foundational components implementation 'androidx.compose.foundation:foundation' // or only import the main APIs for the underlying toolkit systems, // such as input and measurement/layout implementation 'androidx.compose.ui:ui' // Android Studio Preview support implementation 'androidx.compose.ui:ui-tooling-preview' debugImplementation 'androidx.compose.ui:ui-tooling' // UI Tests androidTestImplementation 'androidx.compose.ui:ui-test-junit4' debugImplementation 'androidx.compose.ui:ui-test-manifest' // Optional - Included automatically by material, only add when you need // the icons but not the material library (e.g. when using Material3 or a // custom design system based on Foundation) implementation 'androidx.compose.material:material-icons-core' // Optional - Add full set of material icons implementation 'androidx.compose.material:material-icons-extended' // Optional - Add window size utils implementation 'androidx.compose.material3:material3-window-size-class' // Optional - Integration with activities implementation 'androidx.activity:activity-compose:1.5.1' // Optional - Integration with ViewModels implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1' // Optional - Integration with LiveData implementation 'androidx.compose.runtime:runtime-livedata' // Optional - Integration with RxJava implementation 'androidx.compose.runtime:runtime-rxjava2' }
Sentry را یکپارچه کنید
برای ادغام Sentry در برنامه جدید Jetpack Compose، تنها کاری که باید انجام دهید این است که افزونه Sentry’s Gradle را در فایل build.gradle ماژول خود اضافه کنید و سپس یک همگام سازی Gradle را انجام دهید.
buildscript { repositories { mavenCentral() } } plugins { id "com.android.application" id "io.sentry.android.gradle" version "3.4.2" }
و سپس مقادیر لازم را در فایل AndroidManifest.xml اضافه کنید.
<application> <!-- Required: set your sentry.io project identifier (DSN) --> <meta-data android:name="io.sentry.dsn" android:value="https://examplePublicKey@o0.ingest.sentry.io/0" /> <!-- enable automatic breadcrumbs for user interactions (clicks, swipes, scrolls) --> <meta-data android:name="io.sentry.traces.user-interaction.enable" android:value="true" /> <!-- enable screenshot for crashes --> <meta-data android:name="io.sentry.attach-screenshot" android:value="true" /> <!-- enable view hierarchy for crashes --> <meta-data android:name="io.sentry.attach-view-hierarchy" android:value="true" /> <!-- enable the performance API by setting a sample-rate, adjust in production env --> <meta-data android:name="io.sentry.traces.sample-rate" android:value="1.0" /> <!-- enable profiling when starting transactions, adjust in production env --> <meta-data android:name="io.sentry.traces.profiling.sample-rate" android:value="1.0" /> </application>
این دو مرحله Sentry را در پروژه خود نصب و پیکربندی کنید. جدای از گزارش خطا، پروژه شما اکنون دارای نظارت خودکار بر عملکرد نیز می باشد. Sentry SDK به طور خودکار نمایههای عملکرد را جمعآوری و تجزیه و تحلیل میکند تا بتوانید عملکرد برنامهتان را در موارد مختلف مشاهده کنید. دستگاه های کاربر در حال تولید.
خطاهای ضبط
بهطور پیشفرض، Sentry همه خطاها و خرابیها را بهطور خودکار برای شما ثبت میکند. اگر میخواهید خطاها و استثناها را به صورت دستی ثبت کنید، میتوانید از روش captureException
استفاده کنید.
import io.sentry.Sentry try { aMethodThatMightFail() } catch (e: Exception) { Sentry.captureException(e) }
افزودن زمینه
شما این گزینه را دارید که زمینه اضافی را به همه خطاهایی که در برنامه شما رخ می دهد اضافه کنید. این دادههای دلخواه است که بهطور خودکار به رویداد متصل میشود و در صفحه جزئیات مشکل قابل مشاهده است. برای انجام این کار، میتوانیم زمینههای سفارشی را در محدوده فعلی به این صورت پیوست کنیم:
import io.sentry.Sentry Sentry.configureScope { scope -> scope.setContexts("Hero Details", mapOf( "Name" to "Mighty Fighter", "Age" to 19, "Attack type" to "Melee", )) }
این دادهها اکنون به هر شماره اضافه میشوند. میتوانیم آن را در صفحه جزئیات مشکل بررسی کنیم:
مهم: دو محدودیت وجود دارد که باید از آنها آگاه باشید. یعنی:
- این داده قابل جستجو نیست. فقط برای الصاق مقادیر به رویدادها استفاده می شود. اگر باید بتوانید روی داده های سفارشی جستجو کنید، به جای آن از برچسب ها استفاده کنید.
- محدودیتهای اندازه در مورد اینکه چه مقدار داده میتوانید به محدوده اضافه کنید وجود دارد. Sentry ارسال کل وضعیت برنامه و حباب های داده بزرگ را در زمینه ها توصیه نمی کند. در صورت ضمیمه داده های بیش از حد، Sentry با خطای HTTP “413 Payload Too Large” پاسخ می دهد و رویداد را رد می کند.
افزودن برچسب
درست مانند زمینه اضافی، ما همچنین میتوانیم برچسبهای سفارشی را روی رویدادهای شما اضافه کنیم، که در مقابل ایندکس شده و قابل جستجو هستند. می توانید از برچسب ها برای دسترسی سریع به رویدادهای مرتبط و مشاهده توزیع برچسب برای مجموعه ای از رویدادها استفاده کنید. کاربردهای متداول برچسبها شامل نام میزبان، نسخه پلتفرم و زبان کاربر است.
افزودن برچسب ها بسیار شبیه به افزودن زمینه های اضافی است. آنها جفت های کلید-مقدار هستند و می توانند با استفاده از روش setTag
به محدوده فعلی اضافه شوند.
import io.sentry.Sentry Sentry.configureScope { scope -> scope.setTag(“user-type”, “premium”) }
همانطور که گفته شد، برچسبها نمایهسازی و جستجو میشوند، بنابراین اگر در قسمت جستجوی سفارشی در صفحه مشکلات، “user-type:premium” را اضافه کنید، همه مشکلاتی را خواهید دید که دارای آن برچسب هستند:
سه نکته که هنگام کار با برچسب ها باید از آنها آگاه بود:
- Sentry به طور خودکار برخی از برچسب ها را به هر شماره اضافه می کند. بازنویسی آن برچسب ها ایده خوبی نیست. در عوض، برچسبهای خود را با استفاده از نامگذاری سازمانتان نامگذاری کنید.
- کلیدها حداکثر ۳۲ کاراکتر طول دارند و میتوانند فقط شامل حروف، اعداد، زیرخط، نقطه، دو نقطه و خط تیره باشند.
- مقادیر حداکثر ۲۰۰ کاراکتر طول دارند و نمیتوانند حاوی نویسه خط جدید (
\n
) باشند.
افزودن پیوست
افزودن پیوستها راه دیگری برای تکمیل رویدادها با دادههای اضافی است، و اگر نیاز به اضافه کردن دادههای بزرگتر از زمینهها و برچسبها دارید، این روش توصیهشده است. پیوست ها می توانند هر نوع فایلی باشند.
برای افزودن یک پیوست، میتوانید آن را به دامنه اضافه کنید، آن را به یکی از روشهای capture
منتقل کنید، یا فهرست پیوستها را در EventProcessor
دستکاری کنید یا قبل از ارسال
.
برخی قوانینی که باید هنگام کار با پیوست ها از آنها آگاه باشید:
- پیوست ها به مدت ۳۰ روز نگهداری می شوند. اگر از کل سهمیه فضای ذخیرهسازی شما بیشتر شود، پیوستها ذخیره نمیشوند.
- میتوانید پیوستها را در هر زمانی حذف کنید، اما این روی سهمیه شما تأثیری نخواهد داشت. Sentry یک پیوست را به محض ذخیره شدن در سهمیه شما حساب می کند.
- می توانید دسترسی به پیوست ها را بر اساس نقش کاربر مدیریت کنید. به تنظیمات عمومی سازمان خود بروید، سپس منوی کشویی Attachment Access را برای تنظیم دسترسی مناسب انتخاب کنید. بهطور پیشفرض، وقتی فضای ذخیرهسازی فعال است، دسترسی به همه اعضا اعطا میشود.
- حداکثر اندازه برای هر پیوست در
options.maxAttachmentSize
در روشinit
تنظیم شده است. مقیاس بر حسب بایت و پیش فرض ۲۰ مگابایت است. می توانید اندازه را به این صورت تغییر دهید:Sentry.init { options -> options.maxAttachmentSize = 5 * 1024 * 1024 // 5 مگابایت }
Sentry.init { options -> options.maxAttachmentSize = 5 * 1024 * 1024 // 5 MiB }
ارسال پیوستها به روشهای عکسبرداری
این احتمالاً سادهترین راه برای افزودن پیوستها است. هر زمان که از یکی از روشهای capture
استفاده میکنید، میتوانید با استفاده از روش Hint.withAttachment
، پیوست را به عنوان آرگومان دوم اضافه کنید.
import io.sentry.Attachment import io.sentry.Hint import io.sentry.Sentry … try { … } catch (e: Exception) { Sentry.captureException(e, Hint.withAttachment(“/path/to/file.txt”)) }
افزودن پیوستها در قبل از ارسال
یک راه دیگر برای افزودن پیوست استفاده از پاسخ تماس قبل از ارسال
است.
import io.sentry.Sentry import io.sentry.SentryOptions.BeforeSendCallback import io.sentry.Hint import io.sentry.Attachment Sentry.init(this) { options -> options.beforeSend = BeforeSendCallback { event, hint -> hint.addAttachment(Attachment(“/path/to/file.txt”)) } }
این پیکربندی فایل file.txt را قبل از ارسال به ابر به هر مشکلی اضافه میکند.
مشاهده پیوستها
میتوانید پیوستهای مربوط به یک مشکل را در پایین صفحه جزئیات مشکل مشاهده کنید. یک بخش پیوستها وجود دارد که همه پیوستها را فهرست میکند و شما میتوانید آنها را حذف، دانلود یا پیشنمایش کنید.
همچنین میتوانید از طریق برگه پیوستها در همان صفحه به پیوستها دسترسی داشته باشید، جایی که میتوانید نوع پیوست و همچنین رویدادهای مرتبط را مشاهده کنید. میتوانید روی شناسه رویداد کلیک کنید تا جزئیات مربوط به آن رویداد خاص باز شود.
اندازه گیری عملکرد
اگر مقدار Sample Rate (io.sentry.traces.sample-rate
) را در فایل AndroidManifest.xml خود ارائه کردهاید، Sentry را قبلاً پیکربندی کردهاید تا به طور خودکار برنامه خود را ابزار کند. Sentry به طور خودکار تراکنشها را برای رویدادهای چرخه حیات فعالیتها و قطعات، شروع سرد و گرم برنامه، فریمهای آهسته و ثابت و رویدادهای دیگر ضبط میکند.
همچنین این امکان وجود دارد که به صورت دستی یک تابع خاص را تنظیم کنید، به عنوان مثال تابعی که مدتی را صرف تغییر شکل بخشی بزرگ از داده ها می کند، یا تابعی که داده ها را از یک API دریافت می کند و در حافظه محلی قرار می دهد، و غیره. ابزار دقیق سفارشی ایجاد کنید، باید با فراخوانی روش startTransaction
یک تراکنش را شروع کنید.
import io.sentry.Sentry import io.sentry.SpanStatus val transaction = Sentry.startTransaction(“processOrderBatch()”, “task”) try { processOrderBatch() } catch (e: Exception) { transaction.throwable = e transaction.status = SpanStatus.INTERNAL_ERROR throw e } finally { transaction.finish() }
هشدار: فراموش نکنید که روش finish()
را در تراکنش فراخوانی کنید، در غیر این صورت تراکنش به Sentry ارسال نخواهد شد.
اگر تابعی که میخواهید ابزارسازی کنید پیچیدهتر است و شامل چندین تابع فرعی است که ترجیح میدهید به صورت جداگانه ابزار کنید، میتوانید برای هر یک از آنها Spans ایجاد کنید و آنها را به تراکنش اصلی متصل کنید.
>
import io.sentry.SpanStatus val transaction = Sentry.startTransaction("processOrderBatch()", "task") try { processOrderBatch(transaction) } catch (e: Exception) { transaction.throwable = e transaction.status = SpanStatus.INTERNAL_ERROR throw e } finally { transaction.finish() } fun processOrderBatch(span: ISpan) { // span operation: task, span description: operation val innerSpan = it.startChild("task", "operation") try { // omitted code } catch (e: FileNotFoundException) { innerSpan.throwable = e innerSpan.status = SpanStatus.NOT_FOUND throw e } finally { innerSpan.finish() } }
فراموش نکنید که قبل از فراخوانی روش finish()
تراکنش اصلی، متد finish()
را در هر یک از دهانه ها فراخوانی کنید! اگر این کار را نکنید، آنها به تراکنش اصلی متصل نخواهند شد.
پست های مرتبط
با Sentry برنامه های Jetpack Compose بهتر بسازید
با Sentry برنامه های Jetpack Compose بهتر بسازید
با Sentry برنامه های Jetpack Compose بهتر بسازید