专栏首页Android进阶之路Android热更新之Nuwa实践
原创

Android热更新之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命令:

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 {

    @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 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的文件夹:

在文件夹中有两个配置文件,一个是名为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框架是可以新建类的哦,虽然不能更改资源文件,但是配合动态布局使用还是能实现大部分需求的,如果要修改资源文件可以试试微信热修复Tinker。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 项目架构,你真的了解吗?

    为了帮助开发着打造一款优秀的APP,Google可谓费尽心力,推出了各种诸如MVP,MVVM等等项目架构的思路,帮助开发者更加高效的开发,尽管这样,Google...

    Android架构
  • Handler中的内存泄露究竟是怎么回事?

    代码很简单,只是创建一个mHandler变量,并在onCreate中发送一个延迟消息。

    Android架构
  • 图文详解Android Handler通信机制的工作原理

    在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理

    Android架构
  • idea提示接口注释信息

    设置之后,当鼠标移动到接口的实现类方法上时(需要由@Override注解),可以显示接口中此方法的注释信息,如下:

    IT云清
  • 教你如何建高逼格个人网站

    接着会提醒你输入名字和密码,可以为空 会在C盘的该电脑用户下面生成一个.ssh文件,其中的id_rsa和id_rsa.pub,id_rsa要好好保存,id_rs...

    迹_Jason
  • 如何fork自己的github库?

    Github上我们经常fork其他人的代码,然后经过一通魔改后弄出"自己"的东西。但是现在我遇到了这么一个需求,就是我已经公开了一个自己的库(暂且叫parent...

    marsggbo
  • Django Rest Framework 版本(下)

    在 url 中定义,例如 http://127.0.0.1:8000/api/v1/

    小团子
  • 操作文件方法

    py3study
  • 中国银行 DevOps 历程、 效果及展望

    ? 讲师 | 张新 编辑 | 白凡 作者简介: ? 个人简介:张新,曾从事中国银行软件设计开发工作,熟悉银行业务系统和开发过程;现作为中国银行软件中心DevO...

    DevOps时代
  • 如何fork自己的github库?

    Github上我们经常fork其他人的代码,然后经过一通魔改后弄出"自己"的东西。但是现在我遇到了这么一个需求,就是我已经公开了一个自己的库(暂且叫parent...

    marsggbo

扫码关注云+社区

领取腾讯云代金券