In the apk, sometimes the root permission is required, such as updating system files such as system files through the apk, to avoid upgrading the firmware or directly accessing certain devices in the apk. The following method is used to obtain the root permission in apk, provided that the device has already been root.
The key point is that the following statement generates a process with root permission by executing su:
Process p = runtime.getruntime(cmd.exe c ("su ");
Then, write the command to be executed to the process to run the command as root:
Dos = new DataOutputStream (p. getOutputStream ());
Dos. writeBytes (cmd + "\ n ");
Dos. flush ();
Or use the following method:
Runtime.getruntime(cmd.exe c (new String [] {"/system/bin/su", "-c", cmd });
After testing, run the command with root permission. The test is successful only on the real machine, but not on the simulator.
During the first running, the page for requesting root permissions appears. Select and remember, and allow:
The test program interface. If it is already root, the corresponding device node of the/system partition is displayed:
Main file: RootCmd. java
[Java]
Package org. ckl. root;
Import java. io. DataInputStream;
Import java. io. DataOutputStream;
Import java. io. IOException;
Import android. util. Log;
Public final class RootCmd {
Private static final String TAG = "RootCmd ";
Private static boolean mHaveRoot = false;
// Determine whether the Android server has the root permission, that is, whether the root permission is obtained.
Public static boolean haveRoot (){
If (! MHaveRoot ){
Int ret = execRootCmdSilent ("echo test"); // you can run the test command to detect
If (ret! =-1 ){
Log. I (TAG, "have root! ");
MHaveRoot = true;
} Else {
Log. I (TAG, "not root! ");
}
} Else {
Log. I (TAG, "mHaveRoot = true, have root! ");
}
Return mHaveRoot;
}
// Execute the command and output the result
Public static String execRootCmd (String cmd ){
String result = "";
DataOutputStream dos = null;
DataInputStream dis = null;
Try {
Process p = runtime.getruntime(cmd.exe c ("su"); // The Root-processed android system has the su command.
Dos = new DataOutputStream (p. getOutputStream ());
Dis = new DataInputStream (p. getInputStream ());
Log. I (TAG, cmd );
Dos. writeBytes (cmd + "\ n ");
Dos. flush ();
Dos. writeBytes ("exit \ n ");
Dos. flush ();
String line = null;
While (line = dis. readLine ())! = Null ){
Log. d ("result", line );
Result + = line;
}
P. waitFor ();
} Catch (Exception e ){
E. printStackTrace ();
} Finally {
If (dos! = Null ){
Try {
Dos. close ();
} Catch (IOException e ){
E. printStackTrace ();
}
}
If (dis! = Null ){
Try {
Dis. close ();
} Catch (IOException e ){
E. printStackTrace ();
}
}
}
Return result;
}
// Execute the command but ignore the result output
Public static int execRootCmdSilent (String cmd ){
Int result =-1;
DataOutputStream dos = null;
Try {
Process p = runtime.getruntime(cmd.exe c ("su ");
Dos = new DataOutputStream (p. getOutputStream ());
Log. I (TAG, cmd );
Dos. writeBytes (cmd + "\ n ");
Dos. flush ();
Dos. writeBytes ("exit \ n ");
Dos. flush ();
P. waitFor ();
Result = p. exitValue ();
} Catch (Exception e ){
E. printStackTrace ();
} Finally {
If (dos! = Null ){
Try {
Dos. close ();
} Catch (IOException e ){
E. printStackTrace ();
}
}
}
Return result;
}
}
Related Files: SystemPartition. java, get the/system partition device node, and support re-mount/system to read/write:
[Java]
Package org. ckl. root;
Import java. io. DataInputStream;
Import java. io. File;
Import java. io. FileInputStream;
Import java. io. IOException;
Import android. util. Log;
Public class SystemPartition {
Private static final String TAG = "SystemMount ";
Private static String TMP_PATH = "/sdcard/mount.txt ";
Private static String mMountPiont = null;
Private static boolean mWriteable = false;
Private SystemPartition (){
Log. I (TAG, "new SystemMount ()");
}
Private static class SystemPartitionHolder {
Private static SystemPartition instance = new SystemPartition ();
}
Public SystemPartition getInstance (){
Return SystemPartitionHolder. instance;
}
Public static String getSystemMountPiont (){
DataInputStream dis = null;
If (mMountPiont = null ){
Try {
RootCmd.exe cRootCmd ("mount>" + TMP_PATH );
// Runtime.getruntime(cmd.exe c ("mount>" + TMP_PATH );
Dis = new DataInputStream (new FileInputStream (TMP_PATH ));
String line = null;
Int index =-1;
While (line = dis. readLine ())! = Null ){
Index = line. indexOf ("/system ");
If (index> 0 ){
MMountPiont = line. substring (0, index );
If (line. indexOf ("rw")> 0 ){
MWriteable = true;
Log. I (TAG, "/system is writeable! ");
} Else {
MWriteable = false;
Log. I (TAG, "/system is readonly! ");
}
Break;
}
}
} Catch (Exception e ){
E. printStackTrace ();
} Finally {
If (dis! = Null ){
Try {
Dis. close ();
} Catch (IOException e1 ){
E1.printStackTrace ();
}
Dis = null;
}
File f = new File (TMP_PATH );
If (f. exists ()){
F. delete ();
}
}
}
If (mMountPiont! = Null ){
Log. I (TAG, "/system mount piont:" + mMountPiont );
} Else {
Log. I (TAG, "get/system mount piont failed !!! ");
}
Return mMountPiont;
}
Public static boolean isWriteable (){
MMountPiont = null;
GetSystemMountPiont ();
Return mWriteable;
}
Public static void remountSystem (boolean writeable ){
String cmd = null;
GetSystemMountPiont ();
If (mMountPiont! = Null & RootCmd. haveRoot ()){
If (writeable ){
Cmd = "mount-o remount, rw" + mMountPiont + "/system ";
} Else {
Cmd = "mount-o remount, ro" + mMountPiont + "/system ";
}
RootCmd.exe cRootCmdSilent (cmd );
IsWriteable ();
}
}
}