安卓热更新之Nuwa实现步骤
安卓热更新之Nuwa实现步骤
最近热更新热修复的功能在安卓应用上越发火热,终于我的产品也提出了相应的需求。
经过两天的研究,搞定了这个功能,在这里还要多谢大神们的博客,大神们的原理分析很到位,不过对于我来说最大的障碍还是在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/0013739516305929606dd18361248578c67b8067c8c017b000git安装成功后,要新建一个本地版本库,选择一个合适的文件路径,输入以下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,并输入以下命令:
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的热更新流程已经了解的差不多,写这篇博客很用心,因为自己的研究热更新的时候遇到了很多头大的问题,所以想要分享给那些和我一样正在研究或未来要研究这个功能的人,如果大家有要补充的或者哪个步骤遇到问题,欢迎留言,我会及时回复。
安卓热更新之Nuwa实现步骤的更多相关文章
- uniapp中IOS安卓热更新和整包更新app更新
在App.vue中 onLaunch: function() { console.log('App Launch'); // #ifdef APP-PLUS this.getVersion(); // ...
- [Unity热更新]tolua# & LuaFramework(一):基础
一.tolua# c#调用lua:LuaState[变量名/函数名] 1.LuaState a.执行lua代码段 DoString(string) DoFile(.lua文件名) Require(.l ...
- YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关
YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy .所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分 ...
- ionic3 热更新发布步骤记录
1.安装基本框架npm install -g ionic@latest npm install -g cordova ionic 验证版本号 ionic –version cordova -versi ...
- Unity 安卓下DLL热更新一(核心思想)
大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll热更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- JSBinding+Bridge.NET:Unity游戏热更新方案
老版本链接如下:http://www.cnblogs.com/answerwinner/p/4469021.html 新用户不要再使用老版本了. 新版本 JSBinding 将抛弃 SharpKit ...
- 【Quick 3.3】资源脚本加密及热更新(二)资源加密
[Quick 3.3]资源脚本加密及热更新(二)资源加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 在前一篇文章中介绍了代码加密,加密方式是XXTEA.对于资源文件来说,同样 ...
- ionic2新手入门整理,搭建环境,创建demo,打包apk,热更新,优化启动慢等避坑详解
onic官方文档链接:http://ionicframework.com/docs/ 如果是新的环境会有很多坑,主要是有墙,请仔细阅读每个步骤 文档包含以下内容: l 环境搭建 l 创建demo并 ...
随机推荐
- ios常用动画
// // CoreAnimationEffect.h // CoreAnimationEffect // // Created by VincentXue on 13-1-19. // Copyri ...
- BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 LCT
2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOn ...
- BZOJ 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
2257: [Jsoi2009]瓶子和燃料 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- sphinx全文检索之PHP使用(转)
基础 数据结构: CREATE TABLE email ( emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '邮件id', ...
- [Effective C++ --006]若不能使用编译器自动生成的函数,就该明确拒绝
■本文内容■□第一节 <引言> 在条款五的讲解中,我们已经知道编译器是聪明的家伙,它会帮助你生成类的构造函数.析构函数.一个copy构造函数和一个赋值运算符.有时真的要感谢编译器所做的这一 ...
- Android打包程序
右击项目->导出export next,完成相关信息填写将得到.apk文件,即可部署到手机上. 第一次: 然后打开目录就可以看到生成的apk,可以发布到各大市场上.
- Linux操作系统的简单认识
1:Linux操作系统的历史 Linux操作系统是由unix操作系统发展而来的,但是Unix是收费的系统,而Linux操作系统的免费的,开源的,所以使用比较广泛,但是它是基于命令行的,不提供图形化用户 ...
- 关于Git的分支
分支是代码管理的利器.如果没有有效的分支管理.代码管理就适应不了复杂的开发过程和 项目的需要. 分支命令概述: 在Git中分支管理使用命令git branch.该命令的主要用法如下: 用法一: git ...
- Flash cs6 帧上的菱形原来是关键帧
假如需要删除这个关键帧,选中它,然后右键,"清除关键帧",相应的类型即可. 因为之前学了一点点Flash,没见过帧上面这个菱形图标,才知道是关键帧.
- PeopleReady--办公学习类App产品
PeopleReady是能使人(公司或组织里的员工)快速Ready(经验+知识)的学习系统.对员工的好处是:- 可以迅速Ready,尽快符合岗位要求,尽快有Performance,尽快对公司有价值,从 ...