我们并不需要导入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已经被修复!
不管你们有没有显示这个,反正我是没显示,我重启了模拟器才显示,不过大家可以尝试杀死进程,清理缓存。
最后结果截图
本文详细介绍了如何使用Nuwa框架进行热修复,包括配置build.gradle,继承Application,创建补丁包,以及将补丁包应用到模拟器中验证修复效果。通过实例展示了Nuwa框架在修复bug过程中的作用。
936

被折叠的 条评论
为什么被折叠?



