Android运行底层linux外部命令的实现,判断手机是否root

在 Android 中,如果要使用系统限制的权限(比如 android.permission.WRITE_SECURE_SETTINGS),我们需要把程序安装到 /system/app/ 下。 下面以 SecureSetting.apk 为例,演示这个操作。需要准备一台已经获得 Root 权限的手机。
1、通过 USB 连接手机和电脑。
2、使用 adb 控制手机。 源码打印?

  1. $ adb push SecureSetting.apk /sdcard/ // 上传要安装的文件,为安装做准备。
  2. $ adb shell
  3. $ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。
  4. #mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。
  5. #cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一 般设备中没有包含该命令。如果使用 mv 会出现错误:failed on ‘/sdcard/NetWork.apk’ - Cross-device link。
  6. #mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。
  7. #exit
  8. $ exit $ adb push SecureSetting.apk /sdcard/ // 上传要安装的文件,为安装做准备。
    $ adb shell $ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。
    #mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。
    #cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on ‘/sdcard/NetWork.apk’ - Cross-device link。
    #mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。
    #exit $ exit 重启,可以看到 SecureSetting 已经安装好。

补充,如果要实现将自己的apk直接安装到/system/app/,则需要先写一个installer.apk,在里面执行shell将主要apk通过cat的方式写入/system/app,再用chmod修改权限,然后执行reboot就行了

附上java执行shell的代码:

public final class RootCmd {
    // 执行linux命令并且输出结果
    protected static String execRootCmd(String paramString) {
            String result = "result : ";
            try {
                    Process localProcess = Runtime.getRuntime().exec("su ");// 经过Root处理的android系统即有su命令
                    OutputStream localOutputStream = localProcess.getOutputStream();
                    DataOutputStream localDataOutputStream = new DataOutputStream(
                                    localOutputStream);
                    InputStream localInputStream = localProcess.getInputStream();
                    DataInputStream localDataInputStream = new DataInputStream(
                                    localInputStream);
                    String str1 = String.valueOf(paramString);
                    String str2 = str1 + "\n";
                    localDataOutputStream.writeBytes(str2);
                    localDataOutputStream.flush();
                    String str3 = null;
					//while ((str3 = localDataInputStream.readLine()) != null) {
					//       Log.d("result", str3);
					//}
                    localDataOutputStream.writeBytes("exit\n");
                    localDataOutputStream.flush();
                    localProcess.waitFor();
                    return result;
            } catch (Exception localException) {
                    localException.printStackTrace();
                    return result;
            }
    }

    // 执行linux命令但不关注结果输出
    protected static int execRootCmdSilent(String paramString) {
            try {
                    Process localProcess = Runtime.getRuntime().exec("su");
                    Object localObject = localProcess.getOutputStream();
                    DataOutputStream localDataOutputStream = new DataOutputStream(
                                    (OutputStream) localObject);
                    String str = String.valueOf(paramString);
                    localObject = str + "\n";
                    localDataOutputStream.writeBytes((String) localObject);
                    localDataOutputStream.flush();
                    localDataOutputStream.writeBytes("exit\n");
                    localDataOutputStream.flush();
                    localProcess.waitFor();
                    int result = localProcess.exitValue();
                    return (Integer) result;
            } catch (Exception localException) {
                    localException.printStackTrace();
                    return -1;
            }
    }

    // 判断机器Android是否已经root,即是否获取root权限
    protected static boolean haveRoot() {

            int i = execRootCmdSilent("echo test"); // 通过执行测试命令来检测
            if (i != -1) {
                    return true;
            }
            return false;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值