Nuwa框架的使用步骤以及demo演示

本文详细介绍了如何使用Nuwa框架进行热修复,包括配置build.gradle,继承Application,创建补丁包,以及将补丁包应用到模拟器中验证修复效果。通过实例展示了Nuwa框架在修复bug过程中的作用。
我们并不需要导入jar包,加入项目依赖什么的,只要按照步骤配置即可使用Nuwa框架。本篇博文demo的地址在博客底部。

一、配置Project的build.gradle

有两个build.gradle,一个是project,一个是模块app,先配置project的build.gradle。在buildscript块的dependencies块里添加下面这行:
classpath ‘cn.jiajixin.nuwa:gradle:1.2.2’

完整如下:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        //注意gradle版本过高会出现问题,可以使用低版本试试,比如本demo中的1.2.3
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

二、配置app的build.gradle

  • 我们在app的build.gradle的开头加入下行:
    apply plugin: “cn.jiajixin.nuwa”

  • 在dependencies块中加入下行:
    compile ‘cn.jiajixin.nuwa:nuwa:1.0.0’

  • 对debug添加混淆,如下(后续可能会遇到一个问题Error:Execution failed for task’:app:nuwaClassBeforeDexDebug’.> 1
    这个是该问题的解决方案):

buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

最后整体配置如下:

apply plugin: 'com.android.application'
apply plugin: "cn.jiajixin.nuwa"
android {
    compileSdkVersion 23
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example.gao.nvwatest"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


nuwa {
    //括号里是Application类以及要排除Application父类
    excludeClass = ['com/example/gao/nvwatest/MyApplication.class']
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.0.0-alpha1'
    compile 'cn.jiajixin.nuwa:nuwa:1.0.0'

}

三、继承Application,重写attachBaseContext对Nuwa进行配置

protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //下面两行是对Nuwa的配置,由第二行得知我们需要将后续制作的补丁包放入sd卡中
        Nuwa.init(this);
        Nuwa.loadPatch(this, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/patch.jar"));

    }

完整如下(其实就是多了上面那个配置):

public class MyApplication extends Application {

    private static Context context;

    public void onCreate(){
        super.onCreate();
        MyApplication.context = getApplicationContext();

    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        Nuwa.init(this);
        Nuwa.loadPatch(this, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/patch.jar"));

    }

    public static Context getAppContext() {
        return MyApplication.context;
    }
}

四、demo的布局文件

我们布局很简单,只是一个TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    />
</LinearLayout>

五、MainActivity
在MainActivity中对TextView进行设置文本

public class MainActivity extends Activity {
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        textView = (TextView)findViewById(R.id.textView);
        textView.setText("存在Bug!");
    }


}

六、AndroidManifest.xml

  • 通过name属性设置application
 android:name=".MyApplication"
  • 增加MainActivity的声明

  • 增加sd卡的读写权限

完整如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gao.nvwatest">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <application

        android:name=".MyApplication"

        android:allowBackup="true" android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

七、补丁包的制作

  • 运行项目,结果如下
    这里写图片描述

  • 进入项目所在目录,在app\build\outputs目录下有个nuwa文件夹,复制到一个地方,我复制到了D盘(之所以复制是因为当我们改了源码后生成的nuwa文件与这个nuwa文件作比较,由差异生成补丁包)。
    这里写图片描述

  • 将上图中的nuwa文件夹复制到D盘以后,我们就可以修改我们的源码了,比如将文本设置为”Bug已经修复!”,然后编译(不要安装,要不然就不叫热修复了。。。。)
    这里写图片描述

  • 编译后,在项目的app\build\outputs目录下其实就生成了新的nuwa文件夹,进入Android Studio的命令行,输入下行(复制到D盘,你也可以更改最后的NuwaDir的值):

gradlew clean nuwaDebugPatch -P NuwaDir=D:/nuwa

你可能看到一个这样的命令:

gradlew clean nuwaQihooDebugPatch -P NuwaDir=D:/nuwa

其中Qihoo是根据渠道包产生的,我们是demo,所以是nuwaDebugPatch。

那这个命令是干什么的呢?

执行这个命令之后,会在app/build/outputs/nuwa/debug/目录下会自动生成patch.jar文件,这个补丁包是由我们更改源码后编译后的nuwa文件与我们之前复制到D盘的nuwa文件作比较,根据差异性生成的补丁包。

有些小伙伴可能在执行这个命令之后会下载东西,就慢慢等待吧,我是等了半个小时……

还有个问题,小伙伴可能会遇到下面这个问题:
这里写图片描述

ANDROID_HOME is not defined 这个问题我们需要将Android SDK的路径设给它,在Android Studio 的命令行中输入:

set ANDROID_HOME=SDK所在目录

下面是根据我的SDK所在目录的命令的截图:
这里写图片描述

OK,问题解决了,继续上面那个生成补丁包的命令,试试:

gradlew clean nuwaDebugPatch -P NuwaDir=D:/nuwa

显示BUILD SUCCESSFUL
这里写图片描述

那么我们的补丁包就生成成功了,就在项目的app\build\outputs\nuwa\debug目录下,如图
这里写图片描述

OK,补丁包制作完成。

八、将补丁包放入sd卡中,然后在模拟器中重新打开程序,看是否修改成功

将文件放入sd卡中有一个命令
adb push 文件所在目录 sd卡目录

但是我这样做会出错,所以用了另个方法,打开Android Studio的Android Device Monitor
这里写图片描述

在File Explorer一栏里找到sdcard,选中,然后点下图中红圈圈中的小图标
这里写图片描述

然后找到patch.jar所在目录,将其导入即可。

OK,大功告成,重启程序,看看已显示Bug已经被修复!
不管你们有没有显示这个,反正我是没显示,我重启了模拟器才显示,不过大家可以尝试杀死进程,清理缓存。

最后结果截图
这里写图片描述

demo地址:
https://github.com/codergz/NvwaTestDemo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值