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
相关产品推荐
相关产品推荐

