注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

Android中部署自己的su  

2013-09-03 10:43:55|  分类: 深入研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
首先把你的自己的su的放到Android应用程序工程的assets目录,为了和系统的su区分,我自己的su文件叫做sur。
另外我这里没有考虑x86架构的cpu的手机。
废话不多说,直接上代码吧!
Util.java文件

package cdut.robin.root.utils;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import ledroid.nac.NacShellCommand;


import android.content.Context;
import android.util.Log;

public class Util {
    private static String getDeployMySuShellScript(String localSuPath) {
        StringBuffer strBuffer = new StringBuffer();
        strBuffer.append("mount -o remount,rw " + MountPoint.getDeviceName("/system") + " /system");
        strBuffer.append("\n");
        strBuffer.append("mount -o remount,rw /system /system");
        strBuffer.append("\n");
        strBuffer.append("cat ").append(localSuPath).append(">" + kSysSuPath);
        strBuffer.append("\n");
        strBuffer.append("chown 0:0 " + kSysSuPath);
        strBuffer.append("\n");
        strBuffer.append("chmod 6777 " + kSysSuPath);
        strBuffer.append("\n");
        strBuffer.append("mount -o remount,ro " + MountPoint.getDeviceName("/system") + " /system");
        strBuffer.append("\n");
        strBuffer.append("mount -o remount,ro /system /system");
        strBuffer.append("\n");
        return strBuffer.toString();
    }

    final static String kSysSuPath = "/system/xbin/sur";

    private static boolean isMySuExists() {
        return new File(kSysSuPath).exists();
    }

    private static boolean writeMySu(Context context) {
        Process processShell = null;
        DataOutputStream osShell = null;
        String mySuTempPath = context.getFilesDir().getPath() + "/sur";
        File file = new File(mySuTempPath);
        if (file.exists()) {
            file.delete();
        }
        InputStream open = null;
        FileOutputStream out = null;
        try {
            open = context.getResources().getAssets().open("sur");
            out = context.openFileOutput("sur", Context.MODE_WORLD_WRITEABLE);
            byte buffer[] = new byte[4 * 1024];
            int len = 0;
            while ((len = open.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            out.flush();
        } catch (IOException e) {
            LogHelper.e("TAG", "errMessage" + e.getMessage());
        } finally {
            if (out != null) {
                try {
                    out.close();
                    if (open != null) {
                        open.close();
                    }
                } catch (Exception e) {
                    LogHelper.e("TAG", "errMessage" + e.getMessage());
                }
            }
        }
        Runtime runTime = Runtime.getRuntime();
        try {
            processShell = runTime.exec("su");
            osShell = new DataOutputStream(processShell.getOutputStream());
            String str = getDeployMySuShellScript(mySuTempPath);
            osShell.writeBytes(str);
            osShell.writeBytes("exit\n");
            osShell.flush();
            processShell.waitFor();
        } catch (IOException e) {
            
            e.printStackTrace();
        } catch (InterruptedException e) {
          
            e.printStackTrace();
        } finally {
            if (processShell != null) {
                try {
                    processShell.destroy();
                } catch (Exception e) {
                    // e.printStackTrace();
                }
                processShell = null;
            }
            if (osShell != null) {
                try {
                    osShell.close();
                    osShell = null;
                } catch (IOException e1) {
                    // e1.printStackTrace();
                }
            }
        }
        return new File(kSysSuPath).exists();
    }

    public static boolean doSthBySu(Context context) {
        if (!isMySuExists()) {
            boolean res = writeMySu(context);
            if (res) {
                Log.i("robin", "deploy My Su success!");
            }
            else
            {
                Log.i("robin", "deploy My Su fail!");
            }
        } else{
            Log.i("robin", "My su exsit!");
        }
        Process processShell = null;
        DataOutputStream osShell = null;
        //do something here by su
        try {
            Runtime runTime = Runtime.getRuntime();
            processShell = runTime.exec("sur");
            osShell = new DataOutputStream(processShell.getOutputStream());
            String str = getBussinessShellScript();
            osShell.writeBytes(str);
            osShell.writeBytes("exit\n");
            osShell.flush();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (processShell != null) {
                try {
                    processShell.destroy();
                } catch (Exception e) {
                     e.printStackTrace();
                }
                processShell = null;
            }
            if (osShell != null) {
                try {
                    osShell.close();
                    osShell = null;
                } catch (IOException e1) {
                    // e1.printStackTrace();
                }
            }
        }
        return true;
    }

    public static String getBussinessShellScript() {
        return "echo hello";
    }
}

MountPoint.java文件

package cdut.robin.root.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public final class MountPoint {
    private static HashMap<String, String> MOUNT_POINT_CACH = new HashMap(10);
    private static HashMap<String, List<String>> DEVICE_CACH = new HashMap(10);

    public static boolean isMountPoint(String mountPoint) {
        return getDeviceName(mountPoint) != null;
    }

    public static String getDeviceName(String mountPoint) {
        if (mountPoint == null) {
            return null;
        }

        String deviceName = null;
        if (MOUNT_POINT_CACH.containsKey(mountPoint)) {
            deviceName = (String) MOUNT_POINT_CACH.get(mountPoint);
        }

        return deviceName;
    }

    public static boolean hasMultiMountPoint(String deviceName) {
        List list = getMountPoints(deviceName);

        return (list != null) && (list.size() > 1);
    }

    public static List<String> getMountPoints(String deviceName) {
        return (List) DEVICE_CACH.get(deviceName);
    }

    static {
        BufferedReader mountPointReader = null;
        try {
            mountPointReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("/proc/mounts"))));
            String buffer = null;
            while ((buffer = mountPointReader.readLine()) != null) {
                MOUNT_POINT_CACH.put(buffer.split(" ")[1], buffer.split(" ")[0]);
                List list = (List) DEVICE_CACH.get(buffer.split(" ")[0]);
                if (list == null) {
                    list = new ArrayList(1);
                }
                list.add(buffer.split(" ")[1]);
                DEVICE_CACH.put(buffer.split(" ")[0], list);
            }
        } catch (IOException e) {
        } finally {
            try {
                if (mountPointReader != null)
                    mountPointReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}


结束!
  评论这张
 
阅读(683)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017