本人博客原文

首先把你的自己的su的放到Android应用程序project的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();
            }
        }
    }
}

结束!

Android中部署自己的su的更多相关文章

  1. Android中怎样自己制作su

    本文原博客:http://hubingforever.blog.163.com/blog/static/171040579201372915716149/ 在Android源代码的system\ext ...

  2. Android动态部署五:怎样从插件apk中启动Service

    转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...

  3. Android中使用开源框架android-image-indicator实现图片轮播部署

    之前的博文中有介绍关于图片轮播的实现方式,分别为(含超链接): 1.<Android中使用ViewFlipper实现屏幕切换> 2.<Android中使用ViewPager实现屏幕页 ...

  4. Android中Fragment和ViewPager那点事儿(仿微信APP)

    在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...

  5. Android中Fragment与Activity之间的交互(两种实现方式)

    (未给Fragment的布局设置BackGound) 之前关于Android中Fragment的概念以及创建方式,我专门写了一篇博文<Android中Fragment的两种创建方式>,就如 ...

  6. Android中的五大布局

    Android中的五大布局 1.了解布局 一个丰富的界面总是要由很多个控件组成的,那我们如何才能让各个控件都有条不紊地 摆放在界面上,而不是乱糟糟的呢?这就需要借助布局来实现了.布局是一种可用于放置很 ...

  7. 在Android中调用C#写的WebService(附源代码)

    由于项目中要使用Android调用C#写的WebService,于是便有了这篇文章.在学习的过程中,发现在C#中直接调用WebService方便得多,直接添加一个引用,便可以直接使用将WebServi ...

  8. Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍

    本文主要内容: 1.FTP服务端部署---- 基于Android中SwiFTP开源软件介绍: 2.FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 : 3.使用步骤 --- 如何测试我 ...

  9. Android中如何像 360 一样优雅的杀死后台服务而不启动

    Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死.这里主要着重介绍如何像 360 一样杀死Android后台 ...

随机推荐

  1. Xamarin.Android中使用android:onClick="xxx"属性

    原文:Xamarin.Android中使用android:onClick="xxx"属性 在原生Android开发中,为一个View增加点击事件,有三种方式: 1.使用匿名对象 ( ...

  2. Path相关评论的方法(一)

    以前的主要是关于Canvas的translate(平移) .scale(缩放) .rotate(旋转) .skew(错切).接下来几篇主要讲下android里的Path(封装了贝塞尔曲线)&  ...

  3. 远程方法调用(RMI)原理与示例 (转)

    RMI介绍 远程方法调用(RMI)顾名思义是一台机器上的程序调用另一台机器上的方法.这样可以大致知道RMI是用来干什么的,但是这种理解还不太确切.RMI是Java支撑分布式系统的基石,例如著名的EJB ...

  4. Windows 8 应用开发 - 异步调用

    原文:Windows 8 应用开发 - 异步调用     不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使 ...

  5. [Python]How to handle the exception in Python?

    This post demonstrates how to use try clause to handle the exceptions def test_exception(case=None): ...

  6. Cocos2d-x Box2D物理引擎编译设置

    找到解决方案TestCpp工程.打开其属性=>C/C++ =>预处理器==>处理器定义. 参加"CC_ENABLE_BOX2D_INTEGRATION=1", 更 ...

  7. 2015华为德州扑克入境摘要——软体project

    直到6一个月2号下午12时00,华为长达一个月的德州扑克锦标赛落下帷幕也被认为是. 我们的团队一直共同拥有3民,间.一个同学(吴)负责算法设计,一个同学(宋)负责分析消息,而我负责的实现框架设计和详细 ...

  8. Thread.join()分析方法

    API: join public final void join() throws InterruptedException 等待该线程终止. 抛出: InterruptedException - 假 ...

  9. 检验身份证的正确性(C语言版本)

    /* check id_card * write by sndnvaps<sndnvaps@gmail.com> * ai -> a1 , a2, a3, a4, a5, a6... ...

  10. 神马是AB測试?

    手机响起了短信提示音,桂芬拿起手机,滑动解锁,看到是来福的短信,心里不禁一阵小鹿乱撞.     "喜欢看<冰封重生之门>吗?"     如此充满暗示意味的短信让桂芬激动 ...