如何实现机器人Android应用无交互自动APK更新?
问题:Android应用自动更新如何实现无用户交互自动安装?
我正在开发一款机器人Android应用,已添加自动更新应用的类,新版本APK从机器人所在的本地服务器获取。下载APK到设备存储后执行如下代码:
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); final Context context = this.context.get(); Uri apkUri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", apkFile); intent.setData(apkUri); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent);
此时会弹出需用户选择「取消(CANCEL)」或「安装(INSTALL)」的窗口,请问是否有无需用户点击即可自动执行安装的方法?
回答
Android系统出于安全和用户权限的考虑,普通非Root、非系统签名的应用无法绕过用户确认直接自动安装APK,但以下几种特定场景下可以实现无交互安装:
Root权限场景
若设备已获取Root权限,可通过执行Shell命令完成静默安装,示例代码如下:String cmd = "pm install -r " + apkFile.getAbsolutePath(); try { Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes(cmd + "\n"); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); }注意:该方式依赖设备Root权限,不同ROM的Root环境可能存在兼容性问题,且Root会带来设备安全风险。
系统签名应用场景
若你的应用是系统级应用(拥有系统签名,预装在/system/app或/priv-app目录下),可申请INSTALL_PACKAGES权限,通过PackageManager API实现静默安装:
首先在AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.INSTALL_PACKAGES" />然后使用以下代码执行安装:
PackageManager packageManager = context.getPackageManager(); PackageInstaller packageInstaller = packageManager.getPackageInstaller(); PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); int sessionId = packageInstaller.createSession(params); PackageInstaller.Session session = packageInstaller.openSession(sessionId); // 将APK写入安装会话 OutputStream outputStream = session.openWrite("apk", 0, -1); FileInputStream inputStream = new FileInputStream(apkFile); byte[] buffer = new byte[1024 * 1024]; int length; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } session.fsync(outputStream); inputStream.close(); outputStream.close(); // 提交安装请求 Intent intent = new Intent(context, InstallResultReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); session.commit(pendingIntent.getIntentSender()); session.close();注意:
INSTALL_PACKAGES是系统级权限,普通第三方应用无法通过常规渠道获取,必须拥有系统签名才能使用。企业设备管理(MDM)场景
若应用属于企业移动管理(MDM)解决方案的一部分,可通过Android的设备所有者权限或配置文件所有者权限获取静默安装能力,该方式适用于企业批量管理的设备,需通过特定的设备激活流程获取权限。
内容的提问来源于stack exchange,提问作者Mohamad Ghaith Alzin
相关产品推荐
相关产品推荐

