androidandroid-strictmode

Filter Android StrictMode violations by duration


Is there a way to filter StrictMode violations based on duration?

It's getting a bit annoying having these

StrictMode policy violation; ~duration=6 ms: android.os.StrictMode$StrictModeDiskWriteViolation: policy=31 violation=1

poisoning my logcat.

I think StrictMode is a useful feature, but I'd like to deal only with violations with a duration greater than, let's say, 50 ms, in the first development phase.


Solution

  • The StrictMode API does not support filtering by duration.

    But you can easily do so by filtering StrictMode's log reports:


    A. Configure StrictMode to write errors to log:

    public void onCreate() {
         if (DEVELOPER_MODE) {
             StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                     .detectDiskReads()
                     .detectDiskWrites()
                     .detectNetwork()
                     .penaltyLog() //<---------- write reports to log
                     .build());
         }
         super.onCreate();
    }
    


    B. Read logcat lines:

    logcat = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});
    br = new BufferedReader(new InputStreamReader(logcat.getInputStream()),4*1024);
    String line;
      final StringBuilder log = new StringBuilder();
      String separator = System.getProperty("line.separator");
        while ((line = br.readLine()) != null) {
              filterLogLine(line)
        }
    }
    


    C. filter lines by duration:

    void filterLogLine(String line) {
        use StringTokenizer to parse the line
        get value of "~duration"
        and filter if lesser than your threshold
    }
    

    I leave you to figure out the exact details of the line parsing.