浏览代码

crashlog handler

Bartek Przybylski 13 年之前
父节点
当前提交
efc9808d9a

+ 2 - 0
AndroidManifest.xml

@@ -32,6 +32,8 @@
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.READ_LOGS" />
 
     <uses-sdk
         android:minSdkVersion="8"

+ 109 - 0
src/eu/alefzero/owncloud/CrashHandler.java

@@ -0,0 +1,109 @@
+package eu.alefzero.owncloud;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.util.LinkedList;
+import java.util.List;
+
+import eu.alefzero.owncloud.authenticator.AccountAuthenticator;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.os.Environment;
+import android.util.Log;
+
+public class CrashHandler implements UncaughtExceptionHandler {
+
+    private Context mContext;
+    private static final String TAG = "CrashHandler";
+    private static final String crash_filename_template = "crash";
+    private static List<String> TAGS;
+    private UncaughtExceptionHandler defaultUEH;
+    
+    static {
+        TAGS = new LinkedList<String>();
+        TAGS.add("AccountAuthenticator");
+        TAGS.add("AccountAuthenticator");
+        TAGS.add("ConnectionCheckerRunnable");
+        TAGS.add("EasySSLSocketFactory");
+        TAGS.add("FileDataStorageManager");
+        TAGS.add("PhotoTakenBroadcastReceiver");
+        TAGS.add("InstantUploadService");
+        TAGS.add("FileDownloader");
+        TAGS.add("FileUploader");
+        TAGS.add("LocationUpdateService");
+        TAGS.add("FileSyncAdapter");
+        TAGS.add("AuthActivity");
+        TAGS.add("OwnCloudPreferences");
+        TAGS.add("FileDetailFragment");
+        TAGS.add("FileListFragment");
+        TAGS.add("ownCloudUploader");
+        TAGS.add("WebdavClient");
+    }
+    
+    public CrashHandler(Context context) {
+        mContext = context;
+        defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
+    }
+    
+    @Override
+    public void uncaughtException(Thread thread, Throwable ex) {
+        final Writer writer = new StringWriter();
+        final PrintWriter printwriter = new PrintWriter(writer);
+        ex.printStackTrace(printwriter);
+        final String startrace = writer.toString();
+        printwriter.close();
+        File ocdir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "owncloud");
+        ocdir.mkdirs();
+
+        String crash_filename = crash_filename_template + System.currentTimeMillis() + ".txt";
+        File crashfile = new File(ocdir, crash_filename);
+        try {
+            ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+            String header = String.format("Model: %s, SDK: %d, Current net: %s\n\n",
+                                          android.os.Build.MODEL,
+                                          android.os.Build.VERSION.SDK_INT,
+                                          cm.getActiveNetworkInfo() != null ? cm.getActiveNetworkInfo().getTypeName() : "NONE");
+            Account account = AccountUtils.getCurrentOwnCloudAccount(mContext);
+            AccountManager am = AccountManager.get(mContext);
+            String header2 = String.format("Account: %s, OCUrl: %s, OCVersion: %s\n\n",
+                                           account.name,
+                                           am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL),
+                                           am.getUserData(account, AccountAuthenticator.KEY_OC_VERSION));
+            
+            crashfile.createNewFile();
+            FileWriter fw = new FileWriter(crashfile);
+            fw.write(header);
+            fw.write(header2);
+            fw.write(startrace);
+            fw.write("\n\n");
+            
+            String logcat = "logcat -d *:S ";
+            
+            for (String s : TAGS)
+                logcat += s + ":V ";
+            
+            Process process = Runtime.getRuntime().exec(logcat);
+            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
+            String logline;
+            while ((logline = br.readLine()) != null)
+                fw.write(logline+"\n");
+            
+            br.close();
+            fw.close();
+
+        } catch (Exception e1) {
+            Log.e(TAG, "Crash handler failed to run logcat, WTF!");
+            defaultUEH.uncaughtException(thread, ex);
+            return;
+        }
+    }
+}

+ 7 - 0
src/eu/alefzero/owncloud/CrashlogSendActivity.java

@@ -0,0 +1,7 @@
+package eu.alefzero.owncloud;
+
+import com.actionbarsherlock.app.SherlockActivity;
+
+public class CrashlogSendActivity extends SherlockActivity {
+
+}

+ 9 - 3
src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java

@@ -18,7 +18,10 @@
 
 package eu.alefzero.owncloud.ui.activity;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.InputStreamReader;
+import java.lang.Thread.UncaughtExceptionHandler;
 import java.net.URLEncoder;
 import java.util.ArrayList;
 
@@ -38,6 +41,7 @@ import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.MediaStore;
+import android.telephony.TelephonyManager;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
@@ -55,6 +59,7 @@ import com.actionbarsherlock.view.MenuItem;
 import com.actionbarsherlock.view.Window;
 
 import eu.alefzero.owncloud.AccountUtils;
+import eu.alefzero.owncloud.CrashHandler;
 import eu.alefzero.owncloud.R;
 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;
 import eu.alefzero.owncloud.datamodel.DataStorageManager;
@@ -96,7 +101,9 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
 
         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
         setProgressBarIndeterminateVisibility(false);
-        
+
+        Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(getApplicationContext()));
+
         if(savedInstanceState != null){
             mCurrentDir = (OCFile) savedInstanceState.getParcelable(KEY_CURRENT_DIR);
         }
@@ -558,6 +565,5 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
             intent.putExtra("authorities", new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });
             startActivity(intent);
         }
-    }
-
+    }    
 }