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
|
package com.taobao.model; public class Test { public String getHello( int a){ 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
|
import android.util.Log; import com.taobao.android.dexposed.DexposedBridge; import com.taobao.android.dexposed.XC_MethodReplacement; /** * Created by renxuan on 15/9/8. */ public class TestPatch implements IPatch { private static final String TAG= "TestPatch" ; @Override public void handlePatch( final PatchParam patchParam) throws Throwable { { 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 , new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { Log.e(TAG, "methodHookParam:" + methodHookParam.method.getName()); int methodArgsLength=methodHookParam.args.length; if (methodArgsLength> 0 ){ int a=( 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/ ...
随机推荐
- MJExtension使用
@字典转模型1基本用法// 将字典转为模型 Person *p = [Person mj_objectWithKeyValues:dict2]; // 将 plist数据转成模型数组 NSArrar ...
- Python3.X新特性之print和exec
print print 现在是一个函数,不再是一个语句.<语法更为清晰> 实例1 打开文件 log.txt 以便进行写入并将对象指定给 fid.然后利用 print将一个字符串重定向给文件 ...
- MYSQL常见错误及其解决方式
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- 转:PHP--获取响应头(Response Header)方法
转:http://blog.sina.com.cn/s/blog_5f54f0be0102uvxu.html PHP--获取响应头(Response Header)方法 方法一: ========== ...
- HTML5 WebSocket 实时推送信息测试demo
测试一下HTML5的websocket功能,实现了客户端→服务器实时推送信息到客户端,包括推送图片: websocket实现MessageInbound类 onTextMessage()/onBina ...
- ant sshexec 无法启动tomcat
1.如果./startup.sh启动不了,可以试试./catalina.sh run 2.这个两个都是调用的catalina里边的方法,只不过一个重定向了日志,一个没有 eval \"$_R ...
- RichTextBox文字处理控件属性介绍
RichTextBox控件是一种既能够输入文本. 又能够修改文本的文字处理控件, 与TextBox控件比较, RichTextBox控件的文字处理功用更加丰厚, 不只能够设定文字的色彩. 字体, 还具 ...
- iMacros 教程
imacros能记录你在网页中的动作,然后模拟你的动作自动重复执行.进阶应用主要在于两个方面: 1.用JS动态调用,重复执行之. 2.调用CSV文件,这个不错哦. 还可以调用数据库,这个没用过. 安装 ...
- 再议C++的性能
最近在公司里的项目做的是性能优化,相关性能调优的经验总结也在前一篇文章里说了.这里再说一说和性能相关的东西.主要针对的是C++类库中常用的一些数据结构,比方说std::string.顺序容器(vect ...
- Mytophome Deal
using AnfleCrawler.Common; using System; using System.Collections.Generic; using System.Linq; using ...