前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android热更新之Nuwa实践

Android热更新之Nuwa实践

原创
作者头像
Android架构
修改于 2019-06-20 09:54:59
修改于 2019-06-20 09:54:59
1.7K0
举报
文章被收录于专栏:Android进阶之路Android进阶之路

今天给大家讲一下热更新之Nuwa实践。

热更新的框架有很多,比如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命令:

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

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

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

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

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

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

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

热更新原理

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

代码语言:txt
AI代码解释
复制
import android.app.Application;
import android.content.Context;
import android.os.Environment;
import cn.jiajixin.nuwa.Nuwa;
public class NuwaApplication extends Application {

    @Override
    protected 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中显示要输出的文字,这里我们将文字单放在一个类中,以便改变:

代码语言:txt
AI代码解释
复制
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 {

    @Override
    protected 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,并输入以下命令:

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

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

代码语言:txt
AI代码解释
复制
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中输入:

代码语言:txt
AI代码解释
复制
./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文件根目录,你可以选择通过电脑拷贝或者使用安卓命令:

代码语言:txt
AI代码解释
复制
adb push E:hotfix\Nuwa\app\build\outputs\nuwa\qihoo\debug\patch.jar /sdcard/

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
android 热修补之andfix实践
首先有这方面需要的请到https://github.com/xiangzhihong/andfixDemo/tree/master下载例子 对于网上提供的热补丁修复就不多说了,主要有这3种方式可以实现(至于其他的方式,暂不清楚) 1.dexposed     github https://github.com/alibaba/dexposed 2.andfix   github https://github.com/alibaba/AndFix 3.bsdiff  http://blog.csdn.net/
xiangzhihong
2018/02/01
8810
android 热修补之andfix实践
Git 常用命令速查表(三)
前面两篇博客 Git 版本管理工具 和 Git 常用命令详解,分别介绍了Git 基础知识和命令用法
阳光岛主
2019/02/19
8950
实战Git常用操作(IDEA界面+命令):初始化(init)、忽略文件(.gitignore)、提交(commit)、查看提交记录(log)、创建+切换分支(branch)
在上文天狗实战(二)SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包(下),我们实现了期望的API开发,打包了一个jar包,发布到DEV环境上供前端联调,其实,在实际的项目开发中,是会涉及到版本管理 的,所以既然是实战,那我们在本文补上!
天罡gg
2023/03/25
7.2K0
实战Git常用操作(IDEA界面+命令):初始化(init)、忽略文件(.gitignore)、提交(commit)、查看提交记录(log)、创建+切换分支(branch)
Nuwa学习笔记
With this Nuwa project,you can also have the repairing power, fix your android applicaiton without have to publish a new APK to the appstore. 简单描述:其实就是Android热修复(ps:这里不做热修复的比对,纯粹的学习笔记) 使用方法,github上描述的很清楚
Anymarvel
2018/10/22
9390
Nuwa学习笔记
Bugly热更新SDK你需要知道的一些事
Bugly出热更新SDK了? 没错,Bugly也出热更新SDK啦,2016.11.25号,我们Bugly也上线了Android版的热更新SDK,大家都知道这一年来热更新被无数次提起,各大厂自主研发的热更新方案层出不穷,下面就列举一些大家比较熟悉的一些热更新方案: 微信开源:Tinker 大众点评:Nuwa 阿里巴巴:Dexposed 阿里巴巴:AndFix 美团:Robust 各个方案的优劣性笔者就不在这里做过多讨论了,总的一句话没有最好的,只有最适合自己的。 我们Bugly也是出于高可用性的考虑,Tink
巫山老妖
2018/07/20
1.6K0
有赞移动热修复平台建设
随着公司的快速发展,需求的快速增加,App迭代也越来越频繁,如果移动应用出现问题,不仅仅影响用户体验,还会影响公司口碑,甚至可能造成资损。需要快速修复线上问题,对比常规的开发流程而言,热修复更加灵活方便,优势很多:
有赞coder
2020/08/24
1.3K0
有赞移动热修复平台建设
Android热更新之微信Tinker集成(接入Bugly热更新)
最近公司项目中需要集成热更新功能,由于刚开始接入的时候踩了很多坑,所以现在记录一下集成的过程.
SoullessCoder
2019/08/07
2K0
Android热更新之微信Tinker集成(接入Bugly热更新)
Android热更新方案Robust
美团•大众点评是中国最大的O2O交易平台,目前已拥有近6亿用户,合作各类商户达432万,订单峰值突破1150万单。美团App是平台主要的入口之一,O2O交易场景的复杂性决定了App稳定性要达到近乎苛刻的要求。用户到店消费买优惠券时死活下不了单,定外卖一个明显可用的红包怎么点也选不中,上了一个新活动用户一点就Crash……过去发生过的这些画面太美不敢想象。客户端相对Web版最大的短板就是有发版的概念,对线上事故很难有即时生效的解决方式,每次发版都如临深渊如履薄冰,毕竟就算再完善的开发测试流程也无法保证不会将B
美团技术团队
2018/03/12
1.5K0
Android热更新方案Robust
SDK热更系列之Demo体验方法
写在前面 本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接: SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.html SDKHotfix对应github地址:https://github.com/bihe0832/SDKHoxFix ---- 继插件化后,热补丁技术在2015年开始爆发,目前已经是非常热门的Android开发技术。为了解决SDK的热更新,也为了方便大家了解Android热更
子勰
2018/05/22
7820
Android架构之路--热更新Tinker(上)
当前市面的热补丁方案有很多,其中比较出名的有阿里的 AndFix、美团的 Robust 以及 QZone 的超级补丁方案。但它们都存在无法解决的问题,这也是正是最后使用 Tinker 的原因。先看一张图对比:
conanma
2021/09/04
1.8K0
Android热补丁动态更新实践
前言 好几个月之前关于Android App热补丁修复火了一把,源于QQ空间团队的一篇文章安卓App热补丁动态修复技术介绍,然后各大厂的开源项目都出来了,本文的实践基于HotFix,也就是QQ空间技术
巫山老妖
2018/07/20
1.3K0
持续交付之基于Git Flow代码分支策略实践
高效的持续交付体系,必定需要一个合适的代码分支策略。采用不同的代码分支策略,意味着实施不同的代码集成与发布流程,这会影响整个研发团队每日的协作方式,因此研发团队通常需要很认真地选择自己的策略。
高楼Zee
2019/07/17
1.4K0
持续交付之基于Git Flow代码分支策略实践
React Native热更新方案
随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行部分业务线的开发,也有不少使用 Hybrid 技术的公司转向了 React Native 。虽然React Native在目前来说仍有不少的坑,不过对于以应用开发为主的App来说完全可以胜任。 概述 在iOS应用开发中,由于Apple严格的审核标准和低效率,iOS应用的发版速度极慢,这对于大多数团队来说是不能接受的,所以热更新对于iOS应用来说就显得尤其重要。而就在前不久,苹果
xiangzhihong
2018/02/06
9.6K0
React Native热更新方案
SDK热更系列之Demo项目介绍概述
写在前面 本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接: SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.html SDKHotfix对应github地址:https://github.com/bihe0832/SDKHoxFix ---- 项目说明 该项目主要是提供给SDK的开发者使用,提供了SDK开发者如何实现SDK自身热更新(包括Java代码和Native),如果是APP的开发者了
子勰
2018/05/22
1.1K0
章鱼抓娃娃添加Bugly-Tinker热更新支持
Bugly热更新采用Tinker开源方案,官方文档如下: Bugly Android热更新使用指南 Bugly Android热更新详解
冰之角
2019/03/06
8580
Android热更新利器Tinker接入
基准包 例如有一个版本A,但是这时A是有Bug的,然后修复Bug后的生成的版本我们称为B。A和B之间的区别产生一个差分包(这里也称为补丁包),那么我们就可以说这个差分包是以A作为基准包相对B生成的。 基本步骤 1、注册Tinker账号并新建项目 2、配置gradle和代码 3、生成基准包 4、修复Bug 5、生成补丁包 6、发布补丁包 Tinker做了什么 1、1-2步是APP开发的基本步骤,完成1-3步,那么你的APP就集成了Tinker。 集成Tinker后,Tinker会根据各个版本的配置信息去自动加
用户1269200
2018/03/26
1.3K0
Android热更新利器Tinker接入
【详细】Android热更新Bugly集成配置
上一篇文章说道tinker的热更新,可是少了点补丁包的管理,这一篇文章介绍的bugly就是增强版的,更加方便你集成tinker和包括了补丁包的后台管理。 为什么使用 Bugly 热更新?
ppjun
2018/09/05
1.1K1
【详细】Android热更新Bugly集成配置
热更新
什么是热更新? 不停机更新,实时更新。HotUpdateHotFix Unity中需要APP重启 真正热更新不重启就做更新
祝你万事顺利
2019/06/05
2K0
Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统。跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL硬件抽象层。 大多数时候,我们使用JVM语言进行编程,比如传统的Java或者新贵Kotlin。碰到对速度比较敏感的项目,比如游戏,比如视频播放。我们就会用到Android的JNI技术,使用NDK的支持,利用C++开发高计算量的模块,供给上层的Java程序调用。 本文先从一个最简单的JNI例子来开始介绍Android中Java和C++的混合编程,随后再介绍Android直接调用ELF命令行程序的规范方法,以及调用混合了第三方库略微复杂的命令行程序。
俺踏月色而来
2019/06/15
1.9K0
Android 热更新 Tinker 集成配置【详细】
Tinker 是微信官方的 Android 热补丁解决方案,它支持动态下发代码、So 库以及资源,让应用能够在不需要重新安装的情况下实现更新。
ppjun
2018/09/05
1.6K0
Android 热更新 Tinker 集成配置【详细】
相关推荐
android 热修补之andfix实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档