android判断手机是否root

关于判断手机是否已经root的方法。如果app有一些特殊功能需要root权限,则需要判断是否root。比如一些市场下载完app后自动安装。

/**
 * @author Kevin Kowalewski
 *
 */
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;
        }
    }
}

/**
 * @author Kevin Kowalewski
 *
 */
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;
            //e.printStackTrace();
        }

        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:

android判断手机是否root

时间: 2024-10-10 11:16:16

android判断手机是否root的相关文章

Android 判断手机是否联网时异常闪退

写了个函数来判断手机是否联网,但是发现,在手机联网状态下一切正常,而当手机断网时则会发现闪退. 首先第一反应是会不会是没在AndroidManifest.xml文件中设置联网权限: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 发现有这段语句,那么是在哪里出错呢,我最初的代码是这样的: /**判断网络是否可用 * @param

android 判断手机中是否有SD卡,USB。静态判断

public static String getSDPath(Context context) { String sd = null; StorageManager storageManager = (StorageManager) context .getSystemService(Context.STORAGE_SERVICE); StorageVolume[] volumes = storageManager.getVolumeList(); for (int i = 0; i < vol

[Android] 判断手机上是否安装了某个程序

http://blog.csdn.net/xiaodongrush/article/details/9320135 1. 首先得到该程序的包名 这个连上手机ADB,看logcat就能看到.比如:QQ客户端的包名是com.tencent.mobileqq. 2. 然后通过PackageManager判断是否存在该包的程序 [java] view plaincopyprint? private boolean isPkgInstalled(String pkgName) { PackageInfo 

android 判断手机是否支持前置摄像头

话不多说 直接上代码, @SuppressLint("NewApi") public static boolean isSupportFrontCamera() { if (!hasGingerbread()) { return false; } @SuppressWarnings("deprecation") int numberOfCameras = android.hardware.Camera.getNumberOfCameras(); if (2 == n

android判断手机SIM状态

public String readSIMCard() { TelephonyManager tm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);//取得相关系统服务 StringBuffer sb = new StringBuffer(); switch(tm.getSimState()){ //getSimState()取得sim的状态 有下面6中状态 case TelephonyManager.SIM_STATE_

Android -- 程序判断手机ROOT状态,获取ROOT权限

判断手机是否具有ROOT权限                                                            /** * 判断手机是否ROOT */ public boolean isRoot() { boolean root = false; try { if ((!new File("/system/bin/su").exists()) && (!new File("/system/xbin/su").exi

【Android】不弹root请求框检测手机是否root

由于项目需要root安装软件,并且希望在合适的时候引导用户去开启root安装,故需要检测手机是否root. 最基本的判断如下,直接运行一个底层命令.(参考https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ShellUtils.java) 也可参考csdn http://blog.csdn.net/fm9333/article/details/12752415 1 /** 2

JS判断是否是微信页面,判断手机操作系统(ios或android)并跳转到不同下载页面

JS判断客户端是否是iOS或者Android 参考:http://caibaojian.com/browser-ios-or-android.html 1 function is_weixin() { 2 var ua = window.navigator.userAgent.toLowerCase(); 3 if (ua.match(/MicroMessenger/i) == 'micromessenger') { 4 return true; 5 } else { 6 return fals

两种方法检查Android是否已获取root权限

现在Android手机root权限可以说是轻松就获取得到的,而关于判断手机是否已经root的方法,你了解吗?如果app有一些特殊功能需要root权限,则需要判断是否root.不知道root是不是意味着手机不安全?说到底还是想一台究竟,你可以学习Android应用开发视频教程.下面介绍两种方法: 方法1: /*** @author Kevin Kowalewski**/public class Root { private static String LOG_TAG = Root.class.ge