By default, the android Java-layer APK does not have the root permission. If the APK requires the root permission to perform some operations, such as file read/write under the system directory and CPU frequency change, you must obtain the root permission.
Fortunately, the foreign cool-man writes the tool for obtaining root permissions, namely, superuser, which is mainly composed of two parts: suhe and superuser.apk. Suis the starting command, and other programs get the rootpermission through the token, while superuser.apk is a permission tracking application, mainly recording the APK programs need to get the root permission and root permission authorization.
1) Su source code in the GitHub site repository, https://github.com/ChainsDD/su-binary.git
2) superuser.apk source code in https://github.com/ChainsDD/Superuser.git
You can download it and study it carefully.
Next, we will explain how to use these two tools to write an APK with the root permission. By setting the governor of the CPU, we can change the dynamic frequency modulation mode of the CPU, however, the permission for the Sys interface/sys/devices/system/CPU/cpu0/cpufreq/scaling_governor is:
-RW-r -- 1 0 1000 4096 APR 13 scaling_governor
Other users only have the read-only permission. to access this interface, we need to obtain the root permission in the program.
The following is an example:
01.package com.feng.setcpu; 02. 03.import java.io.DataInputStream; 04.import java.io.DataOutputStream; 05.import java.io.IOException; 06.import java.util.ArrayList; 07.import java.util.List; 08. 09.import android.app.Activity; 10.import android.os.Bundle; 11.import android.util.Log; 12.import android.view.View; 13.import android.widget.AdapterView; 14.import android.widget.AdapterView.OnItemSelectedListener; 15.import android.widget.ArrayAdapter; 16.import android.widget.Spinner; 17.import android.widget.TextView; 18.import android.widget.Toast; 19. 20.public class SetCPU extends Activity { 21. 22. private final String TAG = "SetCPU"; 23. private List<String> governors; 24. 25. private Spinner spinner; 26. private ArrayAdapter<String> adapter; 27. private TextView tv; 28. 29. private int curCpuGovernor; 30. private final String cpuFreqPath = "/sys/devices/system/cpu/cpu0/cpufreq"; 31. /** Called when the activity is first created. */ 32. @Override 33. public void onCreate(Bundle savedInstanceState) { 34. super.onCreate(savedInstanceState); 35. setContentView(R.layout.main); 36. 37. governors = readCpuGovernors(); 38. curCpuGovernor = governors.indexOf(readCurCpuGovernor()); 39. spinner = (Spinner) findViewById(R.id.governors); 40. tv = (TextView) findViewById(R.id.tv); 41. 42. adapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, governors); 43. adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 44. spinner.setAdapter(adapter); 45. spinner.setPrompt("CPU Governors"); 46. spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 47. 48. @Override 49. public void onItemSelected(AdapterView<?> parent, View view, 50. int position, long id) { 51. Log.i(TAG, "set CPU Governor " + readCurCpuGovernor() + "-> " + governors.get(position)); 52. 53. writeCpuGovernor(governors.get(position)); 54. if(governors.get(position).equals(readCurCpuGovernor())){ 55. Toast.makeText(SetCPU.this, "write CPU Governor success!", Toast.LENGTH_LONG).show(); 56. curCpuGovernor = governors.indexOf(readCurCpuGovernor()); 57. } 58. else{ 59. Toast.makeText(SetCPU.this, "write CPU Governor failed!", Toast.LENGTH_LONG).show(); 60. spinner.setSelection(curCpuGovernor); 61. } 62. } 63. 64. @Override 65. public void onNothingSelected(AdapterView<?> parent) { 66. 67. } 68. }); 69. 70. 71. } 72. 73. private boolean writeCpuGovernor(String governor) 74. { 75. DataOutputStream os = null; 76. byte[] buffer = new byte[256]; 77. String command = "echo " + governor + " > " + cpuFreqPath + "/scaling_governor"; 78. Log.i(TAG, "command: " + command); 79. try { 80. Process process = Runtime.getRuntime().exec("su"); 81. os = new DataOutputStream(process.getOutputStream()); 82. os.writeBytes(command + "\n"); 83. os.writeBytes("exit\n"); 84. os.flush(); 85. process.waitFor(); 86. Log.i(TAG, "exit value = " + process.exitValue()); 87. } catch (IOException e) { 88. Log.i(TAG, "writeCpuGovernor: write CPU Governor(" + governor + ") failed!"); 89. return false; 90. } catch (InterruptedException e) { 91. e.printStackTrace(); 92. } 93. return true; 94. } 95. 96. private String readCurCpuGovernor() 97. { 98. String governor = null; 99. DataInputStream is = null; 100. try { 101. Process process = Runtime.getRuntime().exec("cat " + cpuFreqPath + "/scaling_governor"); 102. is = new DataInputStream(process.getInputStream()); 103. governor = is.readLine(); 104. } catch (IOException e) { 105. Log.i(TAG, "readCurCpuGovernor: read CPU Governor failed!"); 106. return null; 107. } 108. return governor; 109. } 110. 111. private List<String> readCpuGovernors() 112. { 113. List<String> governors = new ArrayList<String>(); 114. DataInputStream is = null; 115. try { 116. Process process = Runtime.getRuntime().exec("cat " + cpuFreqPath + "/scaling_available_governors"); 117. is = new DataInputStream(process.getInputStream()); 118. String line = is.readLine(); 119. 120. String[] strs = line.split(" "); 121. for(int i = 0; i < strs.length; i++) 122. governors.add(strs[i]); 123. } catch (IOException e) { 124. Log.i(TAG, "readCpuGovernors: read CPU Governors failed!"); 125. } 126. return governors; 127. } 128.}
From: http://blog.csdn.net/fengyanhui/article/details/7459639