Android执行执行Shell命令总结

开发中有时需要用Java调用系统的一些命令,执行一些语言本事不具备的功能,Android开发中最常见的就是Root静默安装,通过命令修改某些目录权限等工作。我们通常会通过Runtime执行一个系统命令,返回一个process对象,然后检查这个对象的状态,了解执行结果。JavaSE调用shell命令原理也类似。

下面我们看个实例

Process process;
String cmd = "chmod 777 " + f.getAbsolutePath();
process = Runtime.getRuntime().exec(cmd);
process.waitFor();
到此为止,是不是就结束了呢,其实不然。调用exec会创建一个子进程来执行这个命令,如果命令输出的信息过多,会导致子进程的缓冲区被占满,命令无法进行执行下去。有兴趣可以试下。这时我们需要在调用waitFor之前将process的缓冲数据给消费掉。可以用下面的方法进行处理。
/**
	 * discard all stream
	 */
	private static void consumeStream(InputStream is) {
		BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
        try {
        	String str = null;
			while((str = br.readLine()) != null) {
				
				Log.v(TAG, str);
				
			}
			if (is != null) {
				is.close();
			}
		} catch (IOException e) {
			Log.v(TAG, "" + e);
		}
	}

类似的问题已经转的满地都是,但是实际运用中却总有人布好好多坑。。

具体可以参考这里http://stackoverflow.com/questions/5483830/process-waitfor-never-returns

你可能感兴趣的:(android)