java - 如何获取 Android 应用程序的提升权限

标签 java android permissions root

问题:

我需要运行一些命令,这些命令需要 root 设备上的应用程序的更高权限。比方说,chmod 777或访问权限为 --w------- 的文件(如果权限为 --w-----w- 则可以工作,这意味着应用程序作为其他组运行)。

一些额外的细节:

  • 运行 Android API 18(无 SELinux)

我已经尝试过的事情:

1) 使用 su来自java:

来自 this帖子,我试过使用su在 Java 中是这样的:

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) 使用 setWritable()来自java:

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 下运行,就像我使用 ls -l 时一样。在我的 apk/system/app它给了我:

-rw-r--r-- root     root      1270817 2000-01-01 01:42 com.my.app.apk

6) 将应用签名为系统应用(不在 /system/app 中)

这是我尝试的最后一件事。

正在关注 these说明,我能够签署并安装该应用程序。我调用ps来自 adb shell检查它是否以 root 身份运行只是为了发现它在 u0_a38 下运行.

注意:即使在签名后安装为系统应用程序时,我也无法使用 android:sharedUserId="android.uid.shared" 安装该应用程序因为它给了我:Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE] .因此,作为系统应用签名的应用从 list 中省略了这一行。

7) 将签名的系统应用程序放入 /system/app

5 中的完全相同。

当我输入 ls -l/system/app我得到:

-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"不管错误

所以即使我无法使用 adb install 进行安装因为错误:Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]无论如何,我还是继续扣动了扳机。我用了adb push得到.apk进入/system/app然后手动将 native 库添加到 /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!

所以我假设有可能制造商提供的 key 可能不正确。我找到了他们here ,这是来自制造商网站的链接。

This可以追溯到一段时间以前,不确定它是否仍然相关。我犹豫要不要删除文件的那部分,但我很可能很快就会尝试删除。我看不出如何删除 android.uid.*****来自 packages.xml不会影响系统上已安装的应用。

结论:

除了使用新 key 重建之外,还有什么可以做的吗?或者这几乎就是一切?

最佳答案

我还不能发表评论,但我想知道您尝试在什么设备/操作系统上执行此操作。一些 4.4 之后的 Android 版本在 Enforcing 模式下有 SELinux,这会阻止你似乎想要做的一些操作。但是,如果您的设备已获得 root 权限(听起来确实如此),您可以在命令行中运行 su setenforce 0,这将使 SeLinux 进入许可模式并有望解决您的问题。

关于java - 如何获取 Android 应用程序的提升权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38064396/

相关文章:

android - 移除高程阴影而不移除高程本身

Symfony2 ACL 访问多个用户的多个对象

java - 不带变量的 switch case

java - 内存内部和整数作为输出?

崩溃后 Android 辅助功能服务不会重新启动

java - 将 Intent 发送到异步任务

linux - 将 yocto 中的默认 rootfs 文件权限更改为 750 而不是 755

c# - 在 UWP 中使用 Environment.SpecialFolder

java - 并发修改异常——设置数组元素

java - Spark 构建从 avro 生成 scala