Android Hotpatch系列之-项目介绍
给现实Android apk打补丁,不用强迫客户升级客户端,悄悄的就把bug修复了,程序猿再也不用被老大骂娘了。 客户端例子实现:https://github.com/fengcunhan/Hotpatch-Sample 服务器简易实现:https://github.com/fengcunhan/Hotpatch-SimpleServer
在手淘工作期间,内部有一套解决方案,给线上apk打补丁,直接修复bug,不用客户端升级,有严重线上bug,找到问题,写个patch,推上线就把问题解决了,用过的都说好。前段时间,他们终于把这套东西的Android端开源了,Dexposed,具体可以看详细的项目介绍。其功能就是可以加载类,替换原先apk里面某个类的方法,或者在方法之前,方法之后做些什么,比如在方法执行之前,修改传入方法的参数了,方法执行以后,修改方法的返回值,或者就是完全替换掉原先的方法。
项目里面有一个sample,介绍了如何加载一个外部apk包,然后替换宿主apk里面类的方法。其实这就已经完成了80%的工作了,我做的工作只是将Patch获取从本地加载改成了去服务器获取,以及添加了Patch apk的校验(md5和签名信息)。
Hotpatch的工作流程是:
1.实现一个从服务器端获取Patch信息的接口(上传本地客户端版本等信息,服务器好根据这些信息来判断是否有对应的Patch包),并将这个信息注入给HotpatchManager。
2.检测客户端是否可以支持。(Android L和Android M)目前都不支持,最低支持2.3
3.如果客户端支持,那就调用第一步注入的Patch包获取类,获取到对应的Patch信息。下载Patch apk文件。
4.校验。获取下载好的Patch apk md5签名信息和服务器给的Patch信息的md5值是否一样,然后还要校验Patch apk和宿主apk签名是否一致。加校验是为了防止Patch apk被篡改,如果load进去了一个第三方的Patch,那就是引狼入室了。一定不能去掉校验,不能去掉,不能去掉,重要的事情说三遍!!!
5.校验成功,就load Patch apk。
下面是贴代码时间:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | publicclassHotpatchManager {    privatestaticHotpatchManager INSTANCE=newHotpatchManager();    privateHotpatchManager() {    }    publicstaticHotpatchManager getInstance(IPatchInfoRequest request){        RequestManager.getInstance().setIPatchInfoRequest(request);        returnINSTANCE;    }    publicbooleaninit(finalContext ctx) {        booleanisSupport = DexposedBridge.canDexposed(ctx);        if(isSupport) {            newThread(newRunnable() {                @Override                publicvoidrun() {                    check(ctx);                }            }).start();        }        returnisSupport;    }    privatevoidcheck(finalContext ctx) {        RequestManager manager = RequestManager.getInstance();        manager.setIPatchInfoRequest(RequestManager.getInstance().getIPatchInfoRequest());        manager.reqeust(newRequestManager.OnRequestCallBackListener() {            @Override            publicvoidonRequest(finalPatchInfo info) {                if(null!= info) {                    String apkPath = Utils.getCacheApkFilePath(ctx, info.apkFileUrl);                    File file = newFile(apkPath);                    if(file.exists()) {                        loadPath(info, ctx, apkPath);                    } else{                        DownLoadManager.getInstance().downloadFile(ctx, info.apkFileUrl, newDownLoadManager.OnFileDownload() {                            @Override                            publicvoidfileDownload(String apkFilePath) {                                loadPath(info, ctx, apkFilePath);                            }                        });                    }                }            }        });    }    privatevoidloadPath(PatchInfo info, Context ctx, String apkFilePath) {        if(Utils.isSignEqual(ctx, apkFilePath) && TextUtils.equals(info.apkMd5, Utils.getMd5ByFile(newFile(apkFilePath)))) {            PatchMain.load(ctx, apkFilePath, null);        }    }} | 
已经提供了实现好的客户端和服务器例子。网址分别是:
客户端例子实现:https://github.com/fengcunhan/Hotpatch-Sample
服务器简易实现:https://github.com/fengcunhan/Hotpatch-SimpleServer
运行例子步骤:
1.修改 DefaultPatch类中的info.patchApkUrl 的url中的IP替换成你的服务器的IP,将代码部署到tomcat中。
2.导入Hotpatch-Sample中的工程到Android Studio中。
3.打开网址 http://服务器IP:服务器端口/PathServer,将patchsample下build/outputs/apk/app-debug.apk上传到服务器上面,一定不要改名字。
4.修改DefaultPatchInfoRequest 中的hostUrl的IP和端口为你的服务器端IP和端口。
5.运行dexposedexamples项目,点击 Check Hotpatch,如果出现 “The dialog is shown from patch apk”,恭喜你,成功运行了Demo。
Demo中的Patch只是很简单的一个例子,后续会碰到混淆的类怎么怎么写Patch之类的问题,这些都将在以后一一叙述。请大家关注这个Hotpatch系列。
Demo中服务器实现很渣渣。请服务器端大神不要喷,可以fork,不要fuck。
Android Hotpatch系列之-项目介绍的更多相关文章
- Android Hotpatch系列之-给release包打Patch
		在默认debug包里面,是不对class做混淆的,所以Patch编写相对简单,但是应用在发布的时候都是release包,会对代码做混淆,此时class name ,field name,method ... 
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
		[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ... 
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
		上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ... 
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
		本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ... 
- Android项目实战之高仿网易云音乐项目介绍
		这一节我们来讲解这个项目所用到的一些技术,以及一些实现的效果图,让大家对该项目有一个整体的认识,推荐大家收藏该文章,因为我们发布文章后会在该文章里面加入链接,这样大家找着就很方便. 目录 第1章 前期 ... 
- 一、VUE项目BaseCms系列文章:项目介绍与环境配置
		一.项目效果图预览: 二.项目介绍 基于 elementui 写一个自己的管理后台.这个系列文章的目的就是记录自己搭建整个管理后台的过程,希望能帮助到那些入门 vue + elementui 开发的小 ... 
- [转]Android Studio系列教程六--Gradle多渠道打包
		转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ... 
- Android Studio系列教程六--Gradle多渠道打包
		Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ... 
- Android Studio系列教程五--Gradle命令详解与导入第三方包
		Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ... 
随机推荐
- windows下的Nodejs及npm的安装、常用命令,Nodejs开发环境配置
			http://www.cnblogs.com/webstorm/p/5744942.html ***************************************** 第一步:下载Nodej ... 
- webwork
			代码结构,html页面引入两个js文件,work.js和main.js work.js (function () { onmessage = function (e) { var num = e.da ... 
- windows下面安装casperjs
			因为需要 就学习了一下casperjs,CasperJS是一个开源的导航脚本处理和测试工具,基于PhantomJS(前端自动化测试工具)编写.由于casperjs对PhantomJS的依赖性,所以需要 ... 
- Qt工程转化为Vs工程
			cmd中输入: qmake -tp vc XXX.pro 一般需要将qmake的路径配置到系统环境变量中去... 
- 关于extra加强延迟加载
			一对多和多对多关联的查询策略 lazy属性的另一个属性extra 加强延迟加载 表明采用增强延迟加载策略:在<set>元素配置lazy属性为"extra".增强延迟加载 ... 
- JavaScipt 源码解析 css选择器
			css1-css3提供了很多选择器,总得来说分为几大类: 群组选择器:逗号"," 简单选择器:ID,标签,类,属性,通配符 关系选择器:孩子,后代,兄弟,相邻 伪类选择器:动作伪类 ... 
- TabControl控件的DrawItem事件怎么注册
			只有DrawMode等于OwnerDrawFixed时,才会在绘制选项卡时发生DrawItem事件tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; 
- sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID
			转自:http://github.tiankonguse.com/blog/2014/12/03/sphinx-token-inverted-sort.html 外部排序 现在我们的背景是有16个已经 ... 
- Octopus系列之数据上传格式要求说明
			各个数据列要求 价格列:字符串类型[美元价格] 产品名字:可以支持"/"等字符 分类名字:去空格处理 不得包含"&"符号 主图:一定要有主图列 不为空 ... 
- JavaEE 7技术一览
			参见此文: https://my.oschina.net/Barudisshu/blog/334903 perfect 
