Android中部署自己的su

本人博客原文

首先把你的自己的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();
            }
        }
    }
}


结束!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值