自动更新程序源码
- 格式:docx
- 大小:13.89 KB
- 文档页数:1
Android应用程序的自动更新升级(自身升级、通过tomcat)刚入手android一个多月,因公司需要提交技术文档,才写了这个demo测试,想保存下来,以备后用!有什么不对的地方欢迎大家指正,这个示例也是参考了网上别人的demo自己做的。
Android应用程序的升级(自身升级)一、引言:很多的Android应用都具有版本检测和自动更新的功能,用户一键就可以完成软件的升级和更新。
Android应用程序的升级本质上是利用了Linux系统的软件包管理和安装机制,而对于上层这一功能的开发来说很容易,只需要我们开发人员利用Android自带的API就可以实现。
二、功能说明:1、本示例用来实现单个应用程序的自身升级2、程序启动时,连接tomcat7 web服务器进行版本的检测,若有新版本则提示更新3、将从web服务器下载的新版本的APK文件放到sdcard中4、监听新版本的APK应用是否安装完成,如果是,则将下载的apk文件从sdcard中删除三、程序框架流程:四、环境说明:1、服务器端:Ubuntu下的tomcat7web服务器,安装后默认端口是8080,Android模拟器访问时要将apk文件放到/var/lib/tomcat7/webapps/ROOT/目录下,Android模拟器的访问方式是http://10.0.2.2/NewAppSample.apk2、Android模拟器端的开发环境:Ubuntu+eclipse+ADT五、流程详解及关键点说明:(一) 新版本的应用程序(NewAppSample)准备:a) 新建一个android工程,编辑其版本代码为2,高于我们的旧版本用于更新测试,版本名称为1.0.1b) 编辑应用程序对应的版本信息文件version.json说明:后缀为json的文件是一种轻量级的数据交换格式,比xml要快很多,适合于小型数据的网络交换,其实质类似键值对,键用字符串的形式表示与其值用冒号隔开,能存储多种数据类型。
CAutoupdater通⽤⾃动升级组件源码CAutoupdater通⽤⾃动升级组件1、CAutoupdater通⽤⾃动升级组件介绍1.1、组件介绍C/S构的特点是能充分发挥客户端的处理能⼒,很多⼯作可以由客户端处理后再提交给服务器,对应的优点就是客户端响应速度快模式客户端以其强⼤的功能,丰富的表现⼒受到相当⼤部分⽤户的青睐,但是客户端布署,维护升级的成本却是⾮常的⾼的。
C/S客户端需要安装专⽤的客户端软件及运⾏环境。
⾸先涉及到安装的⼯作量,其次任何⼀台电脑出问题,如病毒、硬件损坏,都需要进⾏安装或维护。
特别是有很多分部或专卖店的情况,不是⼯作量的问题,⽽是路程的问题。
还有,系统软件升级时,每⼀台客户机需要重新安装,其维护和升级成本⾮常⾼。
CAutoupdater组件就是为了解决C/S在维护升级⽅⾯的问题⽽存在的,本组件可以快速建⽴升级部署应⽤,完全控制整个升级部署过程,全功能的、快速、易于使⽤,设⽴发布你的客户端应⽤。
本组件以最简单的模式提供给客户端在线布署和⾃动升级功能,彻底解决升级部署⽅⾯的后顾之忧。
组件中提供的的接⼝以最简单的⽅式来对升级过程提供完全控制。
CAutoupdater组件为你的软件集成稳定/⾼效的⾃动升级功能,是本升级组件的宗旨。
CAutoupdater组件四步完成升级⼯作:检查新版本、下载到临时⽬录、检查本地⽂件、拷贝到⼯作⽬录。
⽆需特被的服务器,传统的Web服务即可,如IIS等。
服务器部署最新版的软件⽂件(⽂件列表保存在⼀个XML⽂件中),CAutoupdater组件对⽐分析服务器和客户端的XML对⽐配置⽂件,不同就更新。
CAutoupdater组件采⽤C#语⾔编写,可应⽤于⽬前⼤多流⾏语⾔开发的软件之中,不依赖任何类库,稳定,⾼效。
2.2、CAutoupdater组件升级原理及过程。
2.2.1、CAutoupdater组件⼯作原理。
图2.1.1.1不必关⼼当前使⽤的版本图2.1.1.2对⽐分析服务端与客户端使⽤的软件版本2.2.2、服务端部署。
PB实现自动升级程序一、升级程序设计思路1.检测最新版本:升级程序需要从服务器端获取最新的版本信息,然后与本地已安装版本进行比较,判断是否需要升级。
3.备份文件:在进行升级之前,应备份所需升级的文件,以防意外发生时能够回滚到之前的版本。
5.提示升级完成:升级完成后,向用户显示升级完成的提示信息。
二、PB实现自动升级程序的步骤1.创建主窗口:在PB中创建一个主窗口,用于显示升级进度和完成提示信息。
2.创建数据库:使用PB内置的数据库工具,创建一个用于存储版本信息的数据库,包括版本号、更新链接等相关信息。
3.编写检测更新代码:创建一个检测更新的函数,该函数从服务器获取最新版本信息并与本地版本比较,判断是否需要升级。
可以使用PB内置的HTTP请求功能来获取服务器端的版本信息。
5.编写备份文件代码:在执行升级之前,编写备份文件的函数,将需要升级的文件备份到指定的目录,以便回滚。
7.编写完成提示代码:在升级完成后,编写完成提示的函数,通过消息框或对话框等方式向用户显示升级完成的提示信息。
8.编写自动升级流程代码:将上述函数按照实际需求进行组织和调用,实现自动升级的完整流程。
三、注意事项2.备份重要文件:在执行升级前应备份重要的文件,以防错误或异常情况导致升级失败时能够回滚到之前的版本。
3.用户提示信息:在升级过程中和升级完成后,应向用户显示相应的提示信息,以便用户了解升级进度和结果。
4.异常处理:在升级过程中,应加入异常处理机制,以捕获并处理可能出现的错误或异常情况,保证升级程序的稳定性和可靠性。
四、总结使用PB实现自动升级程序可以让用户更加方便地获取最新的软件或系统版本,提升用户体验。
通过上述步骤和详细说明,可以在PB中编写一个自动升级程序,实现软件或系统的自动升级功能。
在具体实施过程中,需要根据实际需求进行适当的调整和修改。
本文以小型应用的通用性自动更新程序,开发的程序可以直接拿过来使用,非常方便。
原理服务器端的结构是这样的:其工作原理如下:Update.asmx仅提供一个功能,就是检测是否需要更新,在需要更新的时候就返回一个更新地址,通常情况下返回的地址就是Download.ashx,而在某些特殊情况下,也可以修改服务端使之从其他Url提供更新下载。
检测是否需要更新的的具体做法是:首先获取Updata目录中的主程序版本号,再获取数据库中的最新版本号,两者对比。
如果相同则直接与客户端提供的版本号相对比并返回结果;如果不同则将主程序版本号写入数据库,然后生成新的更新文件包,直接向客户端返回更新地址。
Download.ashx的功能仅仅是将最新版本更新文件包输出。
而客户端部分包含主程序、Update.exe以及其他附属文件,更新时由主程序检测并下载更新,在主程序退出时,如有更新并已成功下载,则调用Update.exe完成解包及更新覆盖工作。
需注意的是:Update.exe永远不能被更新,因为它无法更新其自身,所以服务端更新时也不要将Update.exe纳入更新包。
下面就是来实际编写一个自动更新解决方案:服务器端首先建立一个Web服务项目,项目名为“自动更新服务”:添加一数据库,名为Database.mdf:在数据库中创建新的数据库关系图,并如下设计数据库表:创建一个 Entity Data Model,名为Model.edmx:从刚才的建立的数据库中生成模型:在Web.Config的appSettings节点中新增两个节点,用以设置更新程序的主文件名及更新包下载地址:<appSettings><add key="主程序文件名" value="MyApp.exe"/><add key="更新包下载地址" value="Download.ashx"/></appSettings>引入一个GZip类用以打包(该类的源码将在文章末尾随本文示例源代码一并提供):添加一个新的Web服务,名为Update.asmx:书写如下代码:[WebMethod]public string GetUpdate(string ClientVerison){if (获取最新版本() != ClientVerison){return System.Web.Configuration.WebConfigurationManager.AppSettings["更新包下载地址"];}return null;}static string 获取最新版本(){string v = 获取文件版本(HttpContext.Current.Server.MapPath(string.Format("~/App_Data/Update/{0}",System.Web.Configuration.WebConfigurationManager.AppSettings["主程序文件名"])));using (var c = new DatabaseEntities()){//从数据库取得最新版本信息var q = c.UpdateV ersion.OrderByDescending(f => f.PublicTime).FirstOrDefault();if (q == null || v != q.Version){//数据库中的版本与当前主程序版本不一致时,以主程序版本为准,写入数据库,并生成新的更新文件包var d = new UpdateVersion() { Version = v, PublicTime = DateTime.Now };c.AddToUpdateVersion(d);c.SaveChanges();打包更新文件(HttpContext.Current.Server.MapPath("~/App_Data/Update/"), HttpContext.Current.Server.MapPath("~/App_Data/Update.gzip"));}}return v;}public static void 打包更新文件(string 打包目录, string 输出文件){GZip.压缩(输出文件, Directory.GetFiles(打包目录).Concat(Directory.GetDirectories(打包目录)).ToArray());}public static string 获取文件版本(string 文件路径){FileVersionInfo f = FileVersionInfo.GetVersionInfo(文件路径);return f.FileVersion;}创建Download.ashx,用以输出更新文件包:代码:public void ProcessRequest(HttpContext context){context.Response.ContentType = "application/zip";context.Response.WriteFile(context.Server.MapPath("~/App_Data/Update.gzip"));}服务端至此就编写完毕了。
c#Winform程序⾃动更新实现⽅法Winform程序⾃动更新我也是第⼀次做,⽹上找了⾃动更新的源码,后来⼜根据在⽹上看到的⼀些⽅法,⾃⼰试了很久,最终还是有写错误,所以花了钱让别⼈帮忙调试成功的,下⾯是我⾃⼰捣腾出来的,⽅便⼤家借鉴,如果有什么错误的地⽅欢迎指正.1、由于我是通过服务器的IIS发布⾃动更新的,更新之前先⼿动把程序复制到IIS服务器的⽬录下⾯,做⼀些更改,客户端才能正常⾃动更新。
所以第⼀步是不熟IIS服务器(本⼈系统windows8):按照上⾯的⽅式,选了之后点确定,系统会⾃动添加这些内容,然后:⽹站建⽴好了之后,把写好的需要更新的⽂件放⼊你选的物理路径对应的⽂件⽬录下⾯就OK。
2、⽹站建⽴好了,那么下⾯就是要想办法搞更新了,也就是从服务器更新⽂件到客户端,⾄于具体的过程和中⼼思想我就不赘述了,⽹上很多。
3、⾃动源码下载地址找不着了,如果有需要的,请留邮箱,我再发.4、把⾃动源码⽣成类库,然后在你的主程序引⽤该类库,把下图的两个⽂件和你的主程序放在同⼀个⽂件夹下⾯:5、主程序的调⽤,在主程序⾥⾯调⽤我是放到登录窗体之前的,由于我没办法控制程序是否需要更新,所以我需要建⽴⼀个过程,就是在数据库建⽴⼀个表,包括两个字段如上图,New字段是保存最新的版本,Old是保存前⼀次的版本.。
using Mulaolao.Forms;using Mulaolao.Procedure;using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;using Mulaolao.Other;using System.Threading;using StudentMgr;using System.Data;using System.Data.Sql;using System.Data.SqlClient;namespace Mulaolao{static class Program{//private static Mutex mutex;/// <summary>/// 应⽤程序的主⼊⼝点。
c#如何实现⾃动更新程序⽬录主要功能介绍客户端main⽅法⼊⼝主窗体代码更新帮助类版本xml⽂件解析服务端版本xml⽂件⾃动升级服务Controller版本⽂件⾃动⽣成帮助类结语主要功能介绍实现⽂件的⾃动更新。
主要功能:1. ⽀持整包完全更新,即客户端只需输⼊⼀个服务器地址,即可下载所有⽂件。
2. ⽀持增量更新,即只更新指定的某⼏个⽂件。
3. ⽀持⾃动更新程序的更新更新界⾯如图:客户端main⽅法⼊⼝/// <summary>/// 应⽤程序的主⼊⼝点。
/// </summary>[STAThread]static void Main(){//在主程序中更新替换⾃动升级程序//ReplaceAutoUpgrade();bool isEnterMain = false;try{//设置默认更新地址,如果不设置,后⾯会从配置⽂件,或界⾯上进⾏设置UpgradeHelper.Instance.DefaultUrl = "http://localhost:17580";if (UpgradeHelper.Instance.Local_UpgradeModel != null){UpgradeHelper.Instance.UpgradeUrl = UpgradeHelper.Instance.Local_UpgradeModel.UpgradeUrl;}if (UpgradeHelper.Instance.WillUpgrades.Count == 0 && UpgradeHelper.Instance.Local_UpgradeModel != null){//没有待更新,并且本地版本信息⽂件不为空,则直接启动主程序bool isSucced = UpgradeHelper.StartRunMain(UpgradeHelper.Instance.Local_UpgradeModel.RunMain);if (isSucced){Application.Exit();}else{//清理版本信息以便重新检测版本UpgradeHelper.Instance.ClearUpgradeModel();isEnterMain = true;}}else{isEnterMain = true;}}catch (Exception ex){isEnterMain = true;MessageBox.Show("运⾏更新程序异常:\n" + ex.Message, "错误提⽰", MessageBoxButtons.OK, MessageBoxIcon.Error); }if (isEnterMain){//进⼊更新主界⾯Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new FrmUpdate());}}主窗体代码public partial class FrmUpdate: Form{/// <summary>/// 构造函数/// </summary>/// <param name="tempPath"></param>/// <param name="updateFiles"></param>public FrmUpdate(){InitializeComponent();}/// <summary>/// 窗体加载事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void FrmUpdate_Load(object sender, EventArgs e){try{//加载服务器地址txtHostUrl.Text = UpgradeHelper.Instance.UpgradeUrl;BeginUpgrade();}catch(Exception ex){Output("初始化异常:" + ex.Message);}}/// <summary>/// ⼿动更新/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void butBegin_Click(object sender, EventArgs e){try{if(string.IsNullOrWhiteSpace(txtHostUrl.Text)){Output("请先输⼊服务器地址!");return;}UpgradeHelper.Instance.UpgradeUrl = txtHostUrl.Text.Trim();//清理版本信息以便重新检测版本UpgradeHelper.Instance.ClearUpgradeModel();BeginUpgrade();}catch(Exception ex){Output("更新异常:" + ex.Message);}}private void BeginUpgrade(){try{if(string.IsNullOrWhiteSpace(UpgradeHelper.Instance.UpgradeUrl)){return;}if(!(UpgradeHelper.Instance.UpgradeUrl.StartsWith("http://") || UpgradeHelper.Instance.UpgradeUrl.StartsWith("https://"))) {Output("错误的服务器地址,地址必须以http://或者https://开头");return;}//判断是否有更新if(UpgradeHelper.Instance.WillUpgrades.Count > 0 && UpgradeHelper.Instance.Server_UpgradeModel != null){SetWinControl(false);//杀死主进程UpgradeHelper.KillProcess(UpgradeHelper.Instance.Server_UpgradeModel.RunMain);RunUpgrade(); //启动更新}}catch(Exception ex){Output("更新异常:" + ex.Message);}}/// <summary>/// 启动更新/// </summary>private void RunUpgrade(){//启动更新SetCaption(string.Format("共需更新⽂件{0}个,已更新0个。
Android实现APP⾃动更新功能现在⼀般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提⽰你有新版本需要更新。
该⼩程序实现的就是这个功能。
该⼩程序的特点是,当有更新时,会弹出⼀个提⽰框,点击确定,则在通知来创建⼀个进度条进⾏下载,点击取消,则取消更新。
以下是详细代码:1.创建布局⽂件notification_item.xml,⽤于在通知栏⽣成⼀个进度条和下载图标。
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:padding="3dp" ><ImageViewandroid:id="@+id/notificationImage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@android:drawable/stat_sys_download" /><TextViewandroid:id="@+id/notificationTitle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_toRightOf="@id/notificationImage"android:paddingLeft="6dp"android:textColor="#FF000000" /><TextViewandroid:id="@+id/notificationPercent"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/notificationImage"android:paddingTop="2dp"android:textColor="#FF000000" /><ProgressBarandroid:id="@+id/notificationProgress"style="@style/ProgressBarHorizontal_color"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@id/notificationTitle"android:layout_alignParentRight="true"android:layout_alignTop="@id/notificationPercent"android:layout_below="@id/notificationTitle"android:paddingLeft="6dp"android:paddingRight="3dp"android:paddingTop="2dp" /></RelativeLayout>2.创建AppContext类,该类继承⾃Application。
分享⾃⼰平时在⽹上收集的⼀些STM32源码,⼤家顶起哈!本帖部分附件需要少量⾦币,此⽬的是为了⿎励⼤家积极发帖,请⼤家见谅!3.2⼨真彩TFT液晶触摸屏,320*240像素,26万⾊,i8080 16位并⾏接⼝,带转接板及触控芯⽚,可以直接⽤AVR、51、PIC、dsPIC、ARM7、STM32等单⽚机驱动。
3.2TFT.rar (6.69 MB, 下载次数: 180, 售价: 2 ⾦币)⾮常不错的⼀款STM32开发板资料。
含原理图、⽤户⼿册、各类例程:USB虚拟串⼝、TFT显⽰例程、U盘例程、TCP通信、uCOS例程、MP3解码、步进电机例程等。
有KEIL和IAR两套例程。
Armfly-STM32-SCH-SoftDemo.rar (16.05 MB, 下载次数: 431, 售价: 2 ⾦币)uC/OS-II官⽅的stm32的移植,基于arm的Cortex M3-uC/OS-II。
Micrium-ST-uCOS-II-LCD-STM32.rar (2.43 MB, 下载次数: 379)花了近3个⽉的毕业设计的时间,直到前⼏天完成的基本运营。
论⽂繁忙过去⼏天中,第⼀次在地图上从现在使⽤的软件代码的⽅式。
STM32 RVMDK 。
某些功能,这个MP3播放: MP3播放功能,⽀持MP3/WAV/WMA/MIDI播放,⽀持快进,快退,歌词显⽰⽀持[第⼆⼗条:第⼆⼗条:⼆⼗] / [第XX : XX.XX ] / [第XX号:第XX号] ,以⽀持多话歌词共享标记收⾳机功能,并⽀持⾃动发现服务台, FM76 ? 1.08 ,⾃动存⼊台湾图⽚播放功能,⽀持16位, 24位, 32位,任何⼤⼩的BMP图⽚浏览,以及符合JPEG / JPG格式图⽚浏览(只要它是正确的格式,⼤⼩限制)。
1,温度计功能。
,传感器DS18B20的。
2,彩⾊灯功能。
3,功率放⼤器功能。
4,职能亿多年来在⽀持太阳,⽉球和节⽓周查看。
UpdateList.xml文件内容如下:
<?xml version="1.0" encoding="gb2312"?>
<AutoUpdater>
<description>Application autoUpdate</description>
<Updater>
<Url>http://10.0.5.98/SoftUpdate/</Url>
<LastUpdateTime>2005-09-05</LastUpdateTime>
</Updater>
<Application applicationId="ItemSoft">
<EntryPoint>ItemSoft.exe</EntryPoint>
<Location>.</Location>
<Version>1.0.0.0</Version>
</Application>
<Files>
<File Ver="1.0.0.0" Name="ItemSoft.exe" />
<File Ver="1.0.0.0" Name="Reports\test.txt"/>
<File Ver="1.0.0.0" Name="Interop.grproLib.dll"/>
<File Ver="1.0.0.0" Name="Reports\test.grf"/>
</Files>
</AutoUpdater>
说明:
<description></description>程序的描述;
<Url></Url>更新服务器地址,为一个虚拟目录或站点路径;
<EntryPoint></EntryPoint>需要更新主程序文件,为exe;
<Location>.</Location>需要更新主程序文件所在路径;
<Version>1.0.0.0</Version>主程序版本号;
<Files></Files>需要更新的文件列表;Ver:文件版本号,Name:文件名,包括路径(相对);
使用时,在更新服务器上新建Web虚拟目录或站点,然后将需要更新的文件与UpdateList.xml 放在上面;
本地将AutoUpdate.exe与UpdateList.xml放在主程序的根目录下。
本地UpdateList.xml中的版本号如果小于服务端,自动程序会自动下载所需要更新的文件。
本人的完整.Net打包程序下载中所带的项目中,就使用了此更新程序。