Android 수집 로그 저장 폴더

8403 단어
때때로 우리는 포장된 apk를 원격 고객에게 테스트를 사용해야 한다. 우리는 로그를 휴대전화에 내장된 폴더에 인쇄해서 나중에 자신이 버그를 해결할 때 신속하게 위치를 정할 수 있도록 해야 한다.그러나 우리는 당연히 자신의 프로젝트에 어떤 이유 없는 버그와 치명적인 붕괴가 있기를 원하지 않는다
폴더에 log 수집
  • 때때로 프로그램에 이상 정지가 발생하고logcat에 대한 정보는 곧 삭제되기 때문에 이상 정보를 신속하게 얻지 못한다.(모든 logUtil 패키지는 저장 가능)
  • 이 추천 단일 모드에서 이 종류를 조작
  • /**
     * - Created by Luke on 2017/8/16
     */
    public class LogcatManager {
    
        private static LogcatManager INSTANCE = null;
    
        //logcat     
        private static String PATH_LOGCAT; 
    
        private LogDumper mLogDumper = null;
    
        private int mPId;
    
        private SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyyMMdd");
    
        private SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        public static LogcatManager getInstance() {
            if (INSTANCE == null) {
                INSTANCE = new LogcatManager();
            }
            return INSTANCE;
        }
    
        private LogcatManager() {
            mPId = android.os.Process.myPid();
        }
    
        private void setFolderPath(String folderPath) {
    
            File folder = new File(folderPath);
            if (!folder.exists()) {
                folder.mkdirs();
            }
    
            if (!folder.isDirectory())
                throw new IllegalArgumentException("The logcat folder path is not a directory: " + folderPath);
    
            PATH_LOGCAT = folderPath.endsWith("/") ? folderPath : folderPath + "/";
        }
    
        public void start(String saveDirectoy) {
    
            setFolderPath(saveDirectoy);
    
            if (mLogDumper == null)
                mLogDumper = new LogDumper(String.valueOf(mPId), PATH_LOGCAT);
            mLogDumper.start();
        }
    
        public void stop() {
            if (mLogDumper != null) {
                mLogDumper.stopLogs();
                mLogDumper = null;
            }
        }
    
        private class LogDumper extends Thread {
    
            private Process logcatProc;
            private BufferedReader mReader = null;
            private boolean mRunning = true;
            String cmds = null;
            private String mPID;
            private FileOutputStream out = null;
    
            public LogDumper(String pid, String dir) {
                mPID = pid;
                try {
                    out = new FileOutputStream(new File(dir, "logcat-" +  simpleDateFormat1.format(new Date()) + ".log"), true);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
    
                cmds = "logcat *:e *:i | grep \"(" + mPID + ")\"";
    
            }
    
            public void stopLogs() {
                mRunning = false;
            }
    
            @Override
            public void run() {
                try {
                    logcatProc = Runtime.getRuntime().exec(cmds);
                    mReader = new BufferedReader(new InputStreamReader(logcatProc.getInputStream()), 1024);
                    String line = null;
                    while (mRunning && (line = mReader.readLine()) != null) {
                        if (!mRunning) {
                            break;
                        }
                        if (line.length() == 0) {
                            continue;
                        }
                        if (out != null && line.contains(mPID)) {
                            out.write((simpleDateFormat2.format(new Date()) + "  " + line + "
    ").getBytes()); } } } catch (IOException e) { e.printStackTrace(); } finally { if (logcatProc != null) { logcatProc.destroy(); logcatProc = null; } if (mReader != null) { try { mReader.close(); mReader = null; } catch (IOException e) { e.printStackTrace(); } } if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } out = null; } } } } }

    폴더에 오류 충돌 로그 수집
  • 이것은 일반적으로 프로그램에 오류가 발생할 때만 핸드폰의 폴더에 자동으로 저장된다. 예를 들어 흔히 볼 수 있는 NullPointer Exception,Array Index Out Of Bounds Exception,SQLException...and so on.
  • 이런 종류의 코드량은 좀 많아서 직관적으로 보기에 불리하다. 중요한 논리 부분만 붙인다
  • 또는 이 종류를 조작하는 단일 모드를 추천합니다
  •     /**
         *         
         */
       public void collectDeviceInfo(Context context) {
            try {
                PackageManager pm = context.getPackageManager();
                PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
                if (pi != null) {
                    String versionName = pi.versionName == null ? "null" : pi.versionName;
                    String versionCode = pi.versionCode + "";
                    infos.put("versionName", versionName);
                    infos.put("versionCode", versionCode);
                }
            } catch (PackageManager.NameNotFoundException e) {
                Logger.getLogger(TAG, "        ");
            }
            Field[] fields = Build.class.getDeclaredFields();
            for (Field field : fields) {
                try {
                    field.setAccessible(true);
                    infos.put(field.getName(), field.get(null).toString());
                } catch (Exception e) {
                    Logger.getLogger(TAG, "        ");
                }
            }
        }
    
    
    -----------------------------------------          ---------------------------------------------------------------
        /**
         * @return       ,            
         */
        private String saveCrashInfo2File(Throwable ex) {
    
            StringBuffer sb = new StringBuffer();
            for (Map.Entry entry : infos.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                sb.append(key).append("=").append(value).append("
    "); } Writer writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); ex.printStackTrace(printWriter); Throwable cause = ex.getCause(); while (cause != null) { cause.printStackTrace(printWriter); cause = cause.getCause(); } printWriter.close(); String result = writer.toString(); sb.append(result); try { long timestamp = System.currentTimeMillis(); String time = formatter.format(new Date()); String fileName = "crash-" + time + "-" + timestamp + ".log"; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String path = "/sdcard/crash_police/"; File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } FileOutputStream fos = new FileOutputStream(path + fileName); sb.append("\r
    :"); sb.append(new Date(System.currentTimeMillis()).toLocaleString()).append("\r
    "); printStackTrace(sb, ex); fos.write(sb.toString().getBytes()); fos.close(); } return fileName; } catch (Exception e) { Logger.getLogger(TAG, " ..."); } return null; }
  • 사용 방법:
  • 자신의 Application에서 로그와 Crash를 열어 수집하는 것을 권장합니다. 2.onCreate에서 log start Logcat () 와 CrashHandler를 수집합니다.를 초기화하면 됩니다. 3.onTerminate () 는 프로그램이 종료될 때logcat의 수집이 닫히고stopLogcat () 를 직접 호출합니다.O입니다 4.다음은 시작 및 종료 방법
  •    private void startLogcat() {
    
            String folderPath = null;
    
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    
                folderPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Police-Logcat";
    
            } else {
    
                folderPath = this.getFilesDir().getAbsolutePath() + File.separator + "Police-Logcat";
            }
    
            LogcatManager.getInstance().start(folderPath);
    
        }
    
        private void stopLogcat() {
    
            LogcatManager.getInstance().stop();
    
        }
    
    
  • 대공 완성, 테스트 결과 나무에 문제가 있음
  • 좋은 웹페이지 즐겨찾기