问题:
我需要从一个已经root的设备上的应用程序运行一些需要更高权限的命令,比如说chmod 777
或访问一个文件,其权限为--w-------
(如果权限为--w-----w-
,则可以工作,表示应用程序正在作为其他组运行)。
一些额外的细节:
- 运行Android API 18(没有SELinux)
我已经尝试过的事情:
1) 从Java中使用su
:
从这个帖子中,我尝试像下面这样在java中使用su
:
Process su = null;
try {
su = Runtime.getRuntime().exec("su");
su.getOutputStream().write("chmod 777 file\n".getBytes());
su.getOutputStream().write("exit\n".getBytes());
su.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (su != null) {
su.destroy();
}
}
没有任何错误被抛出,但是这个操作没有任何作用。 2) 从Java使用
setWritable()
方法:
boolean ret = file.setWritable(true, false);
这里,
ret = false
表示它失败了。
3) 使用RootTools库:
Command cmd = new Command(0, "chmod 202 /sys/class/gpio/export");
try {
RootShell.getShell(true).add(cmd);
} catch (Exception e) {
Log.d(TAG,e.getMessage());
}
运行此命令会出现:错误!权限被拒绝
4) 使用这个答案
使用类ExecuteAsRootBase
会得到:无法获得root权限或被用户拒绝
。
5) 将应用程序放置在/system/app
中
由于某种原因,仍然在此处作为u0_a38
运行!为了使其正常工作,我必须手动将库.so
放置在/system/libs
下。我还必须chmod 644
我的.apk
以允许它运行。我不太明白为什么我没有以root身份运行,因为当我在/system/app
上使用ls -l
查看我的apk
时,它给了我:
-rw-r--r-- root root 1270817 2000-01-01 01:42 com.my.app.apk
6) 将应用程序签署为系统应用程序(不在/system/app
中)
这是我尝试的最后一件事。
按照这些说明,我能够签署并安装该应用程序。我从adb shell
调用了ps
以检查它是否是以root身份运行,结果发现它是在u0_a38
下运行。
注意:即使在签名后将其安装为系统应用程序,我也无法使用android:sharedUserId="android.uid.shared"
安装应用程序,因为它会给我返回:Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]
。因此,签署为系统应用程序的应用程序已从清单中省略了此行。
/system/app
中
与5完全相同。
当我在/system/app
中输入ls -l
时,我得到:
-rw------- root root 1303459 2000-01-01 01:02 com.my.app.apk
然而,从应用程序内运行"id"
,我知道它实际上是以以下身份运行的:
uid=10038(u0_a38) gid=10038(u0_a38) groups=1015(sdcard_rw),1028(sdcard_r),50038(all_a38)
8) 设置android:sharedUserId="android.uid.system"
,无论是否出现错误
即使由于错误:Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]
,我仍然决定继续安装。我使用adb push
将.apk
文件放入/system/app
中,然后手动将本地库添加到/system/libs
中,重新启动设备以让系统卸载它。然后我在启动时遇到了这个错误:
W/PackageManager( 2652): Signature mismatch for shared user : SharedUserSetting{411d82d8 android.uid.system/1000}
D/PackageManager( 2652): No files in app dir /vendor/app
E/PackageManager( 2652): Package com.my.app has no signatures that match those in shared user android.uid.system; ignoring!
所以我假设制造商提供的密钥可能不正确。我在制造商网站找到了这里的密钥。
或者
这个是一段时间以前的内容,不确定现在是否仍然有用。我不想只是删除文件中的那部分,但很快我很可能会尝试这样做。我不知道从packages.xml
中删除android.uid.*****
不会对系统上已安装的应用产生影响。
结论:
除了使用新密钥重新构建,还有其他可以做的吗?还是这基本上就是全部内容了?
init.rc
以便在启动时添加这些命令,则启动映像将覆盖它。此外,它不会搜索其他脚本以在init.rc
之外的启动时运行。 - Stephan GMsu
检查id
。至于安装和重新挂载,我必须将其用作将我的 apk 移动到/system/app
的步骤。从adb root shell
修改文件权限不需要重新挂载,也不是永久性的。 - Stephan GMuid=10038(u0_a38) gid=10038(u0_a38) groups=1015(sdcard_rw),1028(sdcard_r),50038(all_a38)
。但是调用su "id"
则没有任何返回。 - Stephan GM