Android执行命令行命令(获取系统Logcat)

版权声明:本博客仅用于学习交流,欢迎转载,但请注明作者和出处 https://blog.csdn.net/weixin_37577039/article/details/82596105

Android执行命令行命令

一、通过ProcessBuilder

1 String[] args  = {"pm", "install", "-r", filePath};

2  ProcessBuilder processBuilder = new ProcessBuilder(args);

3 process = processBuilder.start();  创建一个进程

4 errIs = process.getErrorStream();
  inIs = process.getInputStream();

二、用 Runtime

// 获取运行时对象
Runtime.getRuntime()
Runtime.getRuntime().exec();
Process exec(); 

开启一个单独的子进程中执行 cmd 命令
JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流
可以对其进行destroy waitFor 输入输出进程的流的操作

process.waitFor();
int waitFor()

将导致当前进程等待,直到该对象的线程结束,才返回调用
返回值:表示的子线程的退出值 0为正常退出

进程阻塞风险:
调用 waitFor() 方法 主线程等待子线程执行完 才会继续执行主线程
若 子进程不断输出信息 但是 主线程 并没有进行 InputStream和ErrorStream的获取 则Buffer会满
这时 子线程不能继续写数据 也会挂起 而主线程 等待不了子线程的结束 因此都在等待 造成死锁

解决:
在waitfor之前,单独启两个额外的线程,分别用于处理InputStream和ErrorStream就可以
最好还是开设子线程去操作 避免主线程阻塞


一、获取系统Logcat

1 加权限:android.permission.READ_LOGS
不过4.1以上的手机需要signature|system|development 即 系统签名软件包|系统程序|开发者模式通过ADB方式连接
才能获取到系统的Logcat日志


2 执行shell命令:

try {
           ArrayList commandLine = new ArrayList();
          commandLine.add( "logcat");
           // 使用该参数可以让logcat获取日志完毕后终止进程
           commandLine.add( "-d");
           // 打印设置
           commandLine.add( "-v");
           commandLine.add( "time");
           // 输出文件设置
           commandLine.add( "-f");如果使用commandLine.add(">");是不会写入文件,必须使用-f的方式
           commandLine.add( "/sdcard/log/logcat.txt");
           Process process = Runtime.getRuntime().exec( commandLine.toArray( new String[commandLine.size()]));
           BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream()), 1024);
           String line = bufferedReader.readLine();
           while ( line != null) {
               log.append(line);
               log.append("\n")
           }
       } catch ( IOException e) {
       }

3 常见logcat 命令:

adb logcat

(1)指定 logcat 的日志输出格式 用adb logcat -v xxx:
“time”格式 : “日期 时间 优先级 / 标签 (进程ID) : 进程名称 : 日志信息 “, 使用adb logcat -v time 命令
“long”格式:” [ 日期 时间 进程ID : 线程ID 优先级 / 标签] 日志信息 “, 输出以上提到的所有的头信息, 使用adb logcat -v long 命令
“raw”格式 : 只输出日志信息, 不附加任何其他 信息, 如 优先级 标签 时间等
“thread”格式 : ” 优先级 ( 进程ID : 线程ID) 标签 : 日志内容 ”
“tag”格式 : ” 优先级 / 标签 : 日志信息”
“brief”格式 : 这是默认的日志格式” 优先级 / 标签 (进程ID) : 日志信息

(2)清空日志缓存信息 : 使用 adb logcat -c 命令

(3)查看日志缓冲区信息 : 使用 adb logcat -g
可以查看 system main 和 crash 的buffer大小
如main 有256kb

(4)加载日志缓冲区 : 使用 adb logcat -b 缓冲区类型
缓冲区类型:
system缓冲区 - 与系统相关的日志信息
radio缓冲区 - 广播电话相关的日志信息
events缓冲区 - 事件相关的日志信息
main缓冲区 - 默认的缓冲区

(5)输出最近的日志
adb logcat -t 5
最近5条日志 并且不会阻塞

(6)将缓存日志输出并退出
adb logcat -d

(7)输出日志到指定位置保存
adb locat -d -f 路径

(8)日志过滤打印
[:priority]
TAG是标签
priority是日志等级 如 V D I W E
如:adb logcat 10 *:E
并且是可以同时设置多个过滤器的

(9)修改logcat缓存区大小
logcat -G 1M
adb可以 但是命令不知道可以不可以

记得进行定期清除日志操作

logcat命令查询:
https://developer.android.com/studio/command-line/logcat?hl=zh-cn
https://blog.csdn.net/tumuzhuanjia/article/details/39555445


猜你喜欢

转载自blog.csdn.net/weixin_37577039/article/details/82596105
今日推荐