Android 热修复之nuwa使用简略

上周花了一天的时间,了解了下Anroid热更新的相关知识点。今天用nuwa方式初步实现了下,体验了下。感觉不错。

       首先,可以通过这个blog:QQ空间热更新原理。先了解下热更新的基本原理与实现方式。实际上,热更新的设计理念比较简单,就是android app启动时候,进行多dex文件加载,且将需要修复的文件优先加载。具体的可以看看blog。

        技术的魅力在于打破既有的逻辑,然后创新。通过网上的资料,我们也可以了解到热更新技术在tencent、alibaba、baidu中研究较为深入。在qihoo公司,也有较多的实践者。我觉得作为一个优秀的工程师,其创新能力是最优考核点。只可惜我所经历的三家公司都没有这样的同事。

        下面,来简单记录下如何使用nuwa,来进行热更新。

        1. 新建工程 NuwaUseDemo。

          在工程的build.gradle文件中:

    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
      修改下gradle版本,导入nuwaGradle。

     2. 修改下module的build.gradle文件

      上面导入: 

       apply plugin: "cn.jiajixin.nuwa"
      依赖中导入:   
      compile 'cn.jiajixin.nuwa:nuwa:1.0.0'

      最后添加:

    

nuwa {
    //括号里是Application类以及要排除Application父类
    excludeClass = ['com/nuwademo/MyApplication.class']
}
   我们这里,新建了一个MyApplication 类,继承Application.java。需要在AndroidManifest.xml文件中注册下。
   <application
        android:name=".MyApplication"

   3. MyApplication.java中,onCreate方法中,添加代码:

 

        Nuwa.init(this);
        Nuwa.loadPatch(this, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/patch.jar"));
      注:1)我们的patch文件叫:patch.jar,且放在sdcard目录下。

              2)这里需要sdcard的读权限,(在这个点上吃了亏)

      比如,我们的测试机器是Android L,其读权限添加:

    

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

   4. 新建一个类Controller.java。这个类的构造函数形参为Activity。在Activity的onCreate方法中,将此类的对象创建。
     new Controller(this);

  
package com.nuwademo;

import android.content.Context;
import android.widget.Toast;

/**
 * Created by vnbo on 16-10-31.
 */
public class Controller {
    private Context mContext;
    private Toast mToast;

    public Controller(Context context) {
        mContext = context;
        mToast = new Toast(context);
        sayHelloToNuwa();
        useNuwaTest();
    }

    private void sayHelloToNuwa() {
        mToast.makeText(mContext,"你好,女娲",Toast.LENGTH_LONG).show();
    }

    private void useNuwaTest() {
        mToast.cancel();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(8000);
                } catch (Exception e){
                    e.printStackTrace();
                }

                System.exit(-1);
            }
        }).start();
    }
}
 之后在手机上运行。

5. 复制此时nuwa文件夹。

   将app/build/outputs/nuwa文件夹,复制到其他目录,比如:

vnbo@vnbo-Lenovo-IdeaPad-Y500:~/hotFixTest$ 
目录下。

6. 修改代码:

    更改上面Controller类中的函数:useNuwaTest

   

    private void useNuwaTest() {
        mToast.cancel();
        //添加一句话,模拟文件修改
        mToast.makeText(mContext,"女娲working",Toast.LENGTH_LONG).show();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(8000);
                } catch (Exception e){
                    e.printStackTrace();
                }

                System.exit(-1);
            }
        }).start();
    }
7.制作patch.jar文件。

   在Android Studio的terminal中操作也可以,由于习惯,我还是比较喜欢ubuntu的shell环境中操作。在我们刚才创建的工程下,执行如下命令:

 

./gradlew clean nuwaDebugPatch -P NuwaDir=/home/vnbo/hotFixTest/nuwa
log中显示successful,则表示patch构建成功。

  注意点:a) ANDROID_HOME is not defined

                        解决:linux下 export ANDROID_HOME=/home/vnbo/android_env/sdk

                                  windows下,set ANDROID_HOME=/home/vnbo/android_env/sdk

                 b ) gradle is not defined

                     解决: 个人主目录下添加:

                       GRADLE_HOME=/opt/android-studio2/gradle
                      export PATH=$PATH:$GRADLE_HOME/bin
                c)  如果在build.gradle文件中,添加:

                  

                   productFlavors {
                        tylauncher {
                        }
                  }
               那么执行的命令为:
               ./gradlew clean nuwaTylauncherDebugPatch -P NuwaDir=/home/vnbo/hotFixTest/nuwa
   

  8.  执行完上面命令之后,会有文件:./app/build/outputs/nuwa/debug/patch.jar  。

    我们将这个文件push 到sdcard目录下。

adb push ./app/build/outputs/nuwa/debug/patch.jar /sdcard/
  9. 重新启动应用程序即可看到效果了。

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值