گزارش کرش اپ شما از طرف افرادی که نصب کردند چگونه است؟
فرض کنید اپلیکیشنی که من توسعه داده ام وقتی در اختیار دیگران قرار میگیرد کرش میکند و بسته میشود. میخواهم که هر موقع اپ کرش کرد گزارش خطا را کاربر بتواند برای من ارسال کند تا من بتوانم مشکل را حل کنم.
چه باید کرد؟
برای گزارش خطا در اپلیکیشن خود میتوانید از کتابخانههایی مانند Crashlytics و Fabric استفاده کنید. این کتابخانهها قابلیت جمعآوری و ارسال گزارش خطاهای اپلیکیشن را به صورت خودکار دارند و برای کاربران نیز امکان ارسال گزارش خطا وجود دارد.
برای استفاده از کتابخانه Crashlytics میتوانید به صورت زیر عمل کنید:
ابتدا به فایل build.gradle(Module: app) خود بروید و در قسمت dependencies کد زیر را اضافه کنید:
implementation 'com.google.firebase:firebase-crashlytics:17.4.1'
سپس به فایل AndroidManifest.xml خود بروید و دسترسی اینترنت را به اپلیکیشن خود اضافه کنید:
<uses-permission android:name="android.permission.INTERNET" />
در اولین Activity اپلیکیشن خود (معمولا MainActivity)، در قسمت onCreate() کد زیر را اضافه کنید:
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
حالا در هرجای اپلیکیشن که مایلید اطلاعات خطا را ارسال کنید، کد زیر را استفاده کنید:
FirebaseCrashlytics.getInstance().log("Error message: " + error.getMessage()); FirebaseCrashlytics.getInstance().recordException(error);
در پایان، برای تست درستی عملکرد کتابخانه Crashlytics میتوانید یک Exception ساده ایجاد کنید:
throw new RuntimeException("This is a crash");
در نهایت، پس از رخ دادن هر گونه خطا، اطلاعات خطا توسط کتابخانه Crashlytics جمعآوری و به صورت خودکار ارسال خواهد شد. شما هم میتوانید از پنل مدیریت Crashlytics در Firebase برای مشاهده و مدیریت گزارشهای خطا استفاده کنید.
حالا فرض کنید اپ من اتصال به اینترنت ندارد و نمیخواهم از این کتابخانه ها استفاده کنم!
در این صورت، بهترین راه برای بررسی خطا، استفاده از روشهای زیر است:
- استفاده از Log: شما میتوانید از کلاس Log اندروید برای نمایش اطلاعات مربوط به خطاها استفاده کنید. شما میتوانید این اطلاعات را در کنسول اندروید یا در فایل Logcat در Android Studio مشاهده کنید.
- استفاده از Crashlytics: این ابزار توسط شرکت Firebase ارائه میشود و به شما اجازه میدهد تا خطاهایی که در برنامه شما رخ میدهد را بررسی کنید. با استفاده از این ابزار، شما میتوانید گزارش خطاها را در پنل Firebase خودتان مشاهده کنید.
- استفاده از ACRA: این کتابخانه نسخه اندرویدی Crashlytics محسوب میشود و به شما اجازه میدهد تا خطاهای برنامه خود را در فضای ابری ذخیره کنید. با استفاده از این کتابخانه، شما میتوانید به راحتی خطاها را بررسی کنید و بهبود برنامه خود را پیش بگیرید.
در هر صورت، استفاده از یکی از این روشها به من کمک خواهد کرد تا مشکلات برنامه ام را شناسایی کنم و برنامهی خودم را ترمیم کنم.
باید توجه داشته باشید که در بسیاری از موارد برای ارسال گزارش خطا، به دلیل نیاز به اتصال به اینترنت، نیاز به استفاده از کتابخانه های شبکه وجود دارد. با این حال، شما میتوانید برای مدیریت خطاها و گزارش دادن به کاربران در حالت آفلاین، از یک دیتابیس محلی استفاده کنید و خطاها را در آن ذخیره کنید. سپس هر زمان که کاربر به اینترنت متصل شد، خطاها را به صورت آنلاین برای شما ارسال کند. البته این روش هم نیاز به برنامه نویسی و نیاز به مدیریت دقیق بین خطاهای ذخیره شده در دیتابیس و خطاهای ارسال شده آنلاین دارد.
اگر بخواهید متن گزارش خطا به همراه مشخصات نرم افزاری و سخت افزاری دستگاه اندرویدی را در جایی روی گوشی ذخیره کنید و بعد موقع اجرای بعدی این متن را کاربر بتواند با اپ های مدیریت ایمیل گوشی خودش برای شما بفرستد، پس لزوما نیازی نیست اپ شما دسترسی به اینترنت داشته باشد. در این صورت، می توانید از یک فایل محلی برای ذخیره گزارش خطا استفاده کنید. هنگامی که اپ شما کرش می کند، می توانید متن گزارش خطا را به همراه اطلاعات دیگری مانند نام پکیج، ورژن نرمافزار، ورژن سیستم عامل و غیره به یک فایل محلی ذخیره کنید. سپس با استفاده از اپ های مدیریت فایل، کاربر می تواند این فایل را پیدا کند و ارسال کند. در ادامه یک نمونه کد برای ذخیره گزارش خطا در یک فایل محلی ارائه شده است:
public class MyApplication extends Application implements Thread.UncaughtExceptionHandler { private static final String FILE_NAME = "crash_log.txt"; @Override public void onCreate() { super.onCreate(); Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable throwable) { try { FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE); PrintWriter pw = new PrintWriter(fos); pw.println("Time: " + new Date()); pw.println("Package name: " + getPackageName()); pw.println("Version: " + BuildConfig.VERSION_NAME); pw.println("Device: " + Build.MANUFACTURER + " " + Build.MODEL); pw.println("Android version: " + Build.VERSION.RELEASE); pw.println(); throwable.printStackTrace(pw); pw.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } }
در این کد، ابتدا یک کلاس MyApplication تعریف شده است که از کلاس Application ارثبری شده است. سپس در متد onCreate، Thread.setDefaultUncaughtExceptionHandler(this) فراخوانی شده است تا زمانی که یک اکسپشن اتفاق بیفتد، متد uncaughtException فراخوانی شود. در متد uncaughtException، متن گزارش خطا به همراه اطلاعات مفید دیگری در یک فایل با نام FILE_NAME ذخیره میشود. در انتها با فراخوانی System.exit(0)، اپ خاتمه مییابد. در این روش نیازی به اتصال به اینترنت نیست و گزارش خطاها به صورت محلی در دسترس هستند.