【问题标题】:Reboot programmatically Android Things以编程方式重启 Android Things
【发布时间】:2018-11-12 01:54:58
【问题描述】:

我想使用此代码来重新启动运行 Android ThingsRPI3

public static void Reboot()
{
    try {
        Process proc = Runtime.getRuntime().exec(new String[]{"su", "-c", "reboot"});
        proc.waitFor();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

我收到以下错误:

java.io.IOException:无法运行程序“su”:错误=13,权限被拒绝

我将所有权限添加到清单中

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SHUTDOWN"/>

我错过了什么吗?

【问题讨论】:

  • 不是android权限,而是linuxsu命令权限。确保您的进程(用户)有权执行 su
  • 如何检查是否可以执行“su”?
  • 这是一个基本的linux问题,这里不能多说。请学习如何在 linux bash 中执行命令,并检查二进制可执行文件。

标签: java runtime.exec android-things


【解决方案1】:

/system/bin/reboot 二进制在 DP 4 中,因此在所有以前的开发预览中,具有世界可执行权限,即以下产量

adb shell ls -l /system/bin | grep reboot
-rwxr-xr-x 1 root shell   ... reboot

也就是说,仍然可以为任何用户(在 Android 中的应用程序进程)执行二进制文件,而无需获取 su。只需在 Java 中执行

正在重新启动

Runtime.getRuntime().exec("reboot");

或用于关机

Runtime.getRuntime().exec("reboot -p");

无需AndroidManifest.xml 中的权限即可成功运行二进制文件。

注意:如果新操作系统版本中的安全模型发生变化,这种方法可能不起作用。

【讨论】:

  • Runtime.getRuntime().exec("reboot"); 第一次工作。谢谢你。正如@Devunwired 的评论中提到的,我只需要使用 su 执行 AVRdude
  • "'su' 命令在任何情况下都无法访问?" 你可以尝试adb root,然后adb remount(防止/system/ not in /proc/mounts),然后@987654331 @(777 只是一个示例,您可能会选择更受限制的模式),但您知道将su 设为世界可执行文件是一个巨大的安全漏洞,对吧? :)
【解决方案2】:

您现在可以使用以下命令重新启动:

https://developer.android.com/things/reference/com/google/android/things/devicemanagement/DeviceManager.html

例子

 public class SomeActivity extends Activity {

     void doReboot() {
         DeviceManager.getInstance().reboot();
     }

     void doFactoryReset() {
         boolean wipeExternalCard = true;
         DeviceManager.getInstance().factoryReset(wipeExternalCard);
     }
  }

您需要com.google.android.things.permission.REBOOT 权限

【讨论】:

    【解决方案3】:

    在未来的开发者预览版中,运行在 Android Things 上的应用将可以访问受系统保护的功能(例如由 PowerManager.reboot() API 提供的功能)。您不能(也不应该)尝试通过 su 以 root 用户身份运行您的应用进程。

    附带说明一下,Android Things 的开发者镜像构建为 userdebug,这意味着您可以通过在尝试访问 shell 之前使用 adb root 命令简单地重新启动 ADB 守护程序来从 shell 访问 root。这为您提供了在开发过程中可能需要的任何 root 访问权限,而不会影响设备安全性并允许应用进程以 root 身份运行。

    【讨论】:

    • 感谢您的回答!所以我会等待未来的发布!在任何情况下都无法访问“su”命令?例如如果我需要运行 AVRDude(上传 arduino 固件...),如果没有“su”,我该怎么做?
    • 推荐的方法是直接使用外围 I/O API 实现协议,而不是调用需要提升权限的外部可执行文件。这对我们来说是一件很难保证的事情。
    • 感谢您的解释!最后,@Onik 建议的方法能够重新启动 RPI3。现在我需要找到一种方法来执行 AVRdude :D
    【解决方案4】:

    您需要 root 访问权限。

    public static void runCmd(String cmd) {
        DataOutputStream os;
        try {
            Process process = Runtime.getRuntime().exec("su");
            os = new DataOutputStream(process.getOutputStream());
            os.writeBytes(cmd + "\n");
            os.writeBytes("exit\n");
            os.flush();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    然后您可以运行任何需要 root 访问权限的命令,如下所示:runCmd("reboot");

    【讨论】:

    • 好的,所以我的问题是......如何在 Android Things 中获得 root 访问权限?
    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2016-01-04
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多