Hal terpenting yang harus dilakukan dalam pengembangan mobile apps ketika memasuki tahap testing adalah, bagaimana mengelola error reporting dengan baik. Tujuannya adalah agar setiap bug dapat segera dilaporkan dan kemudian dengan cepat diperbaiki. Di platform Android hal ini sangat terasa sekali karena banyaknya vendor device dengan behaviour yang berbeda-beda sehingga dapat terjadi bug yang berbeda pula. Bisa jadi di satu device tidak terjadi, tapi di lain device terjadi error.
Tujuannya adalah agar setiap bug dapat segera dilaporkan dan kemudian dengan cepat diperbaiki.
Error yang relatif mudah di tangani secara teknis adalah error yang masuk ke dalam Exception, bukan logic error atau flow error sehingga kita dapat melihatnya dengan memasang Log.e(). Tapi masalahnya adalahException yang tidak tertangkap oleh blok try catch dan terlebih ketika apk sudah berada ditangan Tester dan terjadi error yang berbeda dengan device yang kita gunakan. Sehingga jalan terbaiknya adalah menampilkan Log.error ke dalam Activity. Nah, itu yang akan kita bahas.
-
Setiap exception yang tidak tertangkap, akan dilarikan ke dalam method UncaughtExceptionHandler. Jika ingin membuat behaviour yg berbeda, maka kita tinggal meng-implements darinya. ``` package com.research.hangga.simplecrashreport;
import android.app.Activity; import android.content.Intent; import android.os.Build; import android.util.Log;
import java.io.PrintWriter; import java.io.StringWriter;
/**
-
Created by hangga on 11/03/16. */ public class MyExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler {
private final Activity context; private final String LINE_SEPARATOR = â\nâ;
public MyExceptionHandler(Activity activity) { this.context = activity; }
@Override public void uncaughtException(Thread thread, Throwable ex) { StringWriter stackTrace = new StringWriter(); ex.printStackTrace(new PrintWriter(stackTrace)); StringBuilder builder = new StringBuilder(); builder.append(â**** CAUSE OF ERROR ****\n\nâ); builder.append(stackTrace.toString()); Log.e(âERRORâ, ââ+stackTrace.toString()); builder.append(â\n**** DEVICE INFORMATION ****\nâ); builder.append(âBrand: â); builder.append(Build.BRAND); builder.append(LINE_SEPARATOR); builder.append(âDevice: â); builder.append(Build.DEVICE); builder.append(LINE_SEPARATOR); builder.append(âModel: â); builder.append(Build.MODEL); builder.append(LINE_SEPARATOR); builder.append(âId: â); builder.append(Build.ID); builder.append(LINE_SEPARATOR); builder.append(âProduct: â); builder.append(Build.PRODUCT); builder.append(LINE_SEPARATOR); builder.append(â\n*** FIRMWARE ******\nâ); builder.append(âSDK: â); builder.append(Build.VERSION.SDK); builder.append(LINE_SEPARATOR); builder.append(âRelease: â); builder.append(Build.VERSION.RELEASE); builder.append(LINE_SEPARATOR); builder.append(âIncremental: â); builder.append(Build.VERSION.INCREMENTAL); builder.append(LINE_SEPARATOR);
Intent intent = new Intent(context, ActivityShowError.class); intent.putExtra("error", builder.toString()); context.startActivity(intent); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(10); } } ```
-
-
Siapkan Activity untuk menampilkan error. ``` package com.research.hangga.simplecrashreport;
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView;
public class ActivityShowError extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity_show_error); TextView txtError = (TextView) findViewById(R.id.txtError); <span style="color: #000080;">String error = getIntent().getStringExtra("error"); int a = error.indexOf("Caused by"); txtError.setText(error.substring(a));</span> } } ```
-
Pasang di setiap Activity, atau akan lebih mudah jika anda memiliki parent class Activity, tinggal pasang disana. ``` private int mNotifCount = 0; private LayerDrawable icon;
private GoogleApiClient client; @Override protected void onCreate(Bundle savedInstanceState) { <span style="color: #000080;"><strong>Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this));</strong></span> super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = null;// = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); setBadgeCount(icon, mNotifCount++); } }); // ATTENTION: This was auto-generated to implement the App Indexing API. // See https://g.co/AppIndexing/AndroidStudio for more information. client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); } ```
Tinggal copy paste, lalu kirim ke developer.