安卓熱更新之Nuwa實現步驟

最近熱更新熱修復的功能在安卓應用上愈加火熱,終於個人產品也提出了相應的需求。java

  通過兩天的研究,搞定了這個功能,在這裏還要多謝大神們的博客,大神們的原理分析很到位,不過對於我來講最大的障礙仍是在git的使用、打jar包出現的一些錯誤上,因此在這裏寫出具體些的實現步驟,但願能夠幫到那些和我水平差很少的小蝦。android

  熱更新的框架有不少,好比AndFix、HotFix、Dexposed以及Nuwa,在考慮兼容性和功能需求以後我仍是選擇了Nuwa,由於這個框架能夠新增類和字段,而且兼容到Android6.0系統。git

  如今市面上的熱更新框架基本原理都是classloader,也就是類加載器,這也就限制了咱們不能夠修改資源文件,如圖片佈局等,有這方面需求的小夥伴還要想其餘辦法,好比動態佈局。github

  咱們先來講下準備工做,首先你的開發工具必須是Android Studio,由於在打jar包時須要使用.gradle文件。其次電腦上要有一個本地的git庫,以方便管理新舊版本,使用git命令較爲方便,要下載nuwa庫,而且user library到你的項目中,不會這個步驟的同窗請自行百度,在這裏推薦一個github上的項目,裏面有集成好的nuwa庫。windows

https://github.com/jasonross/Nuwa服務器

  假設咱們已經建立好一個項目,而且成功集成nuwa,如今咱們須要一個git,若是沒有安裝git的同窗請按照下面這篇教程安裝,這篇教程通俗易懂。app

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000框架

  git安裝成功後,要新建一個本地版本庫,選擇一個合適的文件路徑,輸入如下git命令:ide

mkdir hotfix 是建立名爲hotfix的本地版本庫,cd hotfix是定位到版本庫,pwd是輸出版本庫位置,若是你是在windows系統上使用,爲了不不可測問題,請保證路徑中沒有特殊符號及中文。工具

  建立好庫後要使用命令將其變成git可管理的版本庫:

建立成功後,會發現文件夾中出現一個.git文件,若是你的看不到,那多是由於這個文件是隱藏的,使用ls -ah命令試試看。

  版本庫建立成功了,如今咱們要作的就是將剛剛建立的項目導入到版本庫中,拷貝你的項目到hotfix文件夾中,而且使用如下命令:

git add 後面跟着的是你的項目名稱,在add過程當中會出現一系列waning警告,不要理,只要不出error就好。add成功後,再提交一次代碼,若是沒有問題就你的項目就導入成功了:

提交過程當中又會出現一系列warning,不用理。這裏須要注意的是-m後面是你每次提交的註釋,不可爲空,爲了方便之後維護,但願你們能夠寫清本次提交緣由。

  成功將項目導入,下面咱們就要開始寫代碼了,若是你的項目是從剛剛推薦的github上拉下來的,那你項目中應該有完整代碼,不是的童鞋請跟我一步步完成代碼。

  熱更新的原理大概就是從服務器拉取一個補丁文件,而後用類加載器加載這個補丁中的類,若是咱們想要實如今項目開始時就加載出這個補丁文件,那麼加載補丁的操做就要放在Application類中實現,代碼以下:

複製代碼

import android.app.Application;
import android.content.Context;
import android.os.Environment;

import cn.jiajixin.nuwa.Nuwa;

public class NuwaApplication extends Application {

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

複製代碼

  很簡單,nuwa框架已經封裝好了不少操做,咱們只須要調用就好,loadpatch方法中的參數是補丁文件的位置,應該從服務器動態獲取文件,並存儲到sdcard指定項目專用目錄,在這裏咱們是測試demo,就簡單的固定好jar文件位置,sdcard根目錄。在這裏提醒一下粗心的同窗,不要忘記在Manifest文件中配置Appliction。

  其餘只須要在MainActivity中顯示要輸出的文字,這裏咱們將文字單放在一個類中,以便改變:

複製代碼

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import cn.jiajixin.nuwasample.Hello.Hello;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.textview);
        textView.setText(new Hello().say());
    }

}

複製代碼

public class Hello {
    public String say() {
        return "hello world";
    }
}

  好了,代碼已經寫完了,是否是很簡單?如今要注意,下面是一些核心步驟,這是在其餘文案上找不到的。

  咱們要在剛剛創建的本地版本庫上創建一個bugfix分支,hotfix文件夾中打開git,並輸入如下命令:

git branch bugfix 是新建一個名爲bugfix的分支,git checkout bugfix是轉到這個分支下,好了,如今對比如下兩個分支的代碼,應該是如出一轍的,如今使用命令:git checkout master切換回主分支。

  使用android studio運行項目到手機上,成功運行以後,會在項目的目錄下建立一個nuwa文件夾,若是你是本身建立的項目,那麼路徑應該是app/build/outputs/nuwa,若是你是導入github上的項目,路徑應該是sample/build/outputs/nuwa,將nuwa文件夾拷貝到一個位置,好比桌面,個人是C:\Users\thinkpad\Desktop\nuwa,這個地方你們要注意,每一個人拷貝的位置不一樣,一會使用時路徑必定要匹配。

  如今使用git checkout bugfix命令切換到bugfix分支上,修改Hello類下面的輸出字符串,以下:

public class Hello {
    public String say() {
        return "hello world I'm hotfix";
    }
}

改好以後咱們就要經過git命令調用.gradle來打一個jar包,千萬注意,不要運行bugfix分支上的項目。

  若是你是本身新建的app,要在項目中新建一個名爲extras的文件夾:

在文件夾中有兩個配置文件,一個是名爲hack的空java類,另外一個文件裏面寫好了一段使用dx封裝jar包的命令:

  配置好這兩個文件後,再在hotfix中開啓git,在git中輸入./gradlew clean nuwaQihooDebugPatch -P NuwaDir=C:/Users/thinkpad/Desktop/nuwa,這裏有兩點須要注意,NuwaDir=後面跟着的路徑就是剛剛master分支運行項目時,生成的nuwa文件夾,具體路徑要看你們拷貝的地址。還有就是由於這個命令是調用.gradle文件,咱們的版本庫是兩層文件夾,須要cd進入到Nuwa項目文件夾中運行該命令:

運行成功後你會在你想項目目錄下看到一個名爲patch.jar的文件,若是你是新建的項目,具體路徑應該爲app\build\outputs\nuwa\qihoo\debug\patch.jar,若是你是從github上拉下來的項目,路徑應爲sample\build\outputs\nuwa\qihoo\debug\patch.jar。

  將上面生成的jar文件導入到手機sdcard文件根目錄,你能夠選擇經過電腦拷貝或者使用安卓命令:

adb push E:hotfix\Nuwa\app\build\outputs\nuwa\qihoo\debug\patch.jar /sdcard/

  你們寫了這麼久,終於到了收穫的時候,如今先退出剛剛在手機上安裝的master分支上的項目,完全退出,殺死進程。而後再從新進入,有沒有驚喜的發現以前的"hello world"變成了咱們修改的"hello world I'm hotfix"?這就實現了補丁方式的熱更新,並且使用nuwa框架是能夠新建類的哦,雖然不能更改資源文件,可是配合動態佈局使用仍是能實現大部分需求的。

  好了,相信如今你們對nuwa的熱更新流程已經瞭解的差很少,寫這篇博客很用心,由於本身的研究熱更新的時候遇到了不少頭大的問題,因此想要分享給那些和我同樣正在研究或將來要研究這個功能的人,若是你們有要補充的或者哪一個步驟遇到問題,歡迎留言,我會及時回覆。

相關文章
相關標籤/搜索