写点什么

Android 如何用代码执行 shell 命令

用户头像
Changing Lin
关注
发布于: 2021 年 09 月 17 日
Android如何用代码执行shell命令

1.需求

近日,公司有个通信网络相关的项目正在开展,由于场景的特殊性,前线的同事提出了开发一个日志查看 APP 的需求:

  • 支持查看实时系统运行日志

  • 支持把本地日志文件上传到远程 FTP 服务

  • 支持网管向下层配置 FTP 服务器参数

  • 支持捕获模组日志,并上传到指定的远程 FTP 服务器

  • 支持上传底层日志

2.分析

  • 封装简易方法 doShellReport


fun doShellReport(cmd: String): Unit { try { Logger.error(UploadUtils::class, "doShellReport开始")// val su = Runtime.getRuntime().exec("su") val su = Runtime.getRuntime().exec("$cmd\n") val outputStream = DataOutputStream(su.outputStream)// outputStream.writeBytes("$cmd\n")// outputStream.flush()// outputStream.writeBytes("exit\n") outputStream.flush() Logger.error(UploadUtils::class, "doShellReport等待") su.waitFor() Logger.error(UploadUtils::class, "doShellReport结束") } catch (e: Exception) { e.printStackTrace() Logger.error(UploadUtils::class, "doShellReport结果: ${e.localizedMessage}") }}
复制代码
  • 使用协程触发,异步检测指令输出结果

private val coroutineScope = CoroutineScope(Dispatchers.IO)
private var isRunning = truefun doBugReport(context: Context, cmd: String, callback: BugReportCallback? = null): Unit { coroutineScope.launch { try { Logger.error(UploadUtils::class, "doBugReport开始") val su = Runtime.getRuntime().exec("$cmd\n") val outputStream = DataOutputStream(su.outputStream) val inputStream = DataInputStream(su.inputStream) val bufferedReader = BufferedReader(InputStreamReader(inputStream)) outputStream.flush() Logger.error(UploadUtils::class, "doBugReport等待")
launch(Dispatchers.IO) { while (isRunning) { val result = bufferedReader.readLine() Log.e("BugReport", "doBugReport: $result") if (result.isNullOrEmpty()) break if (result.containsIgnoreCase(END_STRING)) { break } } callback?.onResult(true) inputStream.close() } su.waitFor() outputStream.close() Logger.error(UploadUtils::class, "doBugReport结束") } catch (e: Exception) { e.printStackTrace() Logger.error(UploadUtils::class, "doBugReport异常: ${e.localizedMessage}") } }}
复制代码

3.总结

测试发现,doShellReport 可以执行大部分的 shell 脚本,且可以捕获到命令打印结果。

发布于: 2021 年 09 月 17 日阅读数: 7
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
Android如何用代码执行shell命令