zoukankan      html  css  js  c++  java
  • Android应用程序如何调用shell脚本(一)

    转自:

    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

  • 相关阅读:
    python 打印对象的所有属性值
    selenium+python测试
    java连接3种数据库 JdbcLinkDB --201801
    又来折腾--正则表达式
    Excel 将A表的基础数据拼接到B表中来-三种方法: ctrl+回车, VLOOKUP()函数,宏
    Excel如何快速统计一列中相同数值出现的个数--数据透视表
    Jmeter、Postman 、 loadrunner SoapUI 接口测试工具
    delphi 获取时间戳 如何得到 和 js 中 new Date().getTime();的 相同?
    IIS部署项目
    C#使用log4net记录日志
  • 原文地址:https://www.cnblogs.com/duanweishi/p/4460393.html
Copyright © 2011-2022 走看看