1. 程式人生 > >熱修復框架nuwa的使用

熱修復框架nuwa的使用

配置

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
打包什麼的不是自動化,必須手動的將改動檔案提取打包,可用性太低。

參考連結