热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android热更新之Nuwa实践

今天给大家讲一下热更新之Nuwa实践。热更新的框架有很多,比如AndFix、HotFix、Dexposed以及Nuwa,在考虑兼容性和功能需求之后我还是选择了Nuwa,因为这个框架

今天给大家讲一下热更新之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命令:

《Android热更新之Nuwa实践》

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

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

《Android热更新之Nuwa实践》

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

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

《Android热更新之Nuwa实践》

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

《Android热更新之Nuwa实践》

提交过程中又会出现一系列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 {
@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中显示要输出的文字,这里我们将文字单放在一个类中,以便改变:

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热更新之Nuwa实践》

使用android studio运行项目到手机上,成功运行之后,会在项目的目录下创建一个nuwa文件夹,如果你是自己创建的项目,那么路径应该是appild/outputs/nuwa,如果你是导入github上的项目,路径应该是sampleild/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的文件夹:

《Android热更新之Nuwa实践》

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

《Android热更新之Nuwa实践》

配置好这两个文件后,再在hotfix中开启git,在git中输入:

./gradlew clean nuwaQihooDebugPatch -P NuwaDir=C:/Users/thinkpad/Desktop/nuwa

这里有两点需要注意,NuwaDir=后面跟着的路径就是刚刚master分支运行项目时,生成的nuwa文件夹,具体路径要看大家拷贝的地址。还有就是因为这个命令是调用.gradle文件,我们的版本库是两层文件夹,需要cd进入到Nuwa项目文件夹中运行该命令:

《Android热更新之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框架是可以新建类的哦,虽然不能更改资源文件,但是配合动态布局使用还是能实现大部分需求的,如果要修改资源文件可以试试微信热修复Tinker。
【附录】

《Android热更新之Nuwa实践》 资料图

需要资料的朋友可以加入Android架构交流QQ群聊:513088520

点击链接加入群聊【Android移动架构总群】:加入群聊

获取免费学习视频,学习大纲另外还有像高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)等Android高阶开发资料免费分享。


推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
author-avatar
dotagod12
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有