What--什么是HotFix
HotFix是針對(duì)某一個(gè)具體的系統(tǒng)漏洞或安全問題而發(fā)布的專門解決該漏洞或安全問題的小程序炼幔,通常稱為修補(bǔ)程序
Why--為什么我們要用HotFix
試想這樣一個(gè)場(chǎng)景:當(dāng)Android發(fā)布App之后缚态,如果突然發(fā)現(xiàn)了一個(gè)嚴(yán)重bug,而這個(gè)bug需要進(jìn)行緊急修復(fù)
這時(shí)候我們通常的處理流程是:解決bug、重新打包App、測(cè)試、向各個(gè)應(yīng)用市場(chǎng)和渠道換包瘦棋、提示用戶升級(jí)、用戶下載锌奴、覆蓋安裝兽狭。有時(shí)候僅僅是為了修改了一行代碼,也要付出巨大的成本進(jìn)行換包和重新發(fā)布鹿蜀。用戶體驗(yàn)來(lái)很是糟糕
Question: 有沒有辦法不重新發(fā)布App箕慧,不需要用戶重新下載覆蓋安裝,就可以完成Bug的修復(fù)茴恰?
答案是Yes颠焦,HotFix就是做這個(gè)事情的。Android HotFix原理介紹可以參照這里:HotFix
Nuwa(女媧)是一個(gè)自動(dòng)化的工具往枣,基于上述原理將驟自動(dòng)化了伐庭,下面我就介紹一下如何使用
How--怎么用
添加Gradle Plugin
在工程的根build.gradle文件中添加
classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
然后我們的build.gradle文件可能長(zhǎng)這樣:
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文件可能長(zhǎng)這樣:
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'
}
【備注】 這邊有個(gè)坑,2.0版本的Android Studio為了支持Instant Run
, 默認(rèn)使用的Gradle Plugin是2.0.0-alpha2
, 如果用此版本分冈,會(huì)報(bào)錯(cuò)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.運(yùn)行并安裝apk雕沉,會(huì)在app/build/outputs/
目錄下自動(dòng)生成一個(gè)叫nuwa
的目錄:
拷貝此目錄到一個(gè)指定的目錄集乔,比如:
/Users/Documents/nuwa
此apk目前是有bug的apk, 然后我們修復(fù)bug, 修復(fù)完畢后進(jìn)入步驟3
3.在修復(fù)完bug的code base下執(zhí)行如下命令:
./gradlew clean nuwaDebugPatch -P NuwaDir=/Users/Documents/nuwa
然后在app/build/outputs/nuwa/debug/
目錄下會(huì)自動(dòng)生成patch.jar
文件:
此文件就是我們熱部署的補(bǔ)丁文件
4.我們把補(bǔ)丁文件拷貝到sdcard根目錄(這邊只是為了測(cè)試整個(gè)hotfix流程, 自己的項(xiàng)目肯定是放在服務(wù)器上坡椒,我們通過(guò)代碼自己去下載和存儲(chǔ))
adb push app/build/outputs/nuwa/debug/patch.jar /sdcard/
5.重新啟動(dòng)app扰路,Bug Fix??
代碼混淆
在proguard-rules.pro中添加:
-keep class cn.jiajixin.nuwa.** { *; }
我寫了一個(gè)簡(jiǎn)單地例子用于演示,點(diǎn)此查看