一、通过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