Android中的su命令使用

Android开发工具系列目录

  1. Android项目中Git工具的使用
  2. 史上最全Git命令使用手冊
  3. 史上最新最全的ADB命令行
  4. Android中的su命令使用
  5. Postman测试WebService接口
  6. 2022 Android studio 最全必用插件


博客创建时间:2022.09.24
博客更新时间:2022.09.25

以Android studio build=7.0.0,SDKVersion 31来分析讲解。如图文和网上其他资料不一致,可能是别的资料版本较低而已。


前言

在日常开发Android程序中,我们可能碰到在程序中获取su权限,然后获取io流,执行shell命令。但是Android system/xbin 下的 su 是系统原生带的 su 程序,只给有 system 和 shell 用户使用,普通app 无法访问。

要使普通 app也能 su ,就要替换系统的 su 程序,有专门的,比如 SuperSU。或者将系统root,这样普通程序就能有权限使用。


一、怎么使用su?

常见的使用代码如下,通过以下代码能让我们提权使用shell命令,做一些更高级的指令操作。比如我要给某个USB串口授权chmod 777 /dev/ttyACM

	// cmd="chmod 777 /dev/ttyACM"
   public static int execRootCmdSilent(String cmd) {
        int result = -1;
        DataOutputStream dos = null;

        try {
            Process p = Runtime.getRuntime().exec("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;
    }

设备是否有root权限可以通过代码进行测试,此处提供检测设备是否root过的权限

   /**
     * 判断机器Android是否已经root,即是否获取root权限
     */
    public static boolean haveRoot() {
        // 通过执行测试命令来检测
        int ret = execRootCmdSilent("echo test");
        if (ret != -1) {
            Log.i(TAG, "have root!");
            return true;
        } else {
            Log.i(TAG, "not root!");
            return false;
        }
    }

二、代码异常情况

上面给出的代码是在Android系统被root过,或者手动授予了su操作命令,否则代码运行会出现两种异常情况(情况由本人亲测):

  1. java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
    在这里插入图片描述
    在Android 6.0及以下的真机和虚拟机中会出现以上的报错异常,意思就是没有su执行环境,无法执行su命令。

  2. java.io.IOException: Cannot run program “su”: error=13, Permission denied
    在这里插入图片描述
    Android 7.0及以后的Android真机和模拟器是没有Root权限的,所以执行代码会出现权限denied。


三、Android ROOT

Android系统的超级用户一般命名为root,root是系统中唯一的超级用户。root权限是指Linux的系统管理员权限,类似于Windows系统中的Administrator。
安卓root权限具有系统中所有的权限,可以访问和修改你手机中几乎所有的文件(Android系统文件及用户文件,不包括ROM),启动或停止一个进程,删除或增加用户,增加或者禁用硬件等等。

Root的优点:

  1. 可以备份系统。
  2. 使用高级的程序,例如屏幕截图、root explorer等等。
  3. 修改或是删除系统的内部程序。
  4. 可以更改apk安装到data分区或是sd卡分区中,将程序安装到SD卡中
  5. 手机开发人员,需要使用命令行控制设备

Root风险:

  1. 如果在ROOT的过程中遇到问题,可能使手机变砖(无法开机)。
  2. 如果不小心安装了恶意软件,可能使手机中的个人隐私信息暴露。
  3. 容易被病毒软件、黑客伤害
  4. 个别手机厂商会检测用户是否曾进行ROOT操作,这可能与保修有关。

相关链接

  1. Android项目中Git工具的使用
  2. 史上最全Git命令使用手冊
  3. 史上最新最全的ADB命令行
  4. Android中的su命令使用
  5. Postman测试WebService接口
  6. 2022 Android studio 最全必用插件

扩展链接:

  1. Material Design UI方案使用讲解
  2. Material TextInputLayout使用详解
  3. Room数据库,用过你才知道好
  4. ART与Dalvik、JVM之间的关系你懂了吗
  5. 一篇文章弄懂Java多线程基础和Java内存模型

博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值