转自:

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. Prism5.0开发人员指南内容 Contents of the Developer's Guide to Prism Library 5.0 for WPF(英汉对照版)

    The Prism for WPF guide contains the following topics: Prism指南包含以下内容: Download and Setup Prism 下载并安装 ...

  2. bzoj3601

    题解:gi(pq=pqi-pqi+di 至于为什么,可以看看往上的题解 代码: #include<bits/stdc++.h> using namespace std; typedef l ...

  3. FormShortCut MainForm 和 二级FORM

    发现,主FORM 定义的快捷键,在二级FORM里也有效. 反过来,就无效. 这样的话,就要考虑 快捷键的冲突问题 了,本来以为不同的FORM 是独立的. http://codeverge.com/em ...

  4. 基于jquery,bootstrap数据验证插件bootstrapValidator 教程

    bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...

  5. iOS调用第三方地图App进行导航方法

    前言 App内根据手机上装载的地图App将其显示在弹出的选择框,选择对应地图跳转进入地图导航.需要用到- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS( ...

  6. java设计模式 略版

    <转> 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结 ...

  7. 《TensorFlow实战》读书笔记(完结)

    1 TensorFlow基础 ---1.1TensorFlow概要 TensorFlow使用数据流图进行计算,一次编写,各处运行. ---1.2 TensorFlow编程模型简介 TensorFlow ...

  8. TimeSpan格式化字符串格式(摘)

    一直在用DateTime, 却不常用TimeSpan , 今天突然用到了, 发现不知道咋做格式化...百度一下,找到了答案, 在这记录一下, 免得以后找花费时间 以下内容摘抄自 Microsoft D ...

  9. ubuntu16.04 下 NVIDIA GTX1050ti 显卡驱动 PPA安装

    本文参考资料链接: http://blog.csdn.net/10km/article/details/61191230 前几天在京东商城上花了6999元买了台笔记本(惠普(HP)暗影精灵II代Pro ...

  10. opencv-python教程学习系列4-opencv绘图函数

    前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍opencv绘图函数,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统 ...