What--什么是HotFix
HotFix是針對某一個具體的系統漏洞或安全問題而發布的專門解決該漏洞或安全問題的小程序,通常稱為修補程序
Why--為什么我們要用HotFix
試想這樣一個場景:當Android發布App之后,如果突然發現了一個嚴重bug,而這個bug需要進行緊急修復
這時候我們通常的處理流程是:解決bug、重新打包App、測試、向各個應用市場和渠道換包、提示用戶升級、用戶下載、覆蓋安裝。有時候僅僅是為了修改了一行代碼,也要付出巨大的成本進行換包和重新發布。用戶體驗來很是糟糕
Question: 有沒有辦法不重新發布App,不需要用戶重新下載覆蓋安裝,就可以完成Bug的修復?
答案是Yes,HotFix就是做這個事情的。Android HotFix原理介紹可以參照這里:HotFix
Nuwa(女媧)是一個自動化的工具,基于上述原理將驟自動化了,下面我就介紹一下如何使用
How--怎么用
添加Gradle Plugin
在工程的根build.gradle文件中添加
classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
然后我們的build.gradle文件可能長這樣:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
}
}
添加Nuwa SDK
在app的build.gradle中添加依賴:
apply plugin: "cn.jiajixin.nuwa"
然后我們的build.gradle文件可能長這樣:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'cn.jiajixin.nuwa:nuwa:1.0.0'
}
【備注】 這邊有個坑,2.0版本的Android Studio為了支持Instant Run
, 默認使用的Gradle Plugin是2.0.0-alpha2
, 如果用此版本,會報錯Error:Cannot get property 'taskDependencies' on null object
,乖乖降低到1.2.3,木有此問題
使用Nuwa
1.自定義Application,并且在Application類中添加如下代碼:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
Nuwa.init(this);
Nuwa.loadPatch(this,"/sdcard/patch.jar")
}
2.運行并安裝apk,會在app/build/outputs/
目錄下自動生成一個叫nuwa
的目錄:
拷貝此目錄到一個指定的目錄,比如:
/Users/Documents/nuwa
此apk目前是有bug的apk, 然后我們修復bug, 修復完畢后進入步驟3
3.在修復完bug的code base下執行如下命令:
./gradlew clean nuwaDebugPatch -P NuwaDir=/Users/Documents/nuwa
然后在app/build/outputs/nuwa/debug/
目錄下會自動生成patch.jar
文件:
此文件就是我們熱部署的補丁文件
4.我們把補丁文件拷貝到sdcard根目錄(這邊只是為了測試整個hotfix流程, 自己的項目肯定是放在服務器上,我們通過代碼自己去下載和存儲)
adb push app/build/outputs/nuwa/debug/patch.jar /sdcard/
5.重新啟動app,Bug Fix??
代碼混淆
在proguard-rules.pro中添加:
-keep class cn.jiajixin.nuwa.** { *; }
我寫了一個簡單地例子用于演示,點此查看