本人博客原文
首先把你的自己的su的放到Android应用程序project的assets文件夹,为了和系统的su区分,我自己的su文件叫做sur。
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 sutry {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" ;}}
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 blocke.printStackTrace();}}}}