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.txt文件,以便以后编写Patch。
在https://github.com/fengcunhan/Hotpatch-Sample项目中的dexposedexamples,下面新定义了一个Test类:
| 1 2 3 4 5 6 7 8 9 10 11 | packagecom.taobao.model;publicclassTest {    publicString getHello(inta){        if(a==0){            return"PatchSuccess";        }        return"hello";    }} | 
这个类在TestFragment中使用到,发了版本以后,发现需要将业务的逻辑改成a<=0都返回PatchSuccess,然后就坑爹了,只能发布一个Patch来做这个事情,有两种Patch编写方式都可以达到上述目的。
1.XC_MethodHook 中重写beforeHookedMethod方法,在这个里面修改传入方法的参数,如果a<0,那就设置a==0,不用改变原先方法的逻辑,就可以达成目的。
2.替换原先方法。XC_MethodReplacement,重写 replaceHookedMethod 方法,在这个方法中实现你想要的逻辑。
下面以第二种方式来编写例子。编写Patch,要替换Test类中的getHello()方法,首先要找到release包下面Test类,然后替换掉getHello方法。在mapping.txt文件中找到了Test类以及对应混淆后的新类名和方法名:
| 1 2 | com.taobao.model.Test -> com.taobao.a.a://类混淆了    java.lang.String getHello(int) -> a //方法名也混淆了 | 
TestPatch编写如下:
| 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 | importandroid.util.Log;importcom.taobao.android.dexposed.DexposedBridge;importcom.taobao.android.dexposed.XC_MethodReplacement;/** * Created by renxuan on 15/9/8. */publicclassTestPatch implementsIPatch {    privatestaticfinalString TAG="TestPatch";    @Override    publicvoidhandlePatch(finalPatchParam patchParam) throwsThrowable {        {            Class<?> cls = null;            try{            //根据混淆以后的类来找到想要Patch的class                cls= patchParam.context.getClass().getClassLoader().loadClass("com.taobao.a.a");            } catch(Exception e) {                e.printStackTrace();                return;            }            Log.e(TAG, "cls:"+ cls);            /**             * 修改逻辑,原先是==0的时候返回Patch success,现在改成<=0都是返回Patch Success             *注意添加的int.class,因为getHello是有参数的,如果没有传int.class,是找不到对应方法的。不知道为什么的人,可以去看看反射先             * */            DexposedBridge.findAndHookMethod(cls, "a",int.class,newXC_MethodReplacement() {                @Override                protectedObject replaceHookedMethod(MethodHookParam methodHookParam) throwsThrowable {                    Log.e(TAG, "methodHookParam:"+ methodHookParam.method.getName());                    intmethodArgsLength=methodHookParam.args.length;                    if(methodArgsLength>0){                        inta=(int)methodHookParam.args[0];                        if(a<=0){                            return"PatchSuccess";                        }                    }                    return"hello";                }            });        }    }} | 
注意:
1.如果是在debug下测试,因为Test class没有混淆,Patch包这边的类名就应该是com.taobao.model.Test,方法名也应该还是getHello。
2.release包的签名一定要和patch的签名一样(线上情况),如果没有这个检测,那你的应用就很不安全,恶意攻击者可以随意load一个Patch进去,后果不可想象。
3.有问题可以加入Hotpatch QQ群:254384686
Android Hotpatch系列之-给release包打Patch的更多相关文章
- Android Hotpatch系列之-项目介绍
		给现实Android apk打补丁,不用强迫客户升级客户端,悄悄的就把bug修复了,程序猿再也不用被老大骂娘了. 客户端例子实现:https://github.com/fengcunhan/Hotpa ... 
- Android Studio系列教程五--Gradle命令详解与导入第三方包
		Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ... 
- Android Studio 生成aar包,并非debug包,而是release包
		1.编写Module,作为library 下面是需要发布的aar包,上面的是随意的project 2.app依赖myLibrary 2.1 设置Project Structure 2.2 app依赖M ... 
- [转]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基础 2014 年 12 月 18 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang ... 
- android studio 使用gradle 导出jar包,并打包assets目录
		警告:本文年久失修. 随着android studio的升级 ,gradle的升级,严格按照本文的代码去做可能不会成功,希望依然可以作为解决问题的思路. 最近项目在做一个sdk,供别的开发者使用,所以 ... 
- Android学习系列(37)--App调试内存泄露之Context篇(下)
		接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ... 
- Android Studio系列教程三--快捷键
		Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ... 
随机推荐
- (六)makefile编程
			最简单的makefile: all: gcc server.c -o ser gcc client.c -o cli clear: rm ser cli *.o -rf #rm -rf表示删除文件 ... 
- selenium eclipse环境搭建
			1.python 3.5下载及安装 2.setuptools 与pip 下载地址是:http://pypi.Python.org/pypi/setuptools http://pypi.Python. ... 
- SAP模块常用增强总结{转载}
			MM模块: 采购订单增强: BADI :ME_GUI_PO_CUST ME_PROCESS_PO_CUST 物料凭证增强: BADI:MB_DOCUMENT_BADI USER-EXIT:MBCF00 ... 
- Android中Webview使用自定义的javascript进行回调
			先说为什么需要讨论这个问题. 现在很多的手机应用,都可能会直接嵌入一个web页面.这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端:另一个是功能通用,不仅a ... 
- 转-Android仿微信气泡聊天界面设计
			微信的气泡聊天是仿iPhone自带短信而设计出来的,不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo,给大家分享一下!效果图如下: 气泡聊天最终要的是素材,要用到9.png文件的素材,这样气 ... 
- 第一个Android程序
			MainActivity.java package com.example.crystalball; import android.support.v4.app.Fragment; import an ... 
- OC语言description方法和sel
			OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象 ... 
- 1410. Crack
			http://acm.timus.ru/problem.aspx?space=1&num=1410 题目倒是不难,水题DP 就是题意理解起来有点困难,意思就是给你一段话,提取里面的单词 单词有 ... 
- QT快速使用ntohs
			QT快速使用ntohs,需要注意3点:1. ntohs只是转换相邻的2个字节2. 引入头文件#include <windows.h>3. 需要加上win32{LIBS+=-lws2_32} ... 
- PowerMock遇到的问题——5
			在做单元测试时,有时在一个方法中会调用这个类的其他私有方法,那么如何指定这些方法的返回值呢? 解决方法:用 createPartialMock 具体用法如下: TestClass test=Power ... 
