我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 开发中使用Linux Shell实例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 开发中使用Linux Shell实例详解

Android 开发中使用Linux Shell实例详解

引言

Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢?

最近发现了一个很好的Android Shell工具代码,在这里分享一下。

Shell核心代码


import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

public class ShellUtils {
  public static final String COMMAND_SU    = "su";
  public static final String COMMAND_SH    = "sh";
  public static final String COMMAND_EXIT   = "exit\n";
  public static final String COMMAND_LINE_END = "\n";
  private ShellUtils() {
    throw new AssertionError();
  }
  
  public static boolean checkRootPermission() {
    return execCommand("echo root", true, false).result == 0;
  }
  
  public static CommandResult execCommand(String command, boolean isRoot) {
    return execCommand(new String[] {command}, isRoot, true);
  }
  
  public static CommandResult execCommand(List<String> commands, boolean isRoot) {
    return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, true);
  }
  
  public static CommandResult execCommand(String[] commands, boolean isRoot) {
    return execCommand(commands, isRoot, true);
  }
  
  public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) {
    return execCommand(new String[] {command}, isRoot, isNeedResultMsg);
  }
  
  public static CommandResult execCommand(List<String> commands, boolean isRoot, boolean isNeedResultMsg) {
    return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, isNeedResultMsg);
  }
  
  public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) {
    int result = -1;
    if (commands == null || commands.length == 0) {
      return new CommandResult(result, null, null);
    }
    Process process = null;
    BufferedReader successResult = null;
    BufferedReader errorResult = null;
    StringBuilder successMsg = null;
    StringBuilder errorMsg = null;
    DataOutputStream os = null;
    try {
      process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);
      os = new DataOutputStream(process.getOutputStream());
      for (String command : commands) {
        if (command == null) {
          continue;
        }
        // donnot use os.writeBytes(commmand), avoid chinese charset error
        os.write(command.getBytes());
        os.writeBytes(COMMAND_LINE_END);
        os.flush();
      }
      os.writeBytes(COMMAND_EXIT);
      os.flush();
      result = process.waitFor();
      // get command result
      if (isNeedResultMsg) {
        successMsg = new StringBuilder();
        errorMsg = new StringBuilder();
        successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
        errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        String s;
        while ((s = successResult.readLine()) != null) {
          successMsg.append(s);
        }
        while ((s = errorResult.readLine()) != null) {
          errorMsg.append(s);
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (os != null) {
          os.close();
        }
        if (successResult != null) {
          successResult.close();
        }
        if (errorResult != null) {
          errorResult.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
      if (process != null) {
        process.destroy();
      }
    }
    return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null
        : errorMsg.toString());
  }
  
  public static class CommandResult {
    
    public int  result;
    
    public String successMsg;
    
    public String errorMsg;
    public CommandResult(int result) {
      this.result = result;
    }
    public CommandResult(int result, String successMsg, String errorMsg) {
      this.result = result;
      this.successMsg = successMsg;
      this.errorMsg = errorMsg;
    }
  }
}

ShellUtils代码引用自:Trinea

小实例

是否root


public Boolean isRooted(){
  CommandResult cmdResult = ShellUtils.execCommand("su", true);
  if (cmdResult.errorMsg.equals("Permission denied") || cmdResult.result != 0) {
    return false;
  }else{
    return true;
  }
}

复制文件


String[] commands = new String[] { "mount -o rw,remount /system", "cp /mnt/sdcard/xx.apk /system/app/" };
public boolean copyFile(String[] cmdText){
  CommandResult cmdResult = ShellUtils.execCommand(cmdText, true);
  if (cmdResult.errorMsg.equals("Permission denied") || cmdResult.result != 0) {
    return false;
  }else{
    return true;
  }
}

我暂时就举这两个例子,只要你会Shell,什么操作都是可以的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:Android客制化adb shell进去后显示shell@xxx的标识Android shell命令行中过滤adb logcat输出的方法Android shell命令行中过滤adb logcat输出的几种方法Android 使用Shell脚本截屏并自动传到电脑上Android中执行java命令的方法及java代码执行并解析shell命令实现android自动化测试部署与运行Shell脚本分享Android执行shell命令详解Android系统在shell中的df命令实现


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 开发中使用Linux Shell实例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android 开发中使用Linux Shell实例详解

Android 开发中使用Linux Shell实例详解 引言 Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢? 最近发现了一个很好的Android She
2022-06-06

Android 开发中Volley详解及实例

Android 开发中Volley详解及实例 最近在做项目的时候,各种get和post。简直要疯了,我这种啥都不了解的,不知道咋办了,然后百度看了下,可以用volley进行网络请求与获取,下面就介绍下volley的用法。 volley有三种
2022-06-06

Android开发之TabActivity用法实例详解

本文实例讲述了Android开发之TabActivity用法。分享给大家供大家参考,具体如下: 一.简介 TabActivity继承自Activity,目的是让同一界面容纳更多的内容。TabActivity实现标签页的功能,通过导航栏对各个
2022-06-06

Shell如何在Android 开发中使用

本篇文章为大家展示了Shell如何在Android 开发中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Shell核心代码import java.io.BufferedReader;import
2023-05-31

详解Android开发中ContentObserver类的使用

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发
2022-06-06

Android GZip的使用-开发中网络请求的压缩实例详解

Android GZip: gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。一般服务器中都安装有这个功能模块的,服务器端不需做改动。当浏览器支持gzi
2022-06-06

Android开发之TimePicker控件用法实例详解

本文实例分析了Android开发之TimePicker控件用法。分享给大家供大家参考,具体如下: 新建项目: New Android Project-> Project name:HelloSpinner Build Target:Andr
2022-06-06

Android开发之Animations动画用法实例详解

本文实例讲述了Android开发之Animations动画用法。分享给大家供大家参考,具体如下: 一、动画类型 Android的animation由四种类型组成:alpha、scale、translate、rotate XML配置文件中al
2022-06-06

Android 开发照相功能实例详解

Android 照相在android中,照相功能系统已经提供,在app中可以直接使用。当手机从android play里面下载有照相功能的应用时, 会判断手机是否支持。不支持,不给予下载。照相有几个步骤:1. 声明权限 2. 使用Camer
2022-06-06

Android开发之ImageLoader使用详解

先给大家展示效果图,看看是大家想要的效果吗,如果还满意,请参考以下代码:前言 UniversalImageLoader是用于加载图片的一个开源项目,在其项目介绍中是这么写的, 支持多线程图片加载 提供丰富的细节配置,比如线程池大小,HTPP
2022-06-06

实例讲解Android应用开发中TabHost的使用要点

Tab与TabHost:这就是Tab,而盛放Tab的容器就是TabHost 。 如何实现?? 每一个Tab还对应了一个布局,这个就有点好玩了。一个Activity,对应了多个功能布局。 新建一个Tab项目,注意,不要生成main Act
2022-06-06

Android 消息分发使用EventBus的实例详解

Android 消息分发使用EventBus的实例详解1. AndroidStudio使用dependencies { //最新版本 compile 'org.greenrobot:eventbus:3.0.0' //可以翻倍提高E
2023-05-30

Android样式的开发:layer-list实例详解

上图Tab的背景效果,和带阴影的圆角矩形,是怎么实现的呢?大部分的人会让美工切图,用点九图做背景。但是,如果只提供一张图,会怎么样呢?比如,中间的Tab背景红色底线的像素高度为4px,那么,在mdpi设备上显示会符合预期,在hdpi设备上显
2022-06-06

Android 开发订单流程view实例详解

Android 开发订单流程view实例详解 先看看最终效果图:怎么样,效果还是很不错的吧?群里有人说切四张图的、recycleview的、各种的都有啊,但是最简单的就是通过自定义view来实现了~接下来让我们来实现下这个(订单流程vie
2022-06-06

编程热搜

目录