一、背景
因公司有智慧社区相关的业务,有开发Android门禁机设备上的应用,同时门禁项目分布在各个省份和城市,公司在很多城市根本没有运维支持人员,针对项目上不断更新的需求,后期的应用修改和更新就是一个大问题。并且第一款门禁设备我们选的是某大厂的硬件(Android5.0系统,全触屏)
二、设计思路
后台使用设备序列号标识每一台设备,设备使用设备序列号登录,获取相关用户信息,登录成功后订阅MQ消息,同时开启心跳(30s--60s一次),平台可以上传apk更新包,上传完成的更新包可以选择推送的设备,开启推送,然后后台就会推送一条MQ消息给设备(包含更新包版本信息、下载地址等),设备收到更新的MQ消息后,先通过更新包的地址下载更新包到本地,同时监听下载状态,下载完成后直接安装更新包,并且安装完成重启一下设备即可。
三、开发设计
由于基本的MQ消息监听和接收、安装包的下载都不存在什么问题,所以主要问题就成为设备下载更新包完成后的自动安装以及重启的问题。由于设备是Android5.0的系统,并且是某大厂,能够提供系统级别的签名,以便应用获取高级别权限(安装、重启等),所以也并未遇到太多障碍。因为设备是Android5.0的系统,所以只是针对Android5.0的设备做了验证测试,Android7.0+等设备可能需要其他的方法,不过思路应该差不多。
大致步骤如下:
1、首先获取设备方提供的系统级签名
2、AndroidManifest.xml中添加如下:
android:sharedUserId="android.uid.system"
3、应用添加需要的权限
<uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.DELETE_PACKAGES" /> <uses-permission android:name="android.permission.RESTART_PACKAGES" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.REBOOT" />
4、安装应用
try { process = new ProcessBuilder("pm", "install", "-i", 应用包名, "-r", apkPath).start(); } catch (Exception e) { }
5、监听应用安装完成并重启应用
public class UpdateRestartReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if ("android.intent.action.PACKAGE_REPLACED".equals(intent.getAction())) { Intent newIntent= new Intent(context, WelcomeActivity.class); newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(newIntent); } } }
6、测试以及优化了
测试没有什么问题,如果需要优化的话那后续还有很多要做,例如下载的优化,断网重连后继续下载等。当然因为这个
总结,通过这个项目大致了解了设备远程升级的使用场景、实际实现方法等。