设为首页 收藏本站
查看: 649|回复: 0

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

[复制链接]

尚未签到

发表于 2015-12-4 08:41:49 | 显示全部楼层 |阅读模式
  
  转自:
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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-147011-1-1.html 上篇帖子: Shell学习笔记 下篇帖子: *Shell编程基础教程4--控制流结构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表