安卓熱更新之Nuwa實現步驟,安卓nuwa實現步驟
安卓熱更新之Nuwa實現步驟
最近熱更新熱修複的功能在安卓應用上越發火熱,終於我的產品也提出了相應的需求。
經過兩天的研究,搞定了這個功能,在這裡還要多謝大神們的部落格,大神們的原理分析很到位,不過對於我來說最大的障礙還是在git的使用、打jar包出現的一些錯誤上,所以在這裡寫出具體些的實現步驟,希望可以幫到那些和我水平差不多的小蝦。
熱更新的架構有很多,比如AndFix、HotFix、Dexposed以及Nuwa,在考慮相容性和功能需求之後我還是選擇了Nuwa,因為這個架構可以新增類和欄位,並且相容到Android6.0系統。
現在市面上的熱更新架構基本原理都是classloader,也就是類載入器,這也就限制了我們不可以修改資源檔,片布局等,有這方面需求的小夥伴還要想其他辦法,比如動態布局。
我們先來說下準備工作,首先你的開發工具必須是Android Studio,因為在打jar包時需要使用.gradle檔案。其次電腦上要有一個本地的git庫,以方便管理新舊版本,使用git命令較為方便,要下載nuwa庫,並且user library到你的項目中,不會這個步驟的同學請自行百度,在這裡推薦一個github上的項目,裡面有整合好的nuwa庫。
https://github.com/jasonross/Nuwa
假設我們已經建立好一個項目,並且成功整合nuwa,現在我們需要一個git,如果沒有安裝git的同學請按照下面這篇教程安裝,這篇教程通俗易懂。
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
git安裝成功後,要建立一個本地版本庫,選擇一個合適的檔案路徑,輸入以下git命令:
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的熱更新流程已經瞭解的差不多,寫這篇部落格很用心,因為自己的研究熱更新的時候遇到了很多頭大的問題,所以想要分享給那些和我一樣正在研究或未來要研究這個功能的人,如果大家有要補充的或者哪個步驟遇到問題,歡迎留言,我會及時回複。