月出惊弓鸟的博客

对之前做的OTA系统升级项目做一个总结,包括4个部分:OTA系统的介绍,OTA包的制作,代码结构以及待改善的问题。

1. OTA介绍:

OTA 全称 over the air ,

2. OTA包的制作:

完整包就是变异整个系统生成的OTA包,大小可能在几百M左右,但是它相对于OTA差分包来说更加的稳定,差分包体积比较小,升级比较方便,这个就看用户自己的选择。在linux下,完整包的生成方法是:make clean; make; make otapackage; 之后会在out/target/product/torsby 生成一个zip包:vargo_torsby-ota.zip,这就是一个完整包可以直接拿去升级。同时,也在out/target/product/torsby/obj/PACKAGING/target_files_intermediates这个目录生成一个用来编译差分包的包,我们可以先重命名为old.zip,然后把第二次的包命名为new.zip, 接下来就可以来生成差分包,在 build/tools/releasetools 目录下有个ota_from_target_files的系统自带脚本,在linux下:./build/tools/releasetools/ota_from_target_files -i ~/old.zip ~/new.zip ~/update.zip,就会在当前目录生成update.zip的差分包 , 注意要把两个ota包放在当前目录执行这句命令。那么这里的update.zip差分包必须在old.zip这个系统上升级,才能到new.zip这个版本。

3. 项目结构:

整个项目的的功能是用户从设置进入系统升级后,会自动请求服务器检查是否有版本需要更新,如果没有则进入一个提示界面:您的系统已经是最新!如果不是最新系统,那么会在界面显示当前系统版本号和最新的系统版本号,以及更多里面的版本更新日志,用户点击立即安装就会进入一个版本列表,上面是服务器返回的所有可更细版本,选择一个版本就可以进行安装更新。

代码的核心类就是 IradarUpdateSystemFragment.class, 他继承自PreferenceFragment 是为了和设置Settings的UI设计保持同步,然后它归属于IradarUpdateSystemActivity,所以真正的代码实现就在这个fragment中。在onCreate()方法中,首先进行actionBar和Preference的初始化,紧接着使用公司自己封装的网络框架RequestManager 来请求服务器获得最新版本,在这里要注意一点: 在使用RequestManager请求服务器之前要先初始化:

Options opts = new Options.Builder().enableNet().enablePush().build();VargoHelper.Init(this,opts); 我把这个初始化放在自定义的OTAApplication中,但是为了保险起见还在等初始化一段时间后在调用RequestManager的请求方法,于是用handler来控制一下定时执行,300ms后再请求。整个请求过程用json传递数据,请求参数是getDeviceData()来获得,主要是当前的版本号和当前机器的DeviceId, RequestManager的使用不再累述使用大小功能号来请求服务器,同时绑定ResponseListener来获得请求结果,在onReceived()中拿到Response就是我们要的结果,而在其他几个方法中就是一些错误返回等等,我们也可以给出一些UI提示。这里要说明的就是: RequestManager已经被特殊处理,可以直接在UI线程中调用,并且可以直接在结果中更新UI,我没有用handler。 responseCode这个参数就是来区分是否有版本更新,如果有更新的话就会把结果传到updatePreference()来更新我们的界面。

在这里还有一个就是”了解更多“这个Preference,是用来看更新日志的:点击后跳转到UpdateLogActivity, 他是一个窗口Activity的实现,用WebView.loadUrl()的方法加载一份更新日志。

那么界面更新完成之后,假如当前有版本可以更新,用户点击现在安装就会弹出一个版本列表,在此之前会有一个WIFI和电量判断,我们规定是必须连接WIFI并且电量不低于50%的情况下才能继续更新,检查WIFI是否开启的代码:

// 检查当前网络是否为WIFIprivate Boolean isWifiNet(){ ConnectivityManager connectionManager = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo(); if(networkInfo==null){return false; } else{String netState = networkInfo.getTypeName();if(netState.equals("WIFI")){return true;}else return false; }}检查当前电量是否低于50%的代码: // 直接获取现在的电量private boolean getBattery(){String s = "";boolean isOk = false;try {fr = new FileReader(file);BufferedReader br = new BufferedReader(fr);if((s=br.readLine())!=null){if(Integer.parseInt(s)>49){isOk = true;Log.d(LOG_TAG, "当前电量是>>>>>>>>>"+s);}else{isOk = false;}}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return isOk;} 在这里说明一点: 获取电量的常规方法是绑定一个广播,在电量变化时会接到ACTION_BATTERY_CHANGED 的系统广播,但这个存在的问题就是没有即时性,用户点击按钮后就应该获取到广播,因此采用上面的方法:在android系统中 这个文件"/sys/class/power_supply/battery/capacity" 其实就存放了当前电量,直接new File()把它读出来!一个有信念者所开发出的力量,大于99个只有兴趣者。

月出惊弓鸟的博客

相关文章:

你感兴趣的文章:

标签云: