关于热修复框架nuwa的使用
from : http://blog.csdn.net/frank_andriod/article/details/51385221
最近看了几篇博文,大概的了解了一下热修复,关于原理,鸿洋有篇博客写的很好,基于QQ空间团队的思路,nuwa这个开源框架在github上的star稍多一点。然后我就试着把这个框架导入到我的项目中,模拟实现热修复。关于我用来模拟的工程(其实也是模仿鸿洋的一个自定义控件的项目),已经上传到github,下载地址附在文末.欢迎下载
1,在你工程的build.gradle中添加classpath,注意要修改你项目的gradle版本,改成“com.Android.tools.build:gradle:1.2.3”,因为版本要一致,不然会报错
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">dependencies {classpath <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'com.android.tools.build:gradle:1.2.3'</span>classpath <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'cn.jiajixin.nuwa:gradle:1.2.2'</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// NOTE: Do not place your application dependencies here; they belong</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// in the individual module build.gradle files</span>}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
2,在你moduel的build.gradle添加插件,添加依赖,特别注意还要加上nuwa的那个部分
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//注意,这个要放在build的上方</span> apply plugin: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"cn.jiajixin.nuwa"</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//添加依赖。</span> compile <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'cn.jiajixin.nuwa:nuwa:1.0.0'</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//添加渠道包</span>productFlavors {qihoo {}xiaomi {}} <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//添加nuwa部分,因为application是最新加载的,所以这里要做特殊处理,原因在鸿洋的博客中有写</span> nuwa {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//括号里是Application类以及要排除Application父类</span>excludeClass = [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'com/example/frank/mysticklayout/MyApplication.class'</span>] } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>
3,写一个MyApplication继承自Application.并在里面对nuwa进行配置,除此之外要注意获取读写SD卡的权限,因为最后我们的jar是放在sd卡上的。
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//别忘记在manifest文件中进行注册</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">MyApplication</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Application</span> {</span><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onCreate</span>() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.onCreate();Nuwa.init(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);Nuwa.loadPatch(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, Environment.getExternalStorageDirectory().getAbsolutePath().concat(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/patch.jar"</span>));} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>
4,接下来就可以运行项目了,运行之后在D:\studiowork\MyStickLayout\app\build\outputs\nuwa(对应你的项目目录)中把nuwa文件夹拷贝出来(比如我放到了D盘的根目录下),因为之后要用到这个文件,这一步相当于是对原始文件做一个备份,这样才能与你修复了bug后的项目文件进行对比,知道哪些类被改动了,然后把对应的类打成jar包。
第一次运行的效果图
这个是第一次运行之后在项目中的nuwa文件夹,需要拷贝出来
5,接下来我们就要进行bug的修复工作了,比如我们增加了一个fixbug()方法,修改textview的文字
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">initViews</span>() {mIndicator = (SimpleViewPagerIndicator) findViewById(R.id.id_stickynavlayout_indicator);mViewPager = (ViewPager) findViewById(R.id.id_stickynavlayout_viewpager);mTextView = (TextView) findViewById(R.id.top_text);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//在这里调用方法</span>fixBug(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"bug已经修复了"</span>);}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//增加的修复bug的方法。</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">fixBug</span>(String text){mTextView.setText(text);}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>
6,在Android studio的命令行输入如下命令,前面是渠道包,后面是你之前复制的nuwa文件夹的存放位置,只有知道了存放位置,才能对比,然后知道哪些类进行了修改
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">gradlew clean nuwaQihooDebugPatch -P NuwaDir=D:/nuwa</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
在Android studio 命令行窗口输入命令
7,接下来到项目D:\studiowork\MyStickLayout\app\build\outputs\nuwa\qihoo\debug中就能够找到生成的jar包,找到之后复制到SD卡中,(在实际项目中我们把jar包放到服务器,接着发一个推送消息,然后客户端去下载jar包,这样用户下次启动应用的时候bug就修复了)
找到jar包
把jar包拷贝到Sd卡
关闭应用后重启,bug已经修复了
8,接下来我们用反编译工具来看看这个jar包里面有什么,网上下个jadx,然后把jar包拷贝到bean目录下,运行命令以下命令
<code class="language-java hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">jadx-gui patch.jar</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
可以看到jar里面就是我们修改了代码的MainActivity类.
我的demo下载地址
https://github.com/frankandroid/MyNuwaDemo
nuwa下载地址
https://github.com/jasonross/Nuwa
http://blog.csdn.net/lmj623565791/article/details/49883661
http://blog.csdn.net/duanymin/article/details/50751391
关于热修复框架nuwa的使用相关推荐
- Android之热修复框架Nuwa
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/70284239 本文出自:[顾林海的博客] ##前言 当热修复框架还没出 ...
- 热修复框架nuwa的使用
总结一下热修复框架nuwa的使用和,使用过程中遇到的问题https://github.com/jasonross/Nuwa 文中demo位置https://github.com/nononopro/n ...
- 热修复框架Tinker的从0到集成之路(转)
转自:http://blog.csdn.net/lisdye2/article/details/54411727 热修复框架Tinker的从0到集成之路 转载请标明出处: http://blog.c ...
- android热更新框架nuwa,Android热更新技术——Tinker、nuwa、AndFix、Dexposed
一.热修复技术作用 线上app BUG紧急修复,不重新发版,不重新安装,在线远程修复问题 二.局限性与适用场景 补丁只能针对单一客户端版本,随着版本差异变大补丁体积也会增大: 补丁不能支持所有的修改, ...
- Android—常用热修复框架
前言 热修复即<打补丁>,当一个app上线后,如果发现重大的bug,需要紧急修复.常规的做法是修复bug,然后重新打包,再上线到各个渠道.这种方式的成本高,效率低. 于是热修复技术应运而生 ...
- 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )
文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...
- 阿里SopHix热修复框架
2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker(Bugly sdk也集成Tikner ...
- 热修复框架AndFix【源码阅读】
前言 AndFix是阿里巴巴开源的Android热修复框架.其基本原理是利用JNI来实现方法的替换,以实现Android APP的热修复,即无需发版即可临时修复在线BUG. 热修复技术有很多种,And ...
- Android-FixBug热修复框架的使用及源码分析(不发版修复bug)
前面几篇博文已经介绍了2种热修复框架的使用及源码分析,AndFix兼容性比较好,而Dexposed Art处于Beta版. AndFix和Dexposed都是阿里的开源项目. Alibaba-And ...
最新文章
- go mysql recover_golang recover后怎么返回
- 【Java从入门到头秃专栏 6】语法篇(五) :多线程 线程池 可见、原子性 并发包 Lambda表达式
- 桌面桌面虚拟化-Vmware horizon 7相关文件共享
- mercurial和svn_DBA Mercurial简介–处理文件和更改
- TIOBE 12 月编程语言排行榜:争夺年度编程语言,Java、C、Python、C# 即将开战!...
- 【指纹识别】基于matlab GUI指纹识别门禁系统【含Matlab源码 1692期】
- 计算机电源线税务编码,电力电子元器件税收分类编码
- Unity3D初级工程师面试题及知识点
- Linux实训项目——第八章:配置网络接口及远程管理
- Paper:《Pre-Trained Models: Past, Present and Future大规模预训练模型的发展历史、最新现状和未来发展三个方向》翻译与解读
- 服务器抓不到mrcp信息,MRCP学习笔记-语音识别资源的事件和headers详解
- 微信小程序根据用户当前位置并打开地图选择周边地址,完成外卖地址选择并计算距离
- 红米手机html文件,红米手机怎么传文件到电脑
- PAT 甲级 1121 Damn Single
- 南宁计算机学校排名,2021年南宁所有的中学排名,南宁最好的中学排名前十强
- FICO配置详解之四:成本中心会计
- 【星球精选】如何高效构建 Roam 与 theBrain 间细粒度双向链接?
- 25.211(840)——阅读笔记II
- 计算机管理文件的目录形式是什么,资源管理器采用什么形式管理文件与文件夹...
- 1080P 的显示器上,4K 的视频是否看起来比 1080P 的视频更清晰