【发布时间】:2016-06-27 22:47:27
【问题描述】:
问题:
我需要从 root 设备上的应用程序运行一些需要更高权限的命令。例如,chmod 777 或访问权限为--w------- 的文件(如果权限为--w-----w- 表示应用程序正在作为其他组运行,则可以使用)。
一些额外的细节:
- 运行 Android API 18(无 SELinux)
我已经尝试过的事情:
1) 在java中使用su:
来自this 的帖子,我曾尝试在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());
}
运行它给我:Error! Permission denied
4) 使用this 回答
使用 ExecuteAsRootBase 类我得到:Can't get root access or denied by user。
5) 将应用置于/system/app
由于某种原因,这里仍然以u0_a38 运行!为了让它工作,我不得不手动将库.so 放在/system/libs 下。我还必须chmod 644 我的.apk 才能让它运行。我真的不明白为什么我没有在 root 下运行,因为当我在 apk 在 /system/app 上使用 ls -l 时,它给了我:
-rw-r--r-- root root 1270817 2000-01-01 01:42 com.my.app.apk
6) 将应用签名为系统应用(不在/system/app 中)
这是我尝试的最后一件事。
按照these 的说明,我能够签署并安装该应用程序。我从adb shell 调用ps 来检查它是否以root 身份运行,结果发现它在u0_a38 下运行。
注意:即使在签名后作为系统应用程序安装时,我也无法使用android:sharedUserId="android.uid.shared" 安装应用程序,因为它给了我:Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]。因此,作为系统应用签名的应用在清单中省略了这一行。
7) 将签名的系统应用程序放在/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 install 进行此安装,我还是继续扣动了扳机。我使用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!
所以我假设制造商提供的密钥可能不是正确的。我找到了他们here,这是制造商网站的链接。
或
This 可以追溯到一段时间,不确定它是否仍然相关。我很犹豫是否要删除文件的那部分,但我很可能很快就会尝试它。我看不出从packages.xml 中删除android.uid.***** 不会影响系统上已安装的应用程序。
结论:
除了用新密钥重建之外,还有什么可以做的吗?或者这几乎就是一切?
【问题讨论】:
标签: java android permissions root