最近热更新热修复的功能在安卓应用上越发火热,终于我的产品也提出了相应的需求。

经过两天的研究,搞定了这个功能,在这里还要多谢大神们的博客,大神们的原理分析很到位,不过对于我来说最大的障碍还是在git的使用、打jar包出现的一些错误上,所以在这里写出具体些的实现步骤,希望可以帮到那些和我水平差不多的小虾。

热更新的框架有很多,比如AndFix、HotFix、Dexposed以及Nuwa,在考虑兼容性和功能需求之后我还是选择了Nuwa,因为这个框架可以新增类和字段,并且兼容到Android6.0系统。

现在市面上的热更新框架基本原理都是classloader,也就是类加载器,这也就限制了我们不可以修改资源文件,如图片布局等,有这方面需求的小伙伴还要想其他办法,比如动态布局。

我们先来说下准备工作,首先你的开发工具必须是Android Studio,因为在打jar包时需要使用.gradle文件。其次电脑上要有一个本地的git库,以方便管理新旧版本,使用git命令较为方便,要下载nuwa库,并且user library到你的项目中,不会这个步骤的同学请自行百度,在这里推荐一个github上的项目,里面有集成好的nuwa库。

https://github.com/jasonross/Nuwa

假设我们已经创建好一个项目,并且成功集成nuwa,现在我们需要一个git,如果没有安装git的同学请按照下面这篇教程安装,这篇教程通俗易懂。

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

git安装成功后,要新建一个本地版本库,选择一个合适的文件路径,输入以下git命令:

mkdir hotfix 是创建名为hotfix的本地版本库,cd hotfix是定位到版本库,pwd是输出版本库位置,如果你是在windows系统上使用,为了避免不可测问题,请保证路径中没有特殊符号及中文。

创建好库后要使用命令将其变成git可管理的版本库:

创建成功后,会发现文件夹中出现一个.git文件,如果你的看不到,那可能是因为这个文件是隐藏的,使用ls -ah命令试试看。

版本库创建成功了,现在我们要做的就是将刚刚创建的项目导入到版本库中,拷贝你的项目到hotfix文件夹中,并且使用以下命令:

git add 后面跟着的是你的项目名称,在add过程中会出现一系列waning警告,不要理,只要不出error就好。add成功后,再提交一次代码,如果没有问题就你的项目就导入成功了:

提交过程中又会出现一系列warning,不用理。这里需要注意的是-m后面是你每次提交的注释,不可为空,为了方便以后维护,希望大家可以写清本次提交原因。

成功将项目导入,下面我们就要开始写代码了,如果你的项目是从刚刚推荐的github上拉下来的,那你项目中应该有完整代码,不是的童鞋请跟我一步步完成代码。

热更新的原理大概就是从服务器拉取一个补丁文件,然后用类加载器加载这个补丁中的类,如果我们想要实现在项目开始时就加载出这个补丁文件,那么加载补丁的操作就要放在Application类中实现,代码如下:

import android.app.Application;
import android.content.Context;
import android.os.Environment;import cn.jiajixin.nuwa.Nuwa;public class NuwaApplication extends Application {@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);Nuwa.init(this);Nuwa.loadPatch(this, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/patch.jar"));}
}

很简单,nuwa框架已经封装好了很多操作,我们只需要调用就好,loadpatch方法中的参数是补丁文件的位置,应该从服务器动态获取文件,并存储到sdcard指定项目专用目录,在这里我们是测试demo,就简单的固定好jar文件位置,sdcard根目录。在这里提醒一下粗心的同学,不要忘记在Manifest文件中配置Appliction。

其他只需要在MainActivity中显示要输出的文字,这里我们将文字单放在一个类中,以便改变:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;import cn.jiajixin.nuwasample.Hello.Hello;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView = (TextView) findViewById(R.id.textview);textView.setText(new Hello().say());}}

public class Hello {public String say() {return "hello world";}
}

好了,代码已经写完了,是不是很简单?现在要注意,下面是一些核心步骤,这是在其他文案上找不到的。

我们要在刚刚建立的本地版本库上建立一个bugfix分支,hotfix文件夹中打开git,并输入以下命令:

git branch bugfix 是新建一个名为bugfix的分支,git checkout bugfix是转到这个分支下,好了,现在对比以下两个分支的代码,应该是一模一样的,现在使用命令:git checkout master切换回主分支。

使用android studio运行项目到手机上,成功运行之后,会在项目的目录下创建一个nuwa文件夹,如果你是自己创建的项目,那么路径应该是app/build/outputs/nuwa,如果你是导入github上的项目,路径应该是sample/build/outputs/nuwa,将nuwa文件夹拷贝到一个位置,比如桌面,我的是C:\Users\thinkpad\Desktop\nuwa,这个地方大家要注意,每个人拷贝的位置不同,一会使用时路径一定要匹配。

现在使用git checkout bugfix命令切换到bugfix分支上,修改Hello类下面的输出字符串,如下:

public class Hello {public String say() {return "hello world I'm hotfix";}
}

改好之后我们就要通过git命令调用.gradle来打一个jar包,千万注意,不要运行bugfix分支上的项目。

如果你是自己新建的app,要在项目中新建一个名为extras的文件夹:

在文件夹中有两个配置文件,一个是名为hack的空java类,另一个文件里面写好了一段使用dx封装jar包的命令:

配置好这两个文件后,再在hotfix中开启git,在git中输入./gradlew clean nuwaQihooDebugPatch -P NuwaDir=C:/Users/thinkpad/Desktop/nuwa,这里有两点需要注意,NuwaDir=后面跟着的路径就是刚刚master分支运行项目时,生成的nuwa文件夹,具体路径要看大家拷贝的地址。还有就是因为这个命令是调用.gradle文件,我们的版本库是两层文件夹,需要cd进入到Nuwa项目文件夹中运行该命令:

运行成功后你会在你想项目目录下看到一个名为patch.jar的文件,如果你是新建的项目,具体路径应该为app\build\outputs\nuwa\qihoo\debug\patch.jar,如果你是从github上拉下来的项目,路径应为sample\build\outputs\nuwa\qihoo\debug\patch.jar。

将上面生成的jar文件导入到手机sdcard文件根目录,你可以选择通过电脑拷贝或者使用安卓命令:

adb push E:hotfix\Nuwa\app\build\outputs\nuwa\qihoo\debug\patch.jar /sdcard/

大家写了这么久,终于到了收获的时候,现在先退出刚刚在手机上安装的master分支上的项目,彻底退出,杀死进程。然后再重新进入,有没有惊喜的发现之前的"hello world"变成了我们修改的"hello world I'm hotfix"?这就实现了补丁方式的热更新,而且使用nuwa框架是可以新建类的哦,虽然不能更改资源文件,但是配合动态布局使用还是能实现大部分需求的。

好了,相信现在大家对nuwa的热更新流程已经了解的差不多,写这篇博客很用心,因为自己的研究热更新的时候遇到了很多头大的问题,所以想要分享给那些和我一样正在研究或未来要研究这个功能的人,如果大家有要补充的或者哪个步骤遇到问题,欢迎留言,我会及时回复。

转载于:https://my.oschina.net/u/2542649/blog/1537417

安卓热更新之Nuwa实现步骤相关推荐

  1. flutter已经支持安卓热更新_flutter 在 android 上的热更新

    热更新是一种需求吧. 自然会想到flutter 是否支持热更新. 然后一些群里问了问普遍反映不可以热更新,还说咸鱼的文章写了不支持热更新. 然后我表示很怀疑. 我的结论可以做到热更新 1.你需要把fl ...

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

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

  3. SDK全局热更新方案(全网唯一)

    大家好,我是拭心,这篇文章是一个好友 Divin 的投稿,介绍 SDK 热更新的一种实现思路,希望对你有所启发. 一.背景 App热更新 目前市面上成熟的商业热更新方案不少,有腾讯Bugly的Tink ...

  4. YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关

    YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy .所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分 ...

  5. Android 腾讯Bugly使用(异常上报,全量升级,热更新)

    1.0.1腾讯Bugly使用(异常上报,全量升级,热更新) 说明 Bugly全量升级,热更新以及异常上报是一起集成的,还包括运营统计,本文档着重演示热更新功能. 接入步骤 1.在Project的bui ...

  6. 现有的几个Unity热更新方案该如何选择,各自的优缺点是什么?

    1.3 huatuo示例项目源码分析与启发 上一节我们安装huatuo的开发环境,然后运行示例项目,体验了huatuo做热更新,这节课我们来分析示例项目的源码,掌握huatuo做热更新的主要的步骤,让 ...

  7. Ionic3 Ios 热更新

    众所周知,苹果应用上架审核等待时间是蛮久的,但是有时候修改的内容又很少,又不愿意花太久时间去提交审核,那么就可以采用热更新的方式来更新APP内容了,前段时间出现了苹果拒绝审核通过带有热更新的应用,不知 ...

  8. Cocos Creater 热更新

    转载自:https://www.jianshu.com/p/a033059f376d 惯例先上官方文档: http://docs.cocos.com/creator/manual/zh/advance ...

  9. uni-app整包更新与热更新方案(安卓和IOS)

    原文链接:uni-app整包更新与热更新方案(安卓和IOS) 效果预览 大致效果: 打开App,进入首页(首次),检测线上是否存在新版本,如果存在,弹窗提示用户是否进行版本更新.Android 有热更 ...

最新文章

  1. python之父叫什么-Python之父谈Python的未来形式
  2. 未来新一代计算机的发展方向,未来计算机的发展方向 (2)
  3. 【Flask】SQLALchemy的介绍
  4. windows应用程序的开发一个键盘记录器
  5. 计算男孩女孩小孩各有几个 java——CSDN博客
  6. 第二十三天 how can I 坚持
  7. win11 32位官方版原版镜像文件v2021.07
  8. python 逻辑回归sklearn_python – 分类:使用sklearn进行PCA和逻辑回归
  9. 如何快速将所有东西从旧的Intel Mac迁移到新的M1 MacBook
  10. 电感式升压转换器-AIC1896 电感式升压转换器
  11. linux数组删除数据,如何从shell数组中删除一个元素
  12. HashTable 源码解析 jdk1.8
  13. Rust :fold
  14. 金山毒霸2012秒杀全新病毒
  15. cordova 美洽_phonegap-cordova-美洽客服插件-Android
  16. 千牛2015卖家版官方电脑版
  17. 咸鱼购买小米红米有锁机-完美解锁机有什么区别?MIUI解锁机升级系统
  18. 脱机运行scp linux,解决CentOS使用不了scp命令
  19. Docker之Docker概述
  20. JavaWeb项目1-QQZone

热门文章

  1. 【毕业设计_课程设计】基于各种机器学习和深度学习的中文微博情感分析
  2. 【学一点英飞凌】AutoSar-MCAL-Gtm-TOM模块
  3. 生活中,我们不知道的……
  4. 系统微服务化,始于拆分,重在治理
  5. 关于前端图片展示的总结
  6. 【将金令】01.03周评:多头萎靡不振,空方气势强势
  7. Python批量爬取简历模板
  8. Linux DNS分离解析与Web服务器综合实验和搭建批量装机环境 、 配置PXE引导 、kickstart自动应答(SERVICE05----DAY20)
  9. 价值1000元的Python原创文档,涉及“Python基础“、“Python自动化“等,免费分享!
  10. CNCC2018中国计算机大会:人工智能与信息安全分论坛