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

