总结一下热修复框架nuwa的使用和,使用过程中遇到的问题https://github.com/jasonross/Nuwa
文中demo位置https://github.com/nononopro/nuwaExample
1.在project的biuld.gradle中加入
classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
之后我们的文件类似于这样
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
}
2.在app的build.gradle添加
compile 'cn.jiajixin.nuwa:nuwa:1.0.0'
apply plugin: "cn.jiajixin.nuwa"
然后构建,注意如果构建过程中出现错误
Error:Cannot get property 'taskDependencies' on null object
是因为gradle版本是1.5将其回退到1.2.1
3.在项目的BaseApplication中添加
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
Nuwa.init(this);
}
到此基本配置完成,这个过程可能会遇到一些问题我们后边再说。
使用很简单Nuwa.loadPatch(this,patchFile)
需要加载的地方加载你的补丁包patch.jar,通常在app启动的时候。这里我放在BaseApplication里
public class BaseApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
Nuwa.init(this);
Nuwa.loadPatch(this, Environment.getExternalStorageDirectory().getAbsolutePath().concat("/patch.jar"));
Log.e("nuwa",Environment.getExternalStorageDirectory().getAbsolutePath().concat("/patch.jar"));
}
}
以我的demo为例,MyApplication编译运行然后进入C:\MyProject\MyApplication\app\build\outputs`将文件夹下的nuwa文件夹拷贝到一个目录下,我们这里拷贝到C:\nuwa,现在将项目拷贝一份放入其它目录修改其中的类,相当于改bug的过程,修改完成后进入项目根目录如图
在这里打开命令窗口输入
gradlew clean nuwaDebugPatch -P NuwaDir=C:/nuwa
会在当前工程的app\build\outputs\nuwa\debug目录下生成补丁包patch.jar
将补丁包copy进手机adb push patch.jar /sdcard/,这个补丁包正常应该放在服务器,下载得到。
重启app,可以看到补丁包被正确加载
1.刚才说过的Error:Cannot get property 'taskDependencies' on null object
gradle版本1.5会报这个错,回退至1.2.1解决
2.运行报错
Error:Execution failed for task ':app:nuwaClassBeforeDexDebug'.
> 1
解决方法将debug模式也添加混淆
`buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
3.打包时作者给的命令是./gradlew clean nuwaQihooDebugPatch -P NuwaDir=/Users/jason/Documents/nuwa
后边的NuwaDir我们知道了就是我们拷贝出来的nuwa文件夹的路径,nuwaQihooDebugPatch 注意这个参数其中的qihoo是根据渠道生成的,我们自己如果不指定渠道没这个文件夹自然会找不到路径,我这里没有设置所以是这样gradlew clean nuwaDebugPatch -P NuwaDir=C:/nuwa
4.Could not find class ‘cn.jiajixin.nuwa.Hack’, referenced from method a.a.a.a.b.解决:proguard-rules.pro中加入-keep class cn.jiajixin.nuwa.** { *; }
防止被混淆
5.E/nuwa: /storage/emulated/0/patch.jar is null如果你的读取路径都没问题看一下权限是否打开
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
6.java.lang.NoClassDefFoundError: cn.jiajixin.nuwa.Hack 如果报这个错那么将你的报错的BaseApliication在app的gradle中如下配置,nuwa{ }与android{}平级
nuwa {
excludeClass = ['BaseApplication.class']
}
除了nuwa之外还有其他开源框架,之前看的是https://github.com/dodola/HotFix
打包什么的不是自动化,必须手动的将改动文件提取打包,可用性太低。
https://github.com/jasonross/Nuwa/issues
https://github.com/jasonross/Nuwa
https://zhuanlan.zhihu.com/p/20308548
想看源码讲解的话看看这个博主的文章Android 热修复Nuwa的原理及Gradle插件源码解析