Android Hotpatch系列之-项目介绍

在手淘工作期间,内部有一套解决方案,给线上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。

下面是贴代码时间:

public class HotpatchManager {
    private static HotpatchManager INSTANCE=new HotpatchManager();
    private HotpatchManager() {

    }

    public static HotpatchManager getInstance(IPatchInfoRequest request){
        RequestManager.getInstance().setIPatchInfoRequest(request);
        return INSTANCE;
    }

    public boolean init(final Context ctx) {
        boolean isSupport = DexposedBridge.canDexposed(ctx);
        if (isSupport) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    check(ctx);
                }
            }).start();
        }
        return isSupport;
    }

    private  void check(final Context ctx) {
        RequestManager manager = RequestManager.getInstance();
        manager.setIPatchInfoRequest(RequestManager.getInstance().getIPatchInfoRequest());
        manager.reqeust(new RequestManager.OnRequestCallBackListener() {
            @Override
            public void onRequest(final PatchInfo info) {
                if (null != info) {
                    String apkPath = Utils.getCacheApkFilePath(ctx, info.apkFileUrl);
                    File file = new File(apkPath);
                    if (file.exists()) {
                        loadPath(info, ctx, apkPath);
                    } else {
                        DownLoadManager.getInstance().downloadFile(ctx, info.apkFileUrl, new DownLoadManager.OnFileDownload() {
                            @Override
                            public void fileDownload(String apkFilePath) {
                                loadPath(info, ctx, apkFilePath);
                            }
                        });
                    }
                }
            }
        });
    }

    private  void loadPath(PatchInfo info, Context ctx, String apkFilePath) {
        if (Utils.isSignEqual(ctx, apkFilePath) && TextUtils.equals(info.apkMd5, Utils.getMd5ByFile(new File(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。

时间: 2024-10-13 10:50:09

Android Hotpatch系列之-项目介绍的相关文章

Android RakNet 系列之一 项目介绍

简介 项目对通讯要求越来越高了,为了满足新的需求开始研究RakNet在Android平台的应用,本篇是第一篇,熟悉RakNet的各个功能和插件. RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务.通常情况下用于游戏,但也可以用于其它项目. RakNet致力于网络和网络相关服务的游戏引擎.不仅包含了网络通信,也包括游戏级别复制,补丁升级,NAT穿透,和语音聊天.RakNet可以用于任何的应用,且可以与其他任何使用了RakNet的系统通信,不

Android Hotpatch系列之-给release包打Patch

在默认debug包里面,是不对class做混淆的,所以Patch编写相对简单,但是应用在发布的时候都是release包,会对代码做混淆,此时class name ,field name,method name都会被混淆,这个时候改如何编写Patch? 在打release包时,在build/outputs/mapping/release/下面有mapping.txt,这个里面记录了混淆以前的类和混淆以后的类的一一对应关系(所以叫mapping.txt),所以每次发版以后要保留好mapping.tx

C#程序员学习Android开发系列之Android项目的目录结构

今天开始正式学习Android开发的种种细节,首先从最基本的概念和操作学起. 首先看一下Android项目的目录结构. 这是我随便建立的一个test项目,我们重点关注一下几个方面的内容: 1.src目录:存放java源代码的目录,里面建立一个包,包里面有4个java源文件(分别都继承自Activity).由于java要求比较严格,因此要求类名与文件名一致. gen(Generated Java Files)目录:自动产生Java源文件的目录,是由工具自动生成的,一般不需要自己修改.里面主要有一个

【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源热更新 Android热更新开源项目Tinker源码解析系类之三:so热更新 转载请标明本文来源:http://www.cnblogs

上门洗车APP --- Android客户端开发 之 项目结构介绍

上门洗车APP --- Android客户端开发 之 项目结构介绍 前言 虽然公司项目较紧,但还是抽出时间给大家继续更新.     o_O"~ 感谢大家的关注,很高兴和大家共同学习.前面给大家分享了项目中的以下内容: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二) 之前有很多朋友私信过来说想打包一份源码学习,由于本项目也是还

【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 Android热更新开源项目Tinker源码解析系类之三:so文件热更新 转载请标明本文来源:http://www.cnblogs.com/yyangblog/p/6252855.html更多内容欢迎star作者的github:https://github.com/LaurenceYang/artic

一、BaseCms系列文章:项目介绍与环境配置

一.项目效果图预览: 二.项目介绍 基于 elementui 写一个自己的管理后台.这个系列文章的目的就是记录自己搭建整个管理后台的过程,希望能帮助到那些入门 vue + elementui 开发的小伙伴.之前有写过一个很简洁的版本,但觉得那个版本太粗糙,也没有相关的搭建过程讲解,学习意义不大.所以这个版本相当于对之前版本的升级和补充.那么项目中涉及到的知识点有哪些呢? 1. elementui 常用组件的使用和细节 2. axios 的封装及使用 3. vuex 的使用和模块化 4. 动态菜单

Apache顶级项目介绍系列1-概览

我们希望开始介绍一整套精华Apache TLP顶级项目介绍,包括Kafka, Zookepper, Hadoop, Spark, HBase etc.   公众号:技术极客TechBooster

K2工作流学习系列(五)--- K2实战之项目介绍

本文参考官网文档http://help.k2.com/onlinehelp/K2smartforms/UserGuide/1.0.7/default.htm#College_Application_and_Approval_Overview.html%3FTocPath%3DTutorials%7CCollege%20Application%20and%20Approval%20Overview%7C_____0.对于官网的实例我前后学习并照样操作了三遍,基本上明白了一些步骤的意义.本文项目及图