转自:

Android应用程序如何调用shell脚本(一)

一般来说, Android 下的应用程序可以“直接”得到的最大的权限为 system ,但是如果我们需要在程序中执行某些需要 root 权限的命令,就需要 root 权限了。按照 Simon 的文章中提到的,应用程序有以下两种办法临时获得 root 权限:

1)         init.rc 实现一个 Service ,来帮助 Android 应用程序执行 root 权限的命令。

2)        实现一个虚拟设备,这个设备帮助 Android 应用程序执行 root 权限的命令。

第二种办法我这里没有尝试过。只介绍第一种方法。

1.       编写shell脚本或者可执行程序

下面是我的脚本cp_file.sh:

#! /system/bin/sh

cat /mnt/sdcard/launcher.db > /data/data/com.android.launcher/databases/launcher.db

chown system.system /data/ data/com.android.launcher/databases/launcher.db

chmod 600 /data/ data/com.android.launcher/databases/launcher.db

注意: 脚本的第一行必须为 # ! /system/bin/sh ,否则无法执行。

2.       在init.rc中注册service

service file_cp  /system/bin/cp_file.sh

user root

oneshot

disabled

其中, oneshot 表示程序退出后不再重新启动, disabled 表示不在系统启动时启动。

Service中参数的含义参见其它文章。

3.       将应用程序的权限提升至system

1.在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。

2.使用mm命令来编译该应用程序,生成的apk就具有system权限了。

4.       在应用程序中添加属性设置代码:

A. 在应用程序中使用getruntime().exec()函数来执行shell脚本文件。参考代码如下:

package cycle.settings.system;

import java.io.BufferedReader;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import android.util.Log;

public class RuntimeExec {

private static final String TAG = "RuntimeExec";

private static final boolean DEBUG = true;//TODO: close this flag

private Process proc;

private StreamGobbler outputGobbler = null;

private StreamGobbler errorGobbler = null;

static class StreamGobbler extends Thread{

InputStream is;

String type; //输出流的类型ERROR或OUTPUT

public StreamGobbler(InputStream is, String type) {

// TODO Auto-generated constructor stub

this.is = is;

this.type = type;

}

public void run(){

try {

if(DEBUG)Log.d(TAG, "StreamGobbler start");

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

String line = null;

while((line = br.readLine()) != null){

System.out.println(type+">"+line);

System.out.flush();

}

if(DEBUG)Log.d(TAG, "StreamGobbler end");

} catch (IOException e) {

// TODO Auto-generated catch block

if(DEBUG)Log.d(TAG, "StreamGobbler exception");

e.printStackTrace();

}

}

}

/**

*

@param cmd : the command

@return success or failure

*/

public boolean runtimeExec(String cmd){

if(DEBUG)Log.d(TAG, "runtimeExec start");

boolean mboolean = false;

try {

if(DEBUG)Log.d(TAG, "runtimeExec start1");

Runtime mRuntime = Runtime.getRuntime();

proc = mRuntime.exec(cmd);

//any output message

StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(),"OUTPUT");

//any error message

StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");

//kick them off

outputGobbler.start();

//kick them off

errorGobbler.start();

int exitVal = proc.waitFor();

if(DEBUG)Log.d(TAG, "process exitValue: "+exitVal);

mboolean = (proc.waitFor()== 0);

} catch (Throwable e) {

// TODO Auto-generated catch block

if(DEBUG)Log.d(TAG, "process exception");

e.printStackTrace();

}

return mboolean;

}

public void runtimeEND(){

if(DEBUG)Log.d(TAG, "runtimeEND start");

try {

if(proc != null){

if(DEBUG)Log.d(TAG, "runtimeEND start1");

proc.getOutputStream().close();

if(DEBUG)Log.d(TAG, "close getOutputStream finish");

proc.getErrorStream().close();

if(DEBUG)Log.d(TAG, "close getErrorStream finish");

proc.destroy();

if(DEBUG)Log.d(TAG, "proc has destory");

}

else{

if(DEBUG)Log.e(TAG, "proc is null!!!!!");

}

if(DEBUG)Log.e(TAG, "before System.exit(0);");

System.exit(0);

if(DEBUG)Log.e(TAG, "after System.exit(0);");

proc = null;

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

未完,待续部分参考下篇博文。

参考博文:http://blog.csdn.net/silvervi/article/details/6315888

Android应用程序如何调用shell脚本(一)的更多相关文章

  1. C程序调用shell脚本共有三种方法

    C程序调用shell脚本共有三种法子 :system().popen().exec系列函数call_exec1.c ,内容为:system() 不用你自己去产生进程,它已经封装了,直接加入自己的命令e ...

  2. linux c程序中获取shell脚本输出的实现方法

    linux c程序中获取shell脚本输出的实现方法 1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作. ...

  3. linux C程序中获取shell脚本输出(如获取system命令输出)

    转载自 http://blog.csdn.net/hjxhjh/article/details/7909518 1. 前言 Unix 界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些 ...

  4. Python 调用 Shell脚本的方法

    Python 调用 Shell脚本的方法 1.os模块的popen方法 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出. > ...

  5. Spring Boot 实现看门狗功能 (调用 Shell 脚本)

    需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启.程序升级(如果只需要实现自动升级功能可以使用 inotify)等功 ...

  6. 【原】Gradle调用shell脚本和python脚本并传参

    最近由于项目自动化构建的需要,研究了下gradle调用脚本并传参的用法,在此作个总结. Pre build.gradle中定义了$jenkinsJobName $jenkinsBuild两个Jenki ...

  7. 调用shell脚本,IP处理

    //调用shell脚本,IP处理 package com.letv.sdns.web.utils; import org.slf4j.Logger; import org.slf4j.LoggerFa ...

  8. Unity开发Android应用程序:调用安卓应用程序功能

    开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...

  9. Java 调用 shell 脚本详解

    这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的“陷阱”造成调用shell 脚本在某些特 ...

随机推荐

  1. SQL Server 调优系列进阶篇 - 如何维护数据库索引

    前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...

  2. Python Django 前后端数据交互 之 后端向前端发送数据

    Django 前后台的数据传递 严正声明:作者:psklf出处: http://www.cnblogs.com/psklf/archive/2016/05/30/5542612.html欢迎转载,但未 ...

  3. HP-UNIX操作系统root账号被锁定的两种解决方法

    方法一:到单用户取消trusted system, 重新激活账户 a.重起机器,自检完成后,会出现这一行"To discontinue, press any key in 10 second ...

  4. main方法原来只要放在public static类中就能跑,涨知识了

    接口中可以装在嵌套类对象. public interface ClassInterface { void howdy(); class Test implements ClassInterface { ...

  5. 史前埃及(predynastic egypt)

    一个并不复杂的建造发展游戏,却十分有趣 安排工作-收集资源-招募工人-增加生产资源效率or建设科技-招募工人的模式 地表在建设后有明显的变化 同时也可以通过简单的动画展示工人的工作分配

  6. 关于hot miami的沙盒生存俯视角射击游戏

    一些关卡设计元素 撞门杀 扇形视角

  7. L235

    China will launch the Chang'e-5 probe by the end of this year to bring moon samples back to Earth, a ...

  8. 接下来将介绍C#如何设置子窗体在主窗体中居中显示,本文提供详细的操作步骤,需要的朋友可以参考下

    接下来将介绍C#如何设置子窗体在主窗体中居中显示,本文提供详细的操作步骤,需要的朋友可以参考下 其实表面上看是很简单的 开始吧,现在有两个窗体Form1主窗体,Form2子窗体 而且我相信大部分人都会 ...

  9. input 文件上传

    <button class="blueButton fileinput-button" style="width:165px;" @click=" ...

  10. Locust 测试结果通过Matplotlib生成趋势图

    目的: 相信大家对于使用Loadrunner测试后的结果分析详细程度还是有比较深刻的感受的,每个请求,每个事务点等都会有各自的趋势指标,在同一张图标中展示.如下图: 而Locust自身提供的chart ...