Java 以编程方式重新启动Android
我想使用此代码重新启动运行Android Things的RPI3: 我得到以下错误: java.io.IOException:无法运行程序“su”:错误=13,权限被拒绝 我将所有权限添加到清单中Java 以编程方式重新启动Android,java,runtime.exec,android-things,Java,Runtime.exec,Android Things,我想使用此代码重新启动运行Android Things的RPI3: 我得到以下错误: java.io.IOException:无法运行程序“su”:错误=13,权限被拒绝 我将所有权限添加到清单中 <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <u
<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"/>
我遗漏了什么吗?您需要根访问权限
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”)代码>您需要根访问权限
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上的应用程序将可以访问受系统保护的功能(例如由PowerManager.reboot()
API提供的功能)。您不能(也不应该)尝试通过su
以root用户身份运行应用程序进程
作为旁注,Android Things的开发者映像构建为userdebug
,这意味着您可以在尝试访问shell之前,通过使用ADB root
命令重新启动ADB守护程序,从shell访问root。这为您提供了在开发过程中可能需要的任何根用户访问权限,而不会影响设备安全,也不会允许应用程序进程以根用户身份运行。访问受系统保护的功能(例如由PowerManager.reboot()提供的功能)
API)在未来的开发者预览版本中,Android Things上运行的应用程序将可用。您不能(也不应该)尝试通过su
以root用户身份运行应用程序进程
作为旁注,Android Things的开发者映像构建为userdebug
,这意味着您可以在尝试访问shell之前,通过使用ADB root
命令重新启动ADB守护程序,从shell访问root。这为您提供了在开发过程中可能需要的任何根访问权限,而不会影响设备安全性,也不会允许应用程序进程以根用户身份运行。/code>/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
中不需要权限来成功运行二进制文件
警告:在较新的操作系统版本中,如果安全模型发生更改,此方法可能不起作用。/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
中不需要权限来成功运行二进制文件
警告:如果在较新的操作系统版本中更改了安全模型,此方法可能不起作用。您现在可以使用以下方法重新启动: 范例
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
permission您现在可以使用以下方法重新启动:
<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"/>
范例
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
权限不是android权限,而是linuxsu
命令权限。确保您的进程(用户)具有执行su的权限我如何检查我是否可以执行“su”?这是一个基本的linux问题,这里不能说太多。请学习如何在linux bash中执行命令,并检查二进制可执行文件。不是android权限,而是linuxsu
命令权限。确保您的进程(用户)具有执行su的权限我如何检查我是否可以执行“su”?这是一个基本的linux问题,这里不能说太多。请学习如何在LinuxBash中执行命令,并检查二进制可执行文件。。。如何在Android中获得根访问权限?好的,我的问题是。。。如何在Android中获得root访问权限?谢谢你的回答!所以我会等待未来的发布!“su”命令在任何情况下都不可访问?e、 g.如果我需要运行AVRDude(上传arduino固件…),没有“su”怎么办?建议的方法是直接使用外围I/O API实现协议,而不是调用需要提升权限的外部可执行文件。这对我们来说很难保证。谢谢你的解释!最后,@Onik建议的方法能够重新启动RPI3。现在我需要找到一种方法来执行AVRdude:d谢谢你的回答!所以我会等待未来的发布!“su”命令在任何情况下都不可访问?e、 g.如果我需要运行AVRDude(上传arduino固件…),没有“su”怎么办?建议的方法是直接使用外围I/O API实现协议,而不是调用需要提升权限的外部可执行文件。这对我们来说很难保证。谢谢你的解释!最后,@Onik建议的方法能够重新启动RPI3。现在我需要找到一种方法来执行AVRdude:DRuntime.getRuntime().exec(“重新启动”)代码>在第一时间起作用。非常感谢。如@Devunwired上的评论所述,我只需要使用su执行AVRdude“'su'命令在任何情况下都不可访问?”您可以尝试adb root
,然后adb重新安装
(防止/system/not in/proc/mounts
),然后adb shell chmod 777/system/xbin/su
(777只是一个例子,您可能会选择一个更受限制的模式),但您知道使su
world可执行是一个巨大的安全问题
<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"/>