无法拦截所有设备上的ANR

时间:2017-12-04 10:59:09

标签: android android-anr-dialog

我试图拦截Android设备中的ANR( Application Not Responding )。我正在 /data/anr/traces.txt 文件上实施FileObserver并捕获日志。

我可以在 Samsung Galaxy J7(Android 6.0.1)中读取此文件,但不能在其他设备上阅读: Nexus 4 (Android 5)和 Moto G5 plus (Android 7)。

我希望FileObserver在所有设备上读取traces.txt。任何帮助将不胜感激。

以下是我的代码:

public class MainActivity extends AppCompatActivity {

private FileObserver fileObs;
private File anrFile = new File("/data/anr/traces.txt");
private File newFile;
int count=0;
long epochTimeCurrent=0;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(Build.VERSION.SDK_INT >= 23){
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.INTERNET,
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE},
                100);
    }

    fileObs = new FileObserver("/data/anr") {
        @Override
        public void onEvent(int i, @Nullable String s) {
            if(i == FileObserver.CLOSE_WRITE) {
                if (anrFile.exists()) {
                    System.out.println("ANR file available");
                    //boolean read = anrFile.canRead();
                    if (count == 0) {
                        //Log.i("ANRTest", "Traces.text is available ? "+read);
                        epochTimeCurrent = System.currentTimeMillis();
                        Log.e("ANRTest", "System time in epoch : "+epochTimeCurrent);
                        readContent(anrFile);
                    } else if(count > 0) {
                        //Log.i("ANRTest", "Count increased : "+count);
                    }
                }
                else {
                    System.out.println("ANR file not available");
                }
            }
        }
    };
    fileObs.startWatching();


    //code to simulate ANR
    final RelativeLayout cont = findViewById(R.id.container);
    Button btn = findViewById(R.id.btn_anr);
    final TextView textView = new TextView(this);
    textView.setText("ANR");
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            System.out.println("Devtest : Inside onclick");
            while (true) {
                cont.addView(textView);
                cont.removeView(textView);
            }
            //throw new ArrayIndexOutOfBoundsException();
            //throw new RuntimeException("This is a crash");
        }
    });
}

public void readContent(File file) {
    BufferedReader br = null;
    FileReader fileReader;
    String strLine = "";
    try {
        fileReader = new FileReader(file);
        int pid = android.os.Process.myPid();
        br = new BufferedReader(fileReader);
        while( (strLine = br.readLine()) != null){
            semusi.logger.Log.info(strLine);
            //semusi.logger.Log.info("Hello there !");
            //System.out.println(strLine);
            if(strLine.contains("pid "+pid) && count==0) {
                System.out.println("File content is : "+strLine);
                long logTime = calcSubstring(strLine);
                //semusi.logger.Log.info(strLine);
                System.out.println("Log print time : "+logTime);
                //1512364990000 and 1512364990670
                if(logTime > epochTimeCurrent) {
                    //semusi.logger.Log.info(strLine);
                    if(strLine.contains("-- end")) {

                    }
                }
                count++;
            }
        }
        fileReader.close();
        br.close();
    } catch (FileNotFoundException e) {
        System.err.println("Unable to find the file: fileName");
    } catch (IOException e) {
        System.err.println("Unable to read the file: fileName");
    }
}

public long calcSubstring(String rawStr) {
    if(rawStr.contains("at")){
        int index = rawStr.indexOf("2017");
        //System.out.println("Index of 2017 is : "+index);
        String dateSubs = rawStr.substring(index,index+19);
        //System.out.println("Time substring : "+dateSubs);
        //2017-12-04 10:42:28
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date gmt = null;
        try {
            gmt = formatter.parse(dateSubs);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        long millisecondsSinceEpoch0 = gmt.getTime();
        String asString = formatter.format(gmt);
        System.out.println("Date after formatting : "+asString);
        return millisecondsSinceEpoch0;
    }
    return 0;
}
}

0 个答案:

没有答案