zoukankan      html  css  js  c++  java
  • Android程序执行shell脚本

    在做Android应用时,经常需要执行shell脚本,以快速实现某些功能;

    在Android应用程序中执行shell脚本可以省去一大堆繁琐的代码,还可以避免不必要的错误;

    比如:拷贝文件夹时,可以执行shell命令中的 cp 命令达到目的;而在代码中实现拷贝文件夹时,不仅需要编写一大堆繁琐的代码,还容易陷入递归死循环的错误中;

    比如:获取文件系统的读写权限,只需要执行shell脚本中一句 mount -o rw,remount / 就能轻松搞定;

    比如:删除文件夹下某一个文件、或者某一类文件、或者全部文件,只需要执行shell脚本中的一句 rm -f  *(利用*通配符进行匹配) 就能轻松搞定;

    再比如:静默安装时,只需要执行shell脚本中一句 pm install -r 便可达到目的;

    如果这些都用代码来实现,不仅代码量增加,还容易造成很多bug,吃力不讨好!

    package com.example.test;
    
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import android.util.Log;
    
    /**
     * 执行shell脚本工具类
     * @author Mountain
     *
     */
    public class CommandExecution {
    
        public static final String TAG = "CommandExecution";
        
        public final static String COMMAND_SU       = "su";
        public final static String COMMAND_SH       = "sh";
        public final static String COMMAND_EXIT     = "exit
    ";
        public final static String COMMAND_LINE_END = "
    ";
    
        /**
         * Command执行结果
         * @author Mountain
         *
         */
        public static class CommandResult {
            public int result = -1;
            public String errorMsg;
            public String successMsg;
        }
    
        /**
         * 执行命令—单条
         * @param command
         * @param isRoot
         * @return
         */
        public static CommandResult execCommand(String command, boolean isRoot) {
            String[] commands = {command};
            return execCommand(commands, isRoot);
        }
    
        /**
         * 执行命令-多条
         * @param commands
         * @param isRoot
         * @return
         */
        public static CommandResult execCommand(String[] commands, boolean isRoot) {
            CommandResult commandResult = new CommandResult();
            if (commands == null || commands.length == 0) return commandResult;
            Process process = null;
            DataOutputStream os = null;
            BufferedReader successResult = null;
            BufferedReader errorResult = null;
            StringBuilder successMsg = null;
            StringBuilder errorMsg = null;
            try {
                process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);
                os = new DataOutputStream(process.getOutputStream());
                for (String command : commands) {
                    if (command != null) {
                        os.write(command.getBytes());
                        os.writeBytes(COMMAND_LINE_END);
                        os.flush();
                    }
                }
                os.writeBytes(COMMAND_EXIT);
                os.flush();
                commandResult.result = process.waitFor();
                //获取错误信息
                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);
                commandResult.successMsg = successMsg.toString();
                commandResult.errorMsg = errorMsg.toString();
                Log.i(TAG, commandResult.result + " | " + commandResult.successMsg
                        + " | " + commandResult.errorMsg);
            } catch (IOException e) {
                String errmsg = e.getMessage();
                if (errmsg != null) {
                    Log.e(TAG, errmsg);
                } else {
                    e.printStackTrace();
                }
            } catch (Exception e) {
                String errmsg = e.getMessage();
                if (errmsg != null) {
                    Log.e(TAG, errmsg);
                } else {
                    e.printStackTrace();
                }
            } finally {
                try {
                    if (os != null) os.close();
                    if (successResult != null) successResult.close();
                    if (errorResult != null) errorResult.close();
                } catch (IOException e) {
                    String errmsg = e.getMessage();
                    if (errmsg != null) {
                        Log.e(TAG, errmsg);
                    } else {
                        e.printStackTrace();
                    }
                }
                if (process != null) process.destroy();
            }
            return commandResult;
        }
        
    }

    如果能在android应用中执行shell脚本来达到目的,可以省去一大堆代码,避免很多易犯的错误,简洁高效,何乐而不为呢?!

    下面给出一个在Android应用中执行shell脚本的工具类的示例,供大家参考:

    天生我才必有用,千金散去还复来!
  • 相关阅读:
    hadoop中使用hprof工具进行性能分析
    hadoop map端的超时参数
    一次hadoop集群机器加内存的运维过程
    算法学习-回溯法
    项目中Map端内存占用的分析
    hadoop Shuffle Error OOM错误分析和解决
    算法学习-动态规划
    项目中Map端数据处理不均匀性分析
    《Hadoop技术内幕》读书笔记——Task运行过程分析
    jsp里更新Clob类型字段数据
  • 原文地址:https://www.cnblogs.com/Jack-Lu/p/8143161.html
Copyright © 2011-2022 走看看