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

已Root的RK3288 Android5.1平板插入存储设备时如何自动安装APK

RK3288 Android5.1 Root环境下U盘插入自动安装APK落地方案

不用走adb shell触发的弯路,adb依赖调试开关、授权状态,量产场景不可控,直接用系统广播监听+Root静默安装的方案即可,全流程无需用户操作。

核心实现逻辑

  • 监听系统存储挂载完成广播,精准获取U盘挂载路径
  • 扫描U盘内符合指定规则的APK安装包,做版本校验避免重复降级安装
  • 调用Root权限执行系统pm命令完成静默安装,无弹窗无交互

具体实现步骤

1. 配置广播监听

如果是量产固件,直接把监听程序打包成轻量APK内置到/system/app分区,权限默认全开,无需用户手动授权。在AndroidManifest.xml中注册静态广播接收器,无需额外保活,系统挂载完存储会自动唤起:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

<receiver android:name=".UsbMountReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <data android:scheme="file" />
    </intent-filter>
</receiver>

不要监听MEDIA_CHECKING广播,该广播触发时U盘还未完成挂载,读取文件会直接报错。

2. 广播接收后扫描目标APK

在接收器中从广播参数直接读取系统返回的U盘真实挂载路径,不要硬编码RK3288的U盘挂载节点,不同定制固件的挂载路径可能存在差异:

public class UsbMountReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (!Intent.ACTION_MEDIA_MOUNTED.equals(intent.getAction())) return;
        // 获取系统返回的U盘挂载根路径
        String usbMountPath = intent.getData().getPath();
        File usbRoot = new File(usbMountPath);
        // 筛选符合命名规则的APK,避免误装U盘中其他无关安装包
        File[] apkFiles = usbRoot.listFiles(new FileFilter() {
            @Override
            public boolean accept(File file) {
                return file.isFile() && file.getName().endsWith(".apk") 
                        && file.getName().startsWith("deploy_"); // 约定U盘中的安装包以deploy_开头命名
            }
        });
        if (apkFiles == null || apkFiles.length == 0) return;
        // 取最新修改的APK作为待安装包
        File targetApk = apkFiles[0];
        for (File apk : apkFiles) {
            if (apk.lastModified() > targetApk.lastModified()) targetApk = apk;
        }
        // 版本校验,待安装包版本高于当前已安装版本才执行安装
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo apkInfo = pm.getPackageArchiveInfo(targetApk.getAbsolutePath(), 0);
            PackageInfo installedInfo = null;
            try {
                installedInfo = pm.getPackageInfo(apkInfo.packageName, 0);
            } catch (PackageManager.NameNotFoundException e) {
                // 未安装过该应用,直接走安装流程
            }
            if (installedInfo != null && apkInfo.versionCode <= installedInfo.versionCode) return;
            // 执行Root静默安装
            silentInstall(targetApk.getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. Root静默安装实现

Android5.1下直接通过su权限调用系统pm命令即可完成无交互安装,不需要依赖adb环境:

private void silentInstall(String apkAbsolutePath) {
    Process suProcess = null;
    DataOutputStream cmdStream = null;
    try {
        suProcess = Runtime.getRuntime().exec("su");
        cmdStream = new DataOutputStream(suProcess.getOutputStream());
        // -r参数表示覆盖安装,适配已存在旧版本的场景
        String installCmd = "pm install -r " + apkAbsolutePath + "\n";
        cmdStream.writeBytes(installCmd);
        cmdStream.flush();
        cmdStream.writeBytes("exit\n");
        cmdStream.flush();
        suProcess.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // 自行补充流关闭逻辑
    }
}

RK3288量产适配注意事项

  • 部分RK3288定制固件默认关闭了第三方应用接收MEDIA_MOUNTED广播的权限,把监听APK内置到system分区即可绕过该限制
  • 可以在安装完成后增加3秒延时,删除U盘中的安装包,避免下次插入重复触发安装
  • 全新部署场景下,不需要客户做任何操作,只要把存了符合命名规则APK的U盘插在平板上,开机后系统自动完成安装

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:27:47