关于判断手机是否已经root的方法。如果app有一些特殊功能需要root权限,则需要判断是否root。比如一些市场下载完app后自动安装。
-
-
-
-
- public class Root {
-
- private static String LOG_TAG = Root.class.getName();
-
- public boolean isDeviceRooted() {
- if (checkRootMethod1()){return true;}
- if (checkRootMethod2()){return true;}
- if (checkRootMethod3()){return true;}
- return false;
- }
-
- public boolean checkRootMethod1(){
- String buildTags = android.os.Build.TAGS;
-
- if (buildTags != null && buildTags.contains("test-keys")) {
- return true;
- }
- return false;
- }
-
- public boolean checkRootMethod2(){
- try {
- File file = new File("/system/app/Superuser.apk");
- if (file.exists()) {
- return true;
- }
- } catch (Exception e) { }
-
- return false;
- }
-
- public boolean checkRootMethod3() {
- if (new ExecShell().executeCommand(SHELL_CMD.check_su_binary) != null){
- return true;
- }else{
- return false;
- }
- }
- }
-
-
-
-
-
-
- public class ExecShell {
-
- private static String LOG_TAG = ExecShell.class.getName();
-
- public static enum SHELL_CMD {
- check_su_binary(new String[] {"/system/xbin/which","su"}),
- ;
-
- String[] command;
-
- SHELL_CMD(String[] command){
- this.command = command;
- }
- }
-
- public ArrayList<String> executeCommand(SHELL_CMD shellCmd){
- String line = null;
- ArrayList<String> fullResponse = new ArrayList<String>();
- Process localProcess = null;
-
- try {
- localProcess = Runtime.getRuntime().exec(shellCmd.command);
- } catch (Exception e) {
- return null;
-
- }
-
- BufferedWriter out = new BufferedWriter(new OutputStreamWriter(localProcess.getOutputStream()));
- BufferedReader in = new BufferedReader(new InputStreamReader(localProcess.getInputStream()));
-
- try {
- while ((line = in.readLine()) != null) {
- Log.d(LOG_TAG, "--> Line received: " + line);
- fullResponse.add(line);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- Log.d(LOG_TAG, "--> Full response was: " + fullResponse);
-
- return fullResponse;
- }
-
- }
代码来自stackoverflow,向作者致敬。
方法2:
The RootTools library offers simple methods to check for root:
一个开源项目:http://code.google.com/p/roottools/
RootTools.isRootAvailable()判断是否root
RootTools.isAccessGiven()返回true那么手机已经root并且app也被授予root权限。
另外:据那片帖子的一个回贴人说使用
- String commandToExecute = "su";
- executeShellCommand(commandToExecute);
- private boolean executeShellCommand(String command){
- Process process = null;
- try{
- process = Runtime.getRuntime().exec(command);
- return true;
- } catch (Exception e) {
- return false;
- } finally{
- if(process != null){
- try{
- process.destroy();
- }catch (Exception e) {
- }
- }
- }
- }
会引起非常严重的性能问题,将手机系统拖的非常慢,当应用多次启动后会创建出很多个僵死的进程耗用内存。
参考http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device
To sum up; I have no advice for you to determine if device is rooted or not. But if I were you I would not use Runtime.getRuntime().exec().
By the way; RootTools.isRootAvailable() causes same problem.
The RootTools library offers simple methods to check for root: