You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 10及以上版本终端命令安装APK失败,求正确安装方法

Android 10+ 终端命令安装APK的可行方案

非Root设备:APP内无法直接执行pm install

Android 10及以上版本收紧了系统权限管控,普通第三方APP没有INSTALL_PACKAGES系统权限,直接通过Runtime.getRuntime().exec()调用pm install必然失败——这个命令只有系统签名应用或预装应用才能执行。

替代方案:使用系统PackageInstaller API

如果是APP内需要安装APK,必须用官方提供的PackageInstaller API,示例Kotlin代码如下:

val packageInstaller = packageManager.packageInstaller
val sessionParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
val sessionId = packageInstaller.createSession(sessionParams)
val session = packageInstaller.openSession(sessionId)

// 将私有目录下的APK写入安装会话
val apkFile = File(filesDir, "test.apk")
FileInputStream(apkFile).use { input ->
    session.openWrite("test.apk", 0, -1).use { output ->
        input.copyTo(output)
        session.fsync(output)
    }
}

// 提交安装请求,通过广播接收结果
val intent = Intent(this, InstallResultReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
    this,
    0,
    intent,
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
session.commit(pendingIntent.intentSender)
session.close()

配套的广播接收器用于处理安装结果:

class InstallResultReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        val status = intent?.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE)
        when (status) {
            PackageInstaller.STATUS_SUCCESS -> {
                // 处理安装成功逻辑
            }
            else -> {
                val errorMsg = intent?.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE)
                // 打印或展示错误信息
            }
        }
    }
}

别忘了在AndroidManifest.xml中注册接收器:

<receiver android:name=".InstallResultReceiver" />

Root设备:通过SU权限执行pm install

如果设备已Root,你可以借助su获取系统权限后执行安装命令,修改你的代码如下:

val cmd = "su -c pm install -t -r ${filesDir.absolutePath}/test.apk"
val process = Runtime.getRuntime().exec(cmd)
val exitCode = process.waitFor()

// 读取输出排查问题
val errorLog = process.errorStream.bufferedReader().readText()
val outputLog = process.inputStream.bufferedReader().readText()

if (exitCode == 0) {
    // 安装成功
} else {
    // 打印错误日志定位问题
    Log.e("InstallFail", "ExitCode: $exitCode, Error: $errorLog, Output: $outputLog")
}

注意:如果遇到文件权限问题,先给APK文件添加可读权限:

Runtime.getRuntime().exec("su -c chmod 644 ${filesDir.absolutePath}/test.apk")

ADB Shell环境下的安装命令

如果是通过ADB连接设备后在终端执行命令,直接用以下命令即可:

adb shell pm install -t -r /data/user/0/com.company.example/files/test.apk

如果出现权限报错,可以先把APK复制到外部存储再安装:

adb push test.apk /sdcard/
adb shell pm install -t -r /sdcard/test.apk

常见失败原因排查

  • 权限不足:普通APP无INSTALL_PACKAGES权限,必须用系统API或Root。
  • APK损坏:先用adb install测试APK是否能正常安装,排除文件本身问题。
  • 路径错误:确认APK绝对路径正确,Android 10+的存储沙箱限制其他应用访问你的私有目录,跨应用安装需先共享文件。
  • 未知应用权限:确保已开启「允许安装未知应用」权限(针对你的APP或全局,依系统版本而定)。

内容的提问来源于stack exchange,提问作者Murodjon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:06:25