Tuesday, May 24, 2011

Android: Получение аварийного лога

Все знают, что, даже после хорошего тестирования, программы для Android иногда способны падать в самых неподходящих случаях. Может, виновато глобальное потепление, может, это проделки бессовестных китайцев, но факт остается фактом - приложение, которое вы долго разрабатывали, а потом долго и трепетно тестировали, может на некоторых устройствах работать совершенно непредсказуемо, причем воспроизвести ошибку на своих устройствах не получается.

В таких случаях на помощь рядовому разработчику приходит какой-нибудь дамп падения наподобие аварийного минидампа в Windows. Но в Android такого механизма нет, или по крайней мере мне об этом ничего не известно.

Столкнувшись в свое время с такой проблемой, я просмотрел несколько готовых решений ( это, например ), как обычно все они чем-то не понравились. Поэтому пришлось написать простой собственный велосипед, который и хочу здесь привести.

Класс LogCatWrapperBackgroundTask работает в отдельном потоке ( AsyncTask ), и его задача сводится к запуску logcat ( см. developer.android.com ), который как раз и пишет системный лог в указанный вами файл. Для работы нужно прописать в AndroidManifest.xml разрешение
<uses-permission android:name="android.permission.READ_LOGS" />

public class LogCatWrapperBackgroundTask extends AsyncTask<ArrayList<String>, Void, StringBuilder>{
       @Override
        protected void onPreExecute(){
        }
        @Override
        protected StringBuilder doInBackground(ArrayList<String>... params){
            final StringBuilder log = new StringBuilder();
            try{
                ArrayList<String> commandLine = new ArrayList<String>();
                commandLine.add("logcat");

Read more: Plaincodesource