一、问题描述
项目基于Android 12 qcom开发板调试串口通信,应用层使用Google原生串口工具打开串口,出现如下问题:
原Process su = Runtime.getRuntime().exec("/system/bin/su");方法无效,报错java.io.IOException: Cannot run program "/system/bin/su": error=2, No such file or directory;
使用Process su = Runtime.getRuntime().exec("/system/xbin/su");报错java.io.IOException: Cannot run program "/system/xbin/su": error=13, Permission denied。
二、临时解决方法的操作流程(关机重启会失效)
1、插入usb,使用adb devices指令检查设备是否连接;
2、使用su命令进入root权限;
3、使用chmod命令打开对应串口权限chmod 666 /dev/ttyS1,我这里项目目前使用的/dev/ttyS1串口;
4、Process su = Runtime.getRuntime().exec(“/system/xbin/su”);在高版本上面已经不能直接获取到root权限了,这是需要进行以下操作(这里临时解决方案是使用adb工具,临时修改系统的参数设置):
adb root,查看是否能进入root权限;
adb shell setenforce 0
三、底层代码提升权限和关闭SELinux(永久解决)
修改代码路径:device/qcom/common/rootdir/etc/init.qcom.rc
system/core/init/selinux.cpp
--- a/device/qcom/common/rootdir/etc/init.qcom.rc
+++ b/device/qcom/common/rootdir/etc/init.qcom.rc
@@ -137,6 +137,9 @@ on boot
chmod 0660 /dev/ttyHS2
chown bluetooth bluetooth /dev/ttyHS2
+
+ chown system system /dev/ttyHS1
+ chmod 0666 /dev/ttyHS1
chown bluetooth net_bt /sys/class/rfkill/rfkill0/device/extldo
chmod 0660 /sys/class/rfkill/rfkill0/device/extldo
--- a/system/core/init/selinux.cpp
+++ b/system/core/init/selinux.cpp
@@ -90,7 +90,7 @@ namespace init {
namespace {
enum EnforcingStatus { SELINUX_PERMISSIVE, SELINUX_ENFORCING };
-
+#if 0
EnforcingStatus StatusFromCmdline() {
EnforcingStatus status = SELINUX_ENFORCING;
@@ -102,12 +102,16 @@ EnforcingStatus StatusFromCmdline() {
return status;
}
+#endif
bool IsEnforcing() {
+ #if 0
if (ALLOW_PERMISSIVE_SELINUX) {
return StatusFromCmdline() == SELINUX_ENFORCING;
}
return true;
+ #endif
+ return false;
}