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的使用相关推荐

  1. Android之热修复框架Nuwa

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/70284239 本文出自:[顾林海的博客] ##前言 当热修复框架还没出 ...

  2. 热修复框架nuwa的使用

    总结一下热修复框架nuwa的使用和,使用过程中遇到的问题https://github.com/jasonross/Nuwa 文中demo位置https://github.com/nononopro/n ...

  3. 热修复框架Tinker的从0到集成之路(转)

    转自:http://blog.csdn.net/lisdye2/article/details/54411727 热修复框架Tinker的从0到集成之路 转载请标明出处:  http://blog.c ...

  4. android热更新框架nuwa,Android热更新技术——Tinker、nuwa、AndFix、Dexposed

    一.热修复技术作用 线上app BUG紧急修复,不重新发版,不重新安装,在线远程修复问题 二.局限性与适用场景 补丁只能针对单一客户端版本,随着版本差异变大补丁体积也会增大: 补丁不能支持所有的修改, ...

  5. Android—常用热修复框架

    前言 热修复即<打补丁>,当一个app上线后,如果发现重大的bug,需要紧急修复.常规的做法是修复bug,然后重新打包,再上线到各个渠道.这种方式的成本高,效率低. 于是热修复技术应运而生 ...

  6. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

  7. 阿里SopHix热修复框架

    2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker(Bugly sdk也集成Tikner ...

  8. 热修复框架AndFix【源码阅读】

    前言 AndFix是阿里巴巴开源的Android热修复框架.其基本原理是利用JNI来实现方法的替换,以实现Android APP的热修复,即无需发版即可临时修复在线BUG. 热修复技术有很多种,And ...

  9. Android-FixBug热修复框架的使用及源码分析(不发版修复bug)

    前面几篇博文已经介绍了2种热修复框架的使用及源码分析,AndFix兼容性比较好,而Dexposed Art处于Beta版. AndFix和Dexposed都是阿里的开源项目.  Alibaba-And ...

最新文章

  1. go mysql recover_golang recover后怎么返回
  2. 【Java从入门到头秃专栏 6】语法篇(五) :多线程 线程池 可见、原子性 并发包 Lambda表达式
  3. 桌面桌面虚拟化-Vmware horizon 7相关文件共享
  4. mercurial和svn_DBA Mercurial简介–处理文件和更改
  5. TIOBE 12 月编程语言排行榜:争夺年度编程语言,Java、C、Python、C# 即将开战!...
  6. 【指纹识别】基于matlab GUI指纹识别门禁系统【含Matlab源码 1692期】
  7. 计算机电源线税务编码,电力电子元器件税收分类编码
  8. Unity3D初级工程师面试题及知识点
  9. Linux实训项目——第八章:配置网络接口及远程管理
  10. Paper:《Pre-Trained Models: Past, Present and Future大规模预训练模型的发展历史、最新现状和未来发展三个方向》翻译与解读
  11. 服务器抓不到mrcp信息,MRCP学习笔记-语音识别资源的事件和headers详解
  12. 微信小程序根据用户当前位置并打开地图选择周边地址,完成外卖地址选择并计算距离
  13. 红米手机html文件,红米手机怎么传文件到电脑
  14. PAT 甲级 1121  Damn Single
  15. 南宁计算机学校排名,2021年南宁所有的中学排名,南宁最好的中学排名前十强
  16. FICO配置详解之四:成本中心会计
  17. 【星球精选】如何高效构建 Roam 与 theBrain 间细粒度双向链接?
  18. 25.211(840)——阅读笔记II
  19. 计算机管理文件的目录形式是什么,资源管理器采用什么形式管理文件与文件夹...
  20. 1080P 的显示器上,4K 的视频是否看起来比 1080P 的视频更清晰

热门文章

  1. c语言学string,c语言中的string
  2. Android自定义ClassLoader耗时问题追查
  3. win 8 store app 列车时刻表查询 隐私声明
  4. 警察叔叔顺着网线是怎么找到你的?计算机网络(四)之网络层未完待续
  5. 微信小程序客服消息之解决方案
  6. 三菱PLC与第三方设备TCP通讯_【深度分析】一台威纶通触摸屏与多台三菱PLC通讯...
  7. 轻松搞懂SMBIOS
  8. 面试官:运行 ping xxx 的时候发生了什么?问倒一大片。。。
  9. 边车设计模式-Sidecar pattern
  10. 2023年专利申请流程及费用,哪里可以申请