【问题标题】:Android 7+ problem to install apk through "pm install..." using Runtime.getRuntime().exec from system appAndroid 7+ 使用系统应用程序中的 Runtime.getRuntime().exec 通过“pm install ...”安装 apk 的问题
【发布时间】:2021-03-11 11:20:52
【问题描述】:

我将 apk 安装到我的 Android 7.1.1 模拟器中的 /system/priv-app 文件夹中,因此它可以作为特权系统应用程序,但是当我尝试使用我的应用程序的此代码安装 apk 时

val runtime = Runtime.getRuntime()
val process = runtime.exec("pm install -r -f $apkFilePath")
process.waitFor()
val output = process.inputStream.bufferedReader().use { it.readText() }
val error = process.errorStream.bufferedReader().use { it.readText() }

在我得到的error 输出中

错误:java.lang.SecurityException:权限被拒绝: 来自 pm 命令的 runInstallCreate 要求以用户 -1 身份运行,但正在调用 来自用户 0;这需要 android.permission.INTERACT_ACROSS_USERS_FULL

我尝试在 Manifest 文件中添加权限

  <uses-permission
        android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
        android:protectionLevel="signatureOrSystem"
        tools:ignore="ProtectedPermissions"
        />

但仍然得到同样的错误。我什至尝试过

runtime.exec("pm install -r -f --user -1 $apkFilePath")

仍然报同样的错误

试试这段代码有什么有趣的地方

runtime.exec("pm install -r -f --user 0 $apkFilePath")

那么error 输出将变为NullPointerException

那么为什么INTERACT_ACROSS_USERS_FULL 权限不起作用而--user -1 也不起作用?我以为系统权限应用可以静默安装apk,那么问题出在哪里?

【问题讨论】:

  • 你找到解决办法了吗?

标签: android command-line-interface system android-permissions android-sdk-tools


【解决方案1】:

找到了一种方法来解决它在 root 设备上,系统级应用程序存在于 system/priv-app 中。 像这样使用 as su 安装应用程序。

val command = "pm install -r $pathToApk"

Runtime.getRuntime().exec(arrayOf("su", "-c", command))

【讨论】:

    猜你喜欢
    • 2018-02-12
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多