当前位置: 首页 > 知识库问答 >
问题:

在Android设备上运行根命令

狄睿
2023-03-14

我想在Android设备上运行一些需要根权限的命令。这些命令应该使用java代码执行,因此应用程序本身应该能够运行这些命令,而不需要将设备连接到个人电脑并使用shell运行这些命令。

我使用了su,然后使用了我想要运行的命令(chmod 666)。chmod666需要一个根设备才能正常运行,因此我尝试先使用su获得超级用户权限,然后尝试运行它。我将java代码放在onCreate方法中。这是我的密码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

      String[] cmds = {"cd /dev/input" ,"chmod 666"};
        try {
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
        }
        catch (IOException e){
            e.printStackTrace();
        }

         setContentView(R.layout.activity_main__interface);
    }

但是,运行此应用程序时,我遇到以下错误:

11-20 12:32:14.120    3265-3265/com.project.android.test E/cutils﹕ to chown(/mnt/shell/emulated/0, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.android.test E/cutils﹕ to chown(/mnt/shell/emulated/obb, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.android.test E/cutils﹕ to chown(/storage/emulated/0/Android, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.android.test E/cutils﹕ to chown(/storage/emulated/0/Android/obb, 0, 0)
11-20 12:32:14.346    3265-3265/com.project.android.test E/linker﹕ load_library(linker.cpp:761): library "libmaliinstr.so" not found
11-20 12:32:14.348    3265-3265/com.project.android.test E/﹕ appName=com.project.android.test, acAppName=com.android.cts.openglperf
11-20 12:32:14.348    3265-3265/com.project.android.test E/﹕ 0
11-20 12:32:14.348    3265-3265/com.project.android.test E/﹕ appName=com.project.android.test, acAppName=com.android.browser
11-20 12:32:14.348    3265-3265/com.project.android.test E/﹕ 0

我试图搜索关于chown,我发现它与改变文件的所有权有关,

http://www.cyberciti.biz/faq/how-to-use-chmod-and-chown-command/

我认为这是由于试图运行su造成的。我已经删除了命令数组,只保留su,并再次运行应用程序,但我得到了一个与chown有关的错误。所以,我认为运行su有问题,但我想不通。

当我继续搜索如何运行su时,我找到了与我使用的方法相同的方法,该方法依赖于getRunTime。exec

我曾经读到su需要一个根设备才能正常运行,但我不确定这一点,因为我只在少数参考资料中看到了这一点,对吗?

谁能告诉我代码中的问题是什么以及如何解决它?

感谢您的帮助。

编辑:我提供的错误日志中有一行写着“加载库(linker.cpp:761):库”libmalinstr。所以“找不到”

我搜索了一下,发现有些手机像华为一样错过了这个图书馆。我的设备是华为,因此会导致如下所述的库相关错误:

找不到库“libmalinstr.so”

但是我读过这个库不会影响应用程序的运行,但是它会影响su吗?

共有2个答案

施辉
2023-03-14

试试这个

String[] deviceCommands = {"su", "cd /dev/input", "chmod 666"};
try {
        Process process = Runtime.getRuntime().exec(deviceCommands);
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(), "error!", Toast.LENGTH_SHORT).show();
    }
孙和安
2023-03-14

您可以编写代码来执行su命令。问题是由于创建运行时时缺少硬件加速库。您可以在ADB shell中尝试相同的“su”命令,它应该可以工作。

在清单中添加以下行。关闭硬件加速的xml应该可以解决此问题:

<activity android:hardwareAccelerated="false">

请尝试此代码,我在android 5.1上运行正常:

private void prepareKvmKernelModule(){
    try{
        Process p = Runtime.getRuntime().exec("su");
        DataOutputStream outputStream = new DataOutputStream(p.getOutputStream());
        outputStream.writeBytes("insmod /lib/modules/kvm.ko\n");
        outputStream.flush();
        outputStream.writeBytes("insmod /lib/modules/kvm-intel.ko\n");
        outputStream.flush();
        outputStream.writeBytes("chmod 777 /dev/kvm\n");
        outputStream.flush();
        outputStream.writeBytes("exit\n");
        outputStream.flush();
        p.waitFor();
    }
    catch (Exception e){
        e.printStackTrace();
    }
}
 类似资料:
  • 我正在使用Windows8。我正在尝试在设备上运行应用程序。找不到我的设备,设备USB调试已启用。此外,我已经安装了相同的驱动程序使用管理我也安装了谷歌USB驱动程序包。但仍然找不到该设备。 拜托,有人能帮忙吗

  • 本文向大家介绍在运行时检查设备上的Android版本,包括了在运行时检查设备上的Android版本的使用技巧和注意事项,需要的朋友参考一下 示例 Build.VERSION_CODES 是当前已知的SDK版本代码的枚举。 为了有条件地基于设备的Android版本运行代码,请使用TargetApi注释以避免Lint错误,并在运行特定于API级别的代码之前检查生成版本。 这是在支持低于23的API级别

  • 我遇到了一个问题,我的模拟器无法启动,我收到一条消息“等待设备上线”。尝试退出emulator,但要过一段时间才能退出。在同一个模拟器上,这种情况一直发生在我身上。有没有办法解决这个问题?非常感谢。

  • 我也尝试过这个其他的解决方案。

  • 我只是做了一个简单的android应用程序,有6个按钮。每点击一个按钮就会打开一个新的活动。我通过的USB电缆在我的设备上安装了这个应用程序,它在我的设备上运行良好。 但问题来了,当我通过分享后,在朋友的设备上安装了应用程序,但应用程序已经安装在他的设备上,但没有运行。 请帮帮忙。谢谢你

  • 我在OS X(10.10.1)上使用Kivy和buildozer,但我无法在我的android设备上运行Kivy相机应用程序。不使用相机的情况很好。代码如下,我还可以发布buildozer规范文件和调试信息。任何帮助都很感激。 从kivy.App导入应用程序从kivy.uix.Widget导入小部件从kivy.uix.Camera导入相机从kivy.uix.Button导入按钮从kivy.core