马会东的博客

马会东的博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

转自:

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

posted on 2015-04-27 15:46  马会东  阅读(6858)  评论(0编辑  收藏  举报