当你的应用发布后第二天却发现一个重要的bug要修复,头疼的同时你可能想着赶紧修复重新打个包发布出去,让用户收到自动更新重新下载。但是万事皆有可能,万一隔一天又发现一个急需修复的bug呢?难道再次发布打扰用户一次?

这个时候就是热修复技术该登场的时候了,它可以让你在无需发布新版本的前提下修复小范围的问题。最近研究了下几个热修复的开源框架,其中Nuwa等框架的原理是修改了gradle的编译task流程,替换dex的方式来实现。但是可惜的是gradle plugin在1.5以后取消了predexdebug这个task,而Nuwa恰恰是依赖这个task的,所以导致Nuwa在gradle plugin1.5版本后无法使用。

所以我们这里将探讨另一个热修复框架AndFix,它的原理简单而纯粹。本文将从实战项目应用和原理两个角度来阐述,同时将阐述项目中引用该框架后带来的影响(微乎其微)。

引入


首先AndFix的主要实现是CPP实现,而且只有几个很小的文件。同时提供了dalvik和ART两个版本的so通过JNI供上层Java层调用。所以显然AndFix的一个最大优点是支持Dalvik和ART两种运行时环境,同时它支持Android2.3 - 6.0版本,支持arm和x86架构CPU的设备。改框架的作者团队是支付宝,相传已经应用到了阿里巴巴的一些应用上(真实性不详)

首先在你的项目中添加以下gradle依赖:

    compile 'com.alipay.euler:andfix:0.3.1@aar'

随后在你的自定义Application中加入一个属性,同时添加getter方法,这里后面要用到:

    private PatchManager patchManager;
public PatchManager getPatchManager() {
return patchManager;
}

然后在Application的onCreate中初始化AndFix:

// init AndFix
patchManager = new PatchManager(this);
patchManager.init(AppUtils.getVersionName(this));
patchManager.loadPatch();

同时继续写上这么一段代码:

// get patch under new thread
Intent patchDownloadIntent = new Intent(this, PatchDownloadIntentService.class);
patchDownloadIntent.putExtra("url", "http://xxx/patch/app-release-fix-shine.apatch");
startService(patchDownloadIntent);

这段代码的含义后面讲具体阐述,这里你只需要知道我们新建了一个IntentService在另起的线程中下载http://xxx/patch/app-release-fix-shine.apatch这个patch文件,然后下载完毕后调用patchManager进行热修复工作。

详细的PatchDownloadIntentService代码:

/**
* 用于下载Patch热修复文件的service
*/
public class PatchDownloadIntentService extends IntentService { private int fileLength, downloadLength; public PatchDownloadIntentService() {
super("PatchDownloadIntentService");
} @Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
String downloadUrl = intent.getStringExtra("url"); if (StrUtils.isNotNull(downloadUrl)) {
downloadPatch(downloadUrl);
}
}
} private void downloadPatch(String downloadUrl) {
File dir = new File(Environment.getExternalStorageDirectory() + "/shine/patch");
if (!dir.exists()) {
dir.mkdir();
} File patchFile = new File(dir, String.valueOf(System.currentTimeMillis()) + ".apatch");
downloadFile(downloadUrl, patchFile);
if (patchFile.exists() && patchFile.length() > 0 && fileLength > 0) {
try {
CustomApplication.getInstance().getPatchManager().addPatch(patchFile.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
} private void downloadFile(String downloadUrl, File file){
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e) {
L.e("can not find saving dir");
e.printStackTrace();
}
InputStream ips = null;
try {
URL url = new URL(downloadUrl);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("GET");
huc.setReadTimeout(10000);
huc.setConnectTimeout(3000);
fileLength = Integer.valueOf(huc.getHeaderField("Content-Length"));
ips = huc.getInputStream();
int hand = huc.getResponseCode();
if (hand == 200) {
byte[] buffer = new byte[8192];
int len = 0;
while ((len = ips.read(buffer)) != -1) {
if (fos != null) {
fos.write(buffer, 0, len);
}
downloadLength = downloadLength + len;
}
} else {
L.e("response code: " + hand);
} } catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
}
if (ips != null) {
ips.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} }

到此,一个关键问题来了,就是那个.apatch文件到底是什么?它是怎么来的?

热修复开发流程和patch文件制作


首先放出大致的推荐开发流程:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGEAAAHQCAIAAACOXOASAAAgAElEQVR4nO3db2xcV3rf8UEC5KUcIW/yRnAAA0UQ1UCBqE0Kpe66aCChMPKWC1yjKBCsEsco6A2RBhICbMU2MYQEFQKuGwdaFVk6CBdYOWzNKIsly8KCWNroZrh2TMZrzsokRbCzZDTwhJylOPzT0xcPee7RuX/mkDO898zh94PnBTWcuXNn+Ax1fjz3nltRAAAAAIAjlbJ3AAAAAAA8QkYCAAAAgBgZCQAAAABiZCQAAAAAiJGRAAAAACBGRgIAAACAGBkJAAAAAGJkJAAAAACIkZEAAAAAIEZGAgAAAIAYGQkAAAAAYmQkAAAAAIiRkQAAAAAgRkYCAAAAgBgZCQAAAABiZCQAAAAAiJGRAAAAACBGRgIAAACAGBkJAAAAAGJkJAAAAACIkZEAAAAAIEZGAgAAAIAYGQkAAAAAYmQkAAAAAIiRkQAAAAAgRkYCAAAAgBgZCQAAAABiZCQAAAAAiJGRAAAAACBGRgIAAACAGBkJAAAAAGJkJAAAAACIkZEAAAAAIEZGAgAAAIAYGQkAAAAAYmQkAAAAAIiRkQAAAAAgRkYCAAAAgBgZCQAAAABiZCQAAAAAiJGRAAAAACBGRgIAAACAGBkJAAAAAGJkJAAAAACIkZEAAAAAIEZGAgAAAIAYGQkAAAAAYmQkAAAAAIiRkQAAAAAgRkYCAAAAgBgZCQAAAABiZCQAAAAAiJGRAI+8/NVvUMFX2V3WA6W/h1QBVXaXpSj9PaEKqLK7DDhERgI88vJXvxHdWaACrjBGADRq8OVno9J4wZefjYeziYwEeIQRQPAVxgiARg2+/GxUGi/48rPxcDaRkQCPMAIIvsIYAdCowZefjUrjBV9+Nh7OJjIS4BFGAMFXGCMAGjX48rNRabzgy8/Gw9lERgI8wggg+ApjBECjBl9+NiqNF3z52Xg4m8hIgEcYAQRfYYwAaNTgy89GpfGCLz8bD2cTGQnwCCOA4CuMEQCNGnz52ag0XvDlZ+PhbCIjAR5hBBB8hTECoFGDLz8blcYLvvxsPJxNZCTAI4wAgq8wRgA0avDlZ6PSeMGXn42Hs4mMBHiEEUDwFcYIgEYNvvxsVBov+PKz8XA2kZEAjzACCL7CGAHQqMGXn41K4wVffjYeziYyEuARRgDBVxgjABo1+PKzUWm84MvPxsPZREYCPMIIIPgKYwRAowZffjYqjRd8+dl4OJvISIBHGAEEX2GMAGjU4MvPRqXxgi8/Gw9nExkJ8AgjgOArjBEAjRp8+dmooTZevdkena2Xvhs+lJ+Nh7OJjAR4JNQRAKUrjBEAjRp8+dmo/d54g2OLI9Or1o3jcxtKqdr6dum750P52Xg4m8hIgEf6fQRAdawwRgA0avDlZ6P2V+MNji1WlzfNarR223sHwxNL5t1WGk/rzfb8WitnU8MTS8edaJpcaPRj7vKz8XA2kZEAj/TXCIA6QYUxAqBRgy8/G7XvGs+aNVppPLVyy/DEklJqdLY+udDIT0FmjkqmL6vm11ryjvVdTPKz8XA2kZEAj/TdCIA6boUxAqBRgy8/G7UfG6+6vKknjurNdnV50/yuTk2DY4uN1u7g2GLWdkamV5VS+uEj06vWnZMb78fys/FwNpGRAI/04wiAOlaFMQKgUYMvPxu1Hxuv3mw3Wrvy9dbO/uRCQ39rdLbe3jvQUae6vJk/7dNo7eYckkdGAnqLjAR4pB9HANSxKowRAI0afPnZqP3YeI3W7kytKV8rpcwD6hqt3fG5DfPOWzv7OTFpdLaeM9FERgJ6i4wEeKQfRwDUsSqMEQCNGnz52aj92HjqKBcNji0qpfQZSvNrrWSkGZlebe8drDSeWus6uBQZCegtMhLgkX4cAVDHqjBGADRq8OVno/Zd45m5aHS2rpSS27MWnZtcaEwuNOTFJgOPtajDyPRqdXlTzyyRkYDeIiMBHum7EQB13ApjBECjBl9+NmrfNZ6Zi/TXI9OrM7WmJByzVhpPlVK19e3xuQ192pK+W219Wyllno8kG9T3JCMBvUVGAjzSdyMA6rgVxgiARg2+/GzUvmu8yYXG1s6+fF1d3qw324Nji/o4OsdLHsndJBGZ5yOZASx6NiMNji3W1rdPcMBe6eVn4+FsIiMBHum7EQB13ApjBECjBl9+Nmp/Nd7g2GK92d7a2ZeJIPl6pfF0pfFUR53hiSUryYzPbaQuzGAlouQt9WZbYpJcrFYplb+YuJ/lZ+PhbCIjAR7prxEAdYIKYwRAowZffjZq3zXeyPSqudh3dGeh3myvNJ5Gdxb07fJP8w7mguC6XDISx9oBPURGAjzSdyMA6rgVxgiARg2+/GzUABpPJxk9m2QtcKfSVmuIyEhA4chIgEcCGAFQ+RXGCKCURq0ub1oXk5GqN9vWn+pdNtX9aLLebLucT3Ksc0Jq69uTCw0fjo/ys1H7/Tfk4Nji1s6+XC5JXzFWoo70iXVVWbPISEDByEiAR/p9BEB1rDBGAKU06tbOfvL8ChkmpmanrBqeWJJL0Ogr1aSWrMJs3Wg+u3r2eqDJGp/bqDfbyrgkTseS46wcT+U/1fKzUfvrN+TI9OrobF2yUG19u7q8OTyxpI7axoxG6mjuaH6tlXUNWTMRycIPZCTgVJGRAI/01wiAOkGFMQIovlFHpldVWiaprW9bp3NEnaZuZIVlOcApq+bXWvJKkyeT1Na3JSkpY3g6OLYoNw5PLMmlb9p7B43Wrgxb3ae55LT70rvU20btr9+QknglGuk+UUdtLHlJ5pQarV1p40ZrN6t7dSKSNesGxxbJSMCpIiMBHumvEQB1ggpjBFB8o86vtfQayrpklCl/oTervXeQ9cf4yYVGe+/AfWLHqnqzrS9Qo4zhqRwiJXsyPrfRzfbJSDn66zfk8MRS6rSn/qc6ykjV5c2R6dXhiaWcn75e+7vebCcvShuRkYBeIyMBHvFqBCDHcpzgge29g/beQen7n1UztaY6GpoUX2GMAIpv1K2d/eRsjGQS86qacmPW4Woj06tbO/sdD8wbmV7NOiPIHIaqZzOSevZckZNVVkbSUweFveF+NqpXvyFPUDO1phn1Z2pN82c6U2vmTDlKjzVau/o+ZCTgVJGRAI8UNgIYnliaX2vJNTREo7VbW982R5btvQN1oiwhGyz9/9qsqi5vqoyVowqoMEYABQ9VzRPZdcgZna3rNZT1qFECUuo0jgSkkenV6vKmvmRNaslhcqmBpCcZaabWzHrqrZ391H0r/nI3fjZqP2akyYWGTC3Kgg1ZM5zRnQWd9qVLk9tRSplHlnbMSLX17RNPaZZVfjYeziYyEuCRYkYAMpEi5O/Wcma50P+nyrDM/KO7nMjR8T9d2U7p/9dmFRmpewUPVaXxJAgppeQim+aFOGVpu/yAVG+25UyP8bkNldufSqmsgWwyI8nYNycjJWe0kpcNNV+mJ7MBfjZqP2ak6OgIT6VUe+9ADsBLTciN1q5O6SpxLpwcZTc4tigJSpaCUEqZAVtfQ7a6vCntJM9Y+jvQ742Hs4mMBHikgBGADkjV5U3rb9Ljcxv5x/NIlOp4AJ5sv/T/a7OKjNS9IoeqsgydOmo8+cJaIHtwbFHukxqQRmfr5nRoxzkfld0e8gcFGYPK3WTSSXJX1toPOVMH5suU97bebI/PbRxrpb6z06h9mpGiOwuTCw19HlF0Z6HL6Z2+mx1yLz8bD2cTGQkowY/+oZ16+2mPAPQ47LjXk5EiI3Vf/TUC2Njc/XF7P3l7kUPVlcZTCfZmRjLvMDyxJMuCyTpyHf9qLhkp51g7lZuR8q/vaX1XluNzCTzmUnjyqkvpT08atdHa3d3/f8nb+zcjUY7VX78hETYyElCCN761+F8mHy8/eWrdftojADk2w+Wv2tGzR9bJwNGSFZbku/KorZ19pZScYpHceHRnQf7Q3t47kHGkHIWiT5QyT1C2Hji50JCNt/cO5tdayemvyYVG6nb0IHhkelW2ppRaaTwt5oiU/hoBPPjsi6988wfvVjespFTYUFWfdKQyMtJMrSnTONI88gOVY5ZGZ+upP9Mu55HyM5L14ZKPQMeXqZeB1ms2yP4X8yZ72KgPPvvit/78s+980rCSEhkp+Oqv35AIGxkJKMEb3zoc0FtJ6bRHADnHIyXLnDWSKyFKJtFLLWeFCnkt+ixzfbKT+adxuVEyW6O1KyFKzmmWe8pxSrLD5qjUfKAcf5/ceHSUBtXRCVfytbwWyUiye+29A7mGiWytgBPi+2sE8OCzL2S3raRU2FDVvBiRlZHk4CUdfQfHFhutXblqpySl5NGkUj3MSDrGyKoS0dEizvoOjdautexeaq00nkqU0hlpeGLJJVyF2qi68aykREYKvvrrNyTCRkYCSqAzkpROSqc6AtAH2jneP3lk3bGOtTPXXx6ZXjVPKdGbUs8e9ScHTZlDTDlUyRws6gfqM0zkPuroivXR0Un55un7g2OL82sta05Mj791NjvZIYgBjwD0UFVKJ6VihqrmhYaUkZHG5zZmak2rT7Z29hutXd0VOXFXGmByoXGyY+30+UjmuUYS2KI7C6OzdR2K5BPX8U8Sktnk1Zlrf9fWt13yVZCNajWeTkpkpOCrv35DImxkJBSq9N+/Pte71Y1THQHIUMz6KZgr2iml9ArLUdcZyZplkokdPeaTTbmcFGTtszzQWpFc5g30jpnLoCVLBsHWvJOc8VLASUq/9gffPe2nOO1641uL//o/vFPwk6rs85HG5zbaewf6Z9exP8fnNkZn6/VmO2uFktRDN6WseSTdZtXlTZ1tdKRPve6tVZLPzc+F3o4sRFFAbk8tDxu1lMajCq5f+4PvvlvdoE67TnuwFwYyEgoVHQ15zzhrHunGXz76m+VNdcrzSHq+xbxxfq1lLf9tTfWcOCNZN8rFPfT4L2dTg2OL43Mb5h/1VSIjWQ/UMwPyT5kUyvr7fepEgQRIxzO1uqn++itpufNIVlMlM5JMD5rnkkmbdZx+kZlGOaQzdSW6rGSSzEiyM3IAqty40ngqq5O39w46Xl5spfHUvGisdQ1Zie6lxCSv5pH+3X/7u3c+qDe395hHCr7ISAVUxEjMDRkJheKTKXRG0ulInPYIQJ4lKzzId08pI0kI6ZiR9LVBLPn7YMWe1B3IunPq7p1e9WlGKut8JLOpkucj6eMnzZ9svdnOb1FJL/NrrWSUkpOaGq3drC3IwtzJvTLPjBqf25BFIzqe4SbLk5j3sTJSdDQpeoJLOfd1o+rG0+lIbicjBV/99RuyT0WMxNyQkVAoPpnijW8tWulInPYIQMZbWbMlsg8lziPJX/f1MmWpW3PJSJKyspaUICO5K31dO7MNzIwkF+LU3x2eWKo321s7+7pzJhcaWX8LkKPs5D5m9tAnNeUEG/Vs75l7ZfZb8vrLyZJ1F63nsjKSrIwiW+uY/UJq1AeffWGlI1FKRpLu0j/NrPUSXaq2vl36la88r/76DdmnIkZibshIKBSfTPGD+o9Tbz/tEYA+JSl1+Cjf6lVGsgZ/+pLwOZuSCGeNIWRr+ftgxR65T/75SGQkFz5cH0m3Qer5SLJYvF4X0fwRp07jmAfFRca6CLIw3UrjaU5AGhxbVM+Gf9kZCVfm3STV5BwjJ2s8DI4tztSa5pF+Wzv78lqqy5t6HXMdk5TDYYRhNOqP/qFtpSNR5KLz5tfq2am82vp2bX37BEmpvXegr3NApVZ//YbsUxEjMTdkJBSKT2a+AkYAklXkTAnrL/GyDzkZKX8tBF2yna2dfZ3EdDbTo4rUqGPlqOho9kkdMyPJo7Z29vXTyUjaXNeOjNSNEjOSvkqs/EzlIDfdySPTqxInUtddmF9rJYen9WZbHtJxxY7R2XqjtZvcK8k5ZhvLCnsq48Myv9bS98+fR9IlZ14VsDa9541aTOPJqZs6jsr8tnWfjjE4WbKdshbh6Jfys/ECEzESc0NGQqH4ZOYrZgQgZ6ULGZPpv1Lnr2unE4sc15RzDVn5c7hSSs7ukEeZfwJPjTo6Sskf++U+cuBc/gOTsUc/adb1kchI3SgxI+mf1+RCw/xD/vDEkr5Ecuof+M0oZW5HLs8lK+N1PH3IOi9I9spM4xKQZDvyebFWz7MuoGRVVkYqvvxs1MJ+Q5q/CVMvBKwvGOC+Wfm1mfXdwbHFerPtePG6gMvPxgtMxEjMDRkJheKTma/II0lkMKefut5sz9Sa5uBSZo2s/7P1dV3lEKDUjetjlmrr2/rO1l9PUzceHZ3vrndpfG5D7pn/QIk95vhVH4KlN6V3QP7Abw12JSNZC4IzAshSekZKNrMsw+B++JMc7ba1sy+NIauBK6VWGk+zzmXSU1hm443PbcjZTTLGtY6Fk5gkAcxl38hI+YppvK2dffOkzdr6duoPRV842KqR6dWs9RL1xbWSpa9q7UNMkmMCS3lqPxsvMBEjMTdkJBSKT2a+0xsB/Pu/WPz1P/tUvn7zr5d78vXvfPuHpf9f3ncVxgjAh4w0Mr06U2vKAgzuJ3hIpJFBcDJ0jc7WJYSLrZ19+dtBdBSBkhuUPwdIxEpNcZMLDTJSrxTQeHJEnPnDshZ8N0vuNrnQsP4GlHoiXMeLZflT8m6X8tR+Nl5gIkZibshIKBSfzHynNwK4+V8ffvKDH/36n336x/9z9dFfvNeTr//3X31Y+v/lfVdhjACKz0h6NYXhiSU5/ydn5TqrhieW9CoIM7Vmx0fpK3RZK3onI9D43MbI9Org2GL+SSbu5xGRkfKdduPJuvCSac1LtOXM/+hDl3N6QM72NKeyOx7Y2cM6waSQvKLiuy7ytfECEzESc0NGQqH4ZOY7vRHAb//+d374i//y0ecbn3199G//8a/05OupfxWV8p9oX1cYIwAuU3NKVVvfLv5SSKnlZ6MW0HhW9pZ40+Wq69aVgiV3FXZMnbx1p/2QXpWfjReYiJGYGzISCsUnM9+pjgCGf/edlX/0Tz74Z//m3/7p3/bq61L+E+3rCmMEQEYKvvxs1OIbT84o62YLcq5j8mLH5n0GxxZPLzLJW3faD+lV+dl4gYkYibkhI6FQfDLznfYI4Hf/43/XwaZXX1PHqjBGAGSk4MvPRi2+8bIWbJDqeCKcXv5OFnyXktVBkgs2WFuTxW+io4X11NHiH9ZBenISnayO0947MNd11Et6mqwHyo3WFcb0PfVTb+3sFzPD6WfjBSZiJOaGjIRC8cnMx9Az+ApjBECjBl9+NmrxjSfrdqSeiSRrzecnh/m1luQQ82i95DySxCTrscq4dkKjtasDj7n8pqzSubWzLxlMXy9Brz4vz6WMSCYP1BdykC1LxNLf1d9Sz16/oYCY5GfjBSZiJOaGjIRC8cnMx9Az+ApjBECjBl9+NmrBjScXkx2f27CuuC0lK87nLFc4udCQi2Uph4yUnK2Sl9zeO9CPHZlelTCjb5FLyZmPSl7pW7Zj3md4Ykm2Y95tptbU/0w+tQ5jZ7PxAhMxEnNDRkKh+GTmY+gZfIUxAqBRgy8/G7Xgxptfa0kqGJ5Ysq58JfEpZy07uTyxJCvVRUayMpgso2ftjLUp9ew1smU75n0k8JjXgEp9ausUKety3meq8QITMRJzQ0ZCofhk5mPoGXyFMQKgUYMvPxu14MYzT8KprW+bmSF/lfaR6dV6s22e3nPijGTdKMfIWXeWa4VZJzvlbKfjUYKpTy1bdr9Mc0iNF5iIkZgbMhIKxSczH0PP4CuMEQCNGnz52ahFNp5c/FfnnMGxRT0vNFNr5hxlNzK9as3zqN5lJFklT99ZwljyjcrPSPKQnAXNU5+646MCbrzARIzE3JCRUCg+mfkYegZfYYwAaNTgy89GLbLxkiu5zdSaK42nclJQ1op2wxNLyW+pU5tHktUUqsubOrC5HGuXPGfJ5anJSMGIGIm5ISOhUHwy8zH0DL7CGAHQqMGXn41aWOOlLjQXHaWL4y7vprrISNZaEXKYnEQgOSfK2k+XjCT36Xg+knUjGSkYESMxN2QkFIpPZj6GnsFXGCMAGjX48rNRi2m84YmlrZ395EVdZQapvXfQaO0e65KvKiMjjc7Wx+c25DpFWRnJ3BM50E4dnRQ0PLGkjJW+o6MDAtWzGUnWWjCPDJQHWns1udCw1rWz9oeMFIyIkZgbMhIKxSczH0PP4CuMEQCNGnz52agFNJ7EjORxaJMLja2dfbldJnPMq7Xml8qeR5KznlTaUnXykpMXKTLvKblFrgA7v9aSCKeezUiyt+29A7kOktwo6+Op3OsjWftDRgpGxEjMDRkJheKTmY+hZ/AVxgiARg2+/GzUAhqvtr5tBaThiaV6s73SeGomovG5DckV9WZ7cqGRH5aqy5vmIXPWsXajs3XrGkdS8pIHxxblQkxKqWR4M7+7tbNfW9+WuSZzg4Nji3KIoHr2+rNy+Sa5vdHaNXdSspa1P5KRjjWBFkzjBSZiJOaGjIRC8cnMx9Az+ApjBECjBl9+NuppN978WstccWFkerW2vm2t+q1rcGyxurwp+UQpVVvfTl5nNrWS5yOllmy29E4ouPxsvMBEjMTckJFQKD6Z+Rh6Bl9hjABo1ODLz0Y91cYbmV7V00GTC43q8ubkQqNj7BkcW5ypNXMu6posMlJO+dl4gYkYibkhI6FQfDLzMfQMvsIYAdCowZefjRpG48n1XjveTV5y6XtbcPnZeIGJGIm5ISOhUHwy84UxAqByKowRAI0afPnZqGeq8VJPCgq+/Gy8wESMxNyQkVAoPpn5ztQI4GxWGCMAGjX48rNRabzgy8/GC0zESMwNGQmF4pOZjxFA8BXGCIBGDb78bFQaL/jys/ECEzESc0NGQqH4ZOZjBBB8hTECoFGDLz8blcYLvvxsvMBEjMTckJFQKD6Z+RgBBF9hjABo1ODLz0al8YIvPxsvMBEjMTdkJBSKT2Y+RgDBVxgjABo1+PKzUWm84MvPxgtMxEjMDRkJheKTmY8RQPAVxgiARg2+/GxUGi/48rPxAhMxEnNDRkKh+GTmYwQQfIUxAqBRgy8/G5XGC778bLzARIzE3JCRUCg+mfkYAQRfYYwAaNTgy89GpfGCLz8bLzARIzE3ZCQUik9mPkYAwVcYIwAaNfjys1FpvODLz8YLTMRIzA0ZCYXik5mPEUDwFcYIgEYNvvxsVBov+PKz8QITMRJzQ0ZCofhk5mMEEHyFMQKgUYMvPxuVxgu+/Gy8wESMxNyQkVAoPpn5GAEEX2GMAGjU4MvPRqXxgi8/Gy8wESMxN2QkFIpPZj5GAMFXGCMAGjX48rNRabzgy8/GC0zESMwNGQmF4pOZjxFA8BXGCIBGDb78bFQaL/jys/ECEzESc0NGQqH4ZOZjBBB8hTECoFGDLz8blcYLvvxsvMBEjMTckJFQKD6Z+V7+6jeo4KvsLuuB0t9DqoAqu8tSlP6eUAVU2V0WPkZijshIKBSfTAAAgLIwEnNERkKh+GQCAACUhZGYIzISCsUnEwAAoCyMxByRkVAoPpkAAABlYSTmiIyEQvHJBAAAKAsjMUdkJBSKTyYAAEBZGIk5IiOhUHwyAQAAysJIzBEZCYXikwkAAFAWRmKOyEgoFJ9MAACAsjASc0RGQqH4ZAIAAJSFkZgjMhIKxScTAACgLIzEHJGRUCg+mQAAAGVhJOaIjIRC8ckEAAAoCyMxR2QkFIpPJgAAQFkYiTkiI6FQfDIBAADKwkjMERkJheKTCQAAUBZGYo7ISCgUn0wAAICyMBJzREZCofhkAgAAlIWRmCMyEgrFJxMAAKAsjMQckZFQKD6ZAAAAZWEk5oiMhELxyQQAACgLIzFHZCQUik8mAABAWRiJOSIjoVB8MgEAAMrCSMwRGQmF4pMJAABQFkZijshIKBSfTAAAgLIwEnNERkKh+GQCAACUhZGYIzISCsUnEwAAoCyMxByRkVAoPpkAAABlYSTmiIyEQvHJBAAAKAsjMUdkJBSKTyYAAEBZGIk5IiOhUHwyAQAAysJIzBEZCYXikwkAAFAWRmKOyEgoFJ9MAB1cvaoqFTU1VfZ+uLl9W124oCoVde6cuntXKaWmprzY+XPn1LlzZe8EQtB88OD9SuWTV14pe0fQG4zEHJGRUCg+mQA6uHxZVSrq3r2y98PBvXuH6WhoSF27pm7fVlNTqlLxIuPJbgBde/Lee+9XKt9/6aWydwS9wUjMEb9AS/byV79BBV9ldxnQV/ooI127pioVdft2fEu1ejiBU62Wt1tKKTIS0p1gUoiMFBgykiN+gZbs5a9+I7qzQAVcZCTgePooI/m8q2QkpDlB4CEjBSYiI7nhF2jJyEjBFxkJOB6fg4fF510lIyENGQkRGckNv0BLRkYKvshIKMe9e+rqVXXu3OEJMwMDzxz9JafN3LypHj9WAwOHd7tw4ZnDxpQ63IJS6u5ddfHi4bDb2lQq2f7QkJqaOlzS4PLl+LtDQ/HWLl48XOpASw0ed+8e3i77OTR0vNdrvYTkFqam7Ic/fpz3AoeGDjelSy+QYC6WIOtPmM/1+PHhG5LzHt6+bb9Yc2ccf3ZWRpqaOrxn6SdK9YlPXnnl/Url8+vX9S3ttbUPn3/+/Uql9fHHK2++mYwN8pC1t97K/27WMz55771PXnll5rnn3q9UZp577tNXX219/LH+rhwjt/Lmm+21tU9ffVXu9uHzzyc3uPbWW99/6aX3KxW5w+fXr7fX1uRbcqNZ5k6uvfXW9158UW7/3osv6i3rjGQ+9fdefPHJe+8d7z2FHyIykhsyUsnISMEXGQkluHnzcNx87ZoaGjoccJ87Fw+1ZbEBnQouX47zw82b8XbkgQMDh1u7fDkekedHCHP7584dbkfIE128eLjOgQQGM0UkM5Kc9qNfjmzBDF0dX+/du3HeGBpSV6+qq1fjh8t3JRrJd62Hp77AoaHDnZdH6ffNDCfV6uE/dSKS15LMeJo8u7w/+inMF+v4szN3QwckK0chW+vjj+0/x4MAACAASURBVCUt6KCy+PrrZmqSvKSDxI/eeceMHPnfTZJY9eHzzy++/vrn169LyJl57jkdbySo6BD1/Zde0nlm5c039XYkiX3vxRc/v3798+vXZTf0835+/fqnr76qs9Pn16/rPZTb5c46YkkKkqf+8Pnn9VPLZt+vVJoPHvTizUahIjKSGzJSychIwRcZCSWQUbtJRt56iCzjbBmL6+H77dt2NtCzGXrw/fjx4Yg8Z5Rvbd9MGjL9MjAQ35KcV7EykmzK2o71cjq+Xtlm6tTN48eHQc6cYJHQZe5nqtQpL2sCR16yhByZArpwIW+b1sRa8v1x/Nnp3dBbICAd0+fXr+uAIdM4Hz7/vP6uJAeJMeYUk8t3kz599VVzzkol5p1kg5J/9HbW3nrLilLfe/HFH73zjt5I1o5ZaU0i3Mxzz+nM015bW3z9dfln6lPL7n366qvHeEPhh4iM5IaMVDIyUvBFRoIXZKSug4SMs5ODdck/eowuGcAaW8usy8WLeU+nF8W2pmJksG7dKPumY5gVPGQWyzoeT8+lOL7enBOHJF1cu2bfbh4+l8UlI6mjd/X27cMvjnv+Umpo7Pizk93QmZaAdCIyV6MPQrOOLpOZpU9ffdWaYnL5bkeS0PSj9GRO6h6aucgik0J6z1MzUv5xgPqpdRJTR6GRk5T6UURGckNGKhkZKfgiI6E0U1Pq5s3DQ7ZknG1lJPMILiGBJD9a6OPH5Clk+7pkZiN1+48fHz7Qeoi1b9aTyhBfZop0yX5a2895vZLrZDvWCTly8Nvly/ZemfMw1rf0vjlmJD3zkxrGUsmxfObhdlZG6viz03NN1jF4OA49hfJ+pbL4+uvWd9tra3L4mcyxHOu7qZoPHqy8+aYcBSfZxspIyUwix8hZAezJe+/JRvThdvkZSe6TdeBc1lOnZjb4LyIjuSEjlYyMFHyRkVCCqan4MDmzOmYkx+kXHQPkmDSz5M6p2zejQrKy5pFyHqLnkTq+Xnl2fd7O5ctxUkp9YMVYhkFfFja5WceMpFT81B2XTLh79zAUpb6xWe+tSvzsdCTrOOmHXPq0n9QIIXNE1klBjt81NR880GcBmdUxI1nTTT965x19spBZ+RlJ7pO1bzkZKedR8FZERnJDc5eMjBR8kZFQAn3KkD5fJfVYu+7nkbLkzyPlS51Hyj8+rePr1aamDl+jvsxrx0UU3HdVJF+jXjEi9T036UvQ3r5tnxV2snkkZUzE4fjkRB1r5QOt9fHHM889J981Twpy+a5Fktjn16/rE35Sj7XLn0eSZ5x57rm1t97ST+dyrJ3Md2WdLkVGCkxERnJDc5eMjBR8kZFQNJn3sKYOUjNScnrBOqxLRufWuUByAk/+WD9rHC+rq+WviWdFAll9wdoHk8vrtUickJkrmQpzPAQuf1eFlZH0mhDVaucj31J3JmsRC4v1s9O7ITtQ4ZSkY5OD5Waee6718ceSYazpIIkfP3rnHZkv+uSVV9y/a5Jze6zj8VIzUvKYPfNQOlkczzom0CUjyX3yz0ciIwUjIiO5oblLRkYKvshIKJrM85jrJSQXo9OHvV2+HN9NcoW5GIBeRFsPr6tVp0XS8uc6knMa5tasSCCRzFrXTp5CJoJcXm/qbkju0g+3joKrVjsvruCSkSTjSS6SOKensFRiAYxk/tTLdlsZqePPztwNvYQGF0c6DlnJQHKRxBjJS/JdCSSSfPTycXrthPzvyvSUDjyyzrg519ReW9MzS3KLPjNKrlMkN0qO0icFyTJ3ZphpPnggc0Q6IyUX6NMP/PD55/Wra6+tfX79urmuHRkpGBEZyQ3NXTIyUvBFRkIJZOwulwO6du1wHiOZkS5ciK+xo8+BMWdsZDuSN+T6SJXKM2P6LFkZSacXfakifRVU60nN4KGPjpPLH+mrKlnzXTmvV67RZC7nYIYuSSYVY2UIl/XNU3dVPRtOkmsAyqF9+kwqc3EIZcz5yN7qF57MSB1/dlZU05eQyp/EwxErxqijk4sk9uij2nSo0EfltdfW8r+rjrKNGTBkJkcuW7T4+uvy8NR17ZIXKdLRS68S8f2XXtKXQrIykjqaevrw+eflUkhyoz7tKuv6SGSkYERkJDc0d8nISMEXGQklePw4zh4XLqiBgcOBdfJ8pKmpw4kOGbhbw32dAfTqapJDOo6zZcIkdW1uWSZOr2Egu2fOb8j+WDMet2/HCe3cOXX1qn0RofzXe/VqHCTkDslZKX1VVnlnXNaCS91VSWj6aytE6asVyaOSIcr8iciVZCXeJM9Hyv/ZmbshJHGd7KjCsycZLfR0UPPBA5liSr2i0cqbb+Z/V6UFsPba2qevvipP+uHzz3/66quSTJLnI+lnl8BmLUdufleuJCszWubdmg8eSCKaee45vX2ZONK56/svvaQPvZOpp+SxgrKFE727KFNERnJDRioZGSn4IiPBR1nzPJacywqhLPKze+21svcDhWr89V+/X6l89PLLZe8I+l5ERnJDRioZGSn4IiPBR2SkLn3724dfPHxY9NcffKB+5VfUn/5pV9tBvu98R21tKaXU3p762td8+Hr3889nfvqnv/judz3Zn/SvP/ig1z8J9F5ERnJDRioZGSn4IiPBR2SkLn35y+rb31YPH6qrV4v++u231R/9kfqZn+lqO8j3wQfq6lX1xRfqy19WX/uaD1/v/tIvPf34462LFz3Zn/Svv/Odsn9y6CwiI7khI5WMjBR8kZHgo5zzhUyp59tAKbW3p778ZXX1qtraKvrrL31J/eRPql/91a62g44ePlQ/93OHk28efN36+td3fuInHv/iL3qyP5lfw3sRGckNGalkZKTgi4wEhGlvLw4b/fg1OvriC74+ydfwW0RGckNGKhkZKfgiIwEAAE9EZCQ3ZKSSkZGCLzISAADwRERGckNGKhkZKfgiIwEAAE9EZCQ3ZKSSkZGCLzISAADwRERGckNGKhkZKfgiIwEAAE9EZCQ3ZKSSkZGCLzISAADwRERGckNGKhkZKfgiIwEAAE9EZCQ3ZKSSkZGCLzISAADwRERGckNGKhkZKfgiIwEAAE9EZCQ3ZKSSkZGCLzISAADwRERGckNGKhkZKfgiIwEAAE9EZCQ3ZKSSkZGCLzISAADwRERGckNGKhkZKfgiIwEAAE9EZCQ3ZKSSkZGCLzISAADwRERGckNGKlkAGWlwbHF0tj44tlj6nvhZZCQAAOCJiIzkhoxUMs8z0vDE0vxaq9Ha1TvcaO3W1rdHZ+v6PiuNp0qplcbT0vfWzyIjAQAAT0RkJDdkpJL5nJFmak29n/VmW0rfMjK9KnebX2sppebXWvqBkpr0HfK3P1Nrlv5KT7XISAAAwBMRGckNGalk3mYkHZCqy5vWcXTjcxu19e2cg+skSplzTalVXd6U7Zf+Yk+1yEgAAMATERnJDRmpIMtPnqbe7mdGGp5Ykt2bXGic4OFkJLPISAAAwBMRGckNGakgb3xr8T//1fLf/d+WdbufGam2vq2Uqq1vu9zZPGROYo8lGZZGZ+vJu+mwNDpbX2k8be8dKKXaewe19e3hiSXz4YNji7X1bblD6ha8KjISAADwBBnJERmpIG986/DINCsp+ZmRJH50PKFIypwOGp2tV5c3t3b2lVK19e3q8mZ1edNKONGdheGJperypkw31ZttuZtEKUlcWzv782stfZ/23oE+tG9wbFF2T7av76C34FuRkQAAgCfISI7ISAXRGclKSh5mJH2gneP9k4fMdXOsnSQf8xZZAUIf9SchKvl0jomu+CIjAQAAT0RkJDdkpEwFjJ7frW54mJH0gXDmjeaKdurZiZ3eZqSOd5ONm3NTcgdv18cjIwEAAE9EZCQ3ZKRMve2hPppHGple1e+Arvm1lrX8t45Ap5GRRqZXZ2pNOQZPtkZGAgAA6FJERnJDRsrU2x7qr/ORZN+yjl6T755SRhqZXrXmrIS+WzIRcawdAACAi4iM5IaMlKm3PdRf69rJKUBZ69rJnp9SRmq0duVGPVNk3U2fLmWu2eC4BF8pRUYCAACeiMhIbshImXrbQ/11fSR9SlLq5Ix86zQykhzm12jt5tyt3mzLguCyut3Wzr6fS37rIiMBAABPRGQkN2SkTMX0kJ8ZKTq6RFJ772Cm1tTLM0TGNE5ORrJWossqWaHOnAKSjVsrfeuZJbmlvXewtbNv7pLnRUYCAACeiMhIbshImYrpIW8zUnRnYX4tPjJQVmuQuKI6rWs3udDQj9ra2c+aUNJxq9HabbR2ZQsyByWzQ/NrrfbegcwX6e2Pz21Y72GjtVtb3+Z8JAAAgHxkJEdkpExkpOjOwuhsvba+raORUqrebM/UmuaycjIdZC0rJ/FGKdVo7SavIatrcqEhF5zd2tkfn9uI7iwMji2ax9HV1rflwD+dkWSCa6XxVFa9My8jm/NEZCQAAAAykiMyUqazmZG+8s0f/NaffyZff+1/fN6Tr3/n2z/s1e7JCUv1Ztu6Xaa8/DwxiYwEAAA8EZGR3JCRMhXTQ75lpME/+T+LHz36rT//bHhi6dF7/6snX3889b1e7Z7MKc2vtazbHc+AIiMBAICzjIzkiIyU6WxmpK/88Yc/vPhLP/z48x/+5eTCxX/ek6//5p9e6dXuDY4t6kP45EC7+bWWHK1nrYbnT5GRAACAJ8hIjshImc5mRoruLPzOf/qrz3/+0icv/otf//r3evV1D3dveGKptr4tuUjIKVKlv29kJAAA4DkykiMyUqYzm5GiOwu//fvf0cGmV1+f2SIjAQAAT0RkJDdkpEzF9JCfGYnqYZGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnqIjBR8kZEAAIAnIjKSGzJSpmJ6iIwUfJGRAACAJyIykhsyUqZieoiMFHyRkQAAgCciMpIbMlKmYnro5a9+gwq+CmgkAACAjshIjshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86IiNloocAAAAQEsa3jshImeghAAAAhITxrSMyUiZ6CAAAACFhfOuIjJSJHgIAAEBIGN86OkZGevmr36CCr9NrNQAAAJSLjOToeBkpurNABVxkJAAAgIBFZCQ3ZCQqLjISAABAwCIykhsyEhUXGQkAACBgERnJDRmJiouMBAAAELCIjOSGjETFRUYCAAAIWERGckNGouIiIwEAAAQsIiO5ISNRcZGRAAAAAhaRkdyQkai4yEgAAAABi8hIbshIVFxkJAAAgIBFZCQ3ZCQqLjISAABAwCIykhsyEhUXGQkAACBgERnJDRmJiouMBAAAELCIjOSGjETFRUYCAAAIWERGckNGouIiIwEAAAQsIiO5ISNRcZGRAAAAAhaRkdyQkai4yEgAAAABi8hIbshIVFxkJAAAgIBFZCQ3ZCQqLjISAABAwCIykhsyEhUXGQkAACBgERnJDRmJiouMBAAAELCIjOSGjETFRUYCAAAIWERGckNGouIiIwEAAAQsIiO5ISNRcZGRAAAAAhaRkdyQkai4yEgAAAAB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" alt="" />

简单来说,假如我们把目前已经上线的apk的名字叫做app-release-online.apk(即文件名),在这个发布后我们及时打上Tag,做一个历史快照。当后面发现bug需要发起热修复时,就在该Tag上新建branch进行修改,修改完毕后的apk的文件名是app-release-fix.apk,随后我们通过AndFix提供过的apkpatch工具来制作.apatch文件(即对比两个apk的差异,后面将介绍),验证无误后,将.apatch文件发布。这样子已经发布的版本会实时收到patch文件并进行热修复工作,用户正在使用的软件即可在不知不觉的中修复了bug。随后我们将修复后的代码merge会主分支。

这里针对我们实际的项目进行一步步操作讲解。

我们的上线apk名字假设也为app-release-online.apk,它其中的关于界面要显示当前的版本号:

aaarticlea/png;base64,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" alt="" />

版本已经发布,用户已经在使用中,随后我们想将前面的那个"v1.5.1"中的"v"改成“hello world”,同时用户是无感知的收到更新。这个时候在已发布版本的代码Tag上我们修改代码,其实就是修改一个Activity即一个java文件中的某一行。然后打包生成了一个新的apk叫做app-release-fix.apk。

然后将两个apk文件放到项目代码的app目录下(这里随你而定,放在这里主要是因为签名文件也在这个文件夹下,方面使用apkpatch命令而已)。将apkpatch这个工具下载后,加入环境变量。随后输入命令:

apkpatch -f app-release-fix.apk -t app-release-online.apk -o D:\Work\patchresult -k debug.keystore -p xxx -a xxx -e xxx

这个时候你会发现在D:\work\patchresult文件夹中生成了:

aaarticlea/png;base64,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" alt="" />

这个.apatch就是补丁文件,然后我们把它改名为app-release-fix-shine.apatch,然后用FTP工具上传到上述IntentService中指定的那个目录。

到这里,当用户再次启动app后,发现关于界面已经变成了这样:

aaarticlea/png;base64,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jY2NaOZXr161tbUVCoU4jpeWltJoNIFAgOO4wWBYWvGn6vUAALNHzmUULxiGEdmN8oScGBuIDhO0uFFylZeXnz17NiYmhkaj+fv7p6enX716ValUXrp0afPmzadOnSImWVxcjI2N3bJlC5PJ5PF4RHQi8/Pz9+7dc3V1dXBw+P3333EcDwsL+/7773EcHxwcPHTokLW19eXLl1GAktcBx3GxWEyn03/44Ye4uLioqKjo6Oi4uDg2m02n01ksVlxcXHR0dFRUVFxcnLu7u7W19ejoKE765oIwGIygoCAcxzUazZ49e5KTk9Hwu3fv0mi0mZmZ9d6HDbx7AABzZZTdcrm8v78fZffs7Cy+1oUjH88ENW7yIhsbG7ds2XL9+nUcx9++fRsTE7Np06aQkBCJRKJUKhUKhUKhUKlUEonk1KlT33zzjYODw+Dg4PLy8uLi4tzcXFlZ2cGDBy0sLIKCgqampnAcX1paCgkJ+f7771F3SK1We/nyZWtrazs7u8TExMePH0ulUqJIjWGYvb39lStXyKvX3d29ZcuWV69ekQdWVFRYWVlNTk7iK21tnU43PDw8OTmZkpKyd+/esbGxiooKGxub33//fXR0VCaTlZeX29radnd3i0SiORIMw0x1phgAYE6MslupVKJOJn19fQKBAOX1xjqkmaDFjf6iokFycrKVlZWrq2tHR4der/fy8jp16tTz58/37Nnj4uKya9euPXv27N27l06n37t3r6ys7MSJEwsLC8vLy1NTU99++62FhYWfn197ezt5EZGRkYcOHSIPmZubO3v2rIODw+bNm//44w+i44pEInFxcfH19c3Ly8vKysrKysrLy4uPj7exsYmLi8vNzb1x4wYaGBQURKfTx8fHcRxHvVza29u3b9/u5OTk6OhIp9PReVR7e3tXV9evv/46IyOjtrbW0tJy9+7du3btcnV13b9//3fffWdnZxceHk7+vwEAAIJRdqvVaj6f39/f39fXNzU1RRRa/+xsTRPcaPFarfbw4cOOjo729vYHDhyQyWQSiWRxcXF2djYzM7O0tLSoqCgrKysnJ+fatWtcLhdfCU00+YMHD+rq6vr7+1+/ft3T09PV1dXT09PT03P//v2SkpLu7u6enp7u7u7Ozk4+nz84ODg0NFRTU6PX6/GVVrNYLN6zZ8++fft++eWXQ4cOHTp06Ndffz1w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" alt="" />

大功告成!热修复成功!

当然实际开发中,如果能对patch文件进行更加精细的管理控制那就更好了,这里通过上传到ftp服务器,Android客户端下载该文件进行修复也是个不错的办法。

同时,友盟提供了在线参数的功能,我们可以设置一个参数,实时的让客户端检查是否需要打补丁,然后再下载patch文件进行打补丁操作。

原理浅析


.apatch实际是一个压缩文件,解压后如下:

aaarticlea/png;base64,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" alt="" />

meta-inf文件夹为:

aaarticlea/png;base64,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" alt="" />

打开patch.mf文件可以发现两个apk的差异信息:

Manifest-Version: 1.0
Patch-Name: app-release-fix
To-File: app-release-online.apk
Created-Time: 30 Mar 2016 06:26:27 GMT
Created-By: 1.0 (ApkPatch)
Patch-Classes: com.qianmi.shine.activity.me.AboutActivity_CF
From-File: app-release-fix.apk

这个Patch-CLasses标志了哪些类有修改,这里会显示完全的类名同时加上一个_CF后缀。AndFix首先会读取这个文件里面的东西,保存在Patch类的一个对象里,备用。

然后我们反编译classes.dex来查看里面的类,用jd-gui来查看:

aaarticlea/png;base64,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" alt="" />

可以看到这个dex里面只有一个class,而且在我们所修改的方法上有一个"@MethodReplace"注解,在代码中可以明显的看到了我们加入的“hello world”这段代码!

patchManager.init(AppUtils.getVersionName(this));

上一节我们再Application所调用的patchManager.init方法,首先判断传入的版本号“1.0”是否是已有补丁对应的版本号。不是,说明APP版本已经升级,需要把老版本的clean掉。然后初始化补丁包:遍历APP 的私有目录(/data/data/xxx.xxx.xxx/file/apatch)下所有文件,找到以“apatch”为后缀的文件。解析文件 ->读取文件必要信息(主要是PATCH.MF中)->存放在mPatchs(类型:SortedSet<Patch>)中。

patchManager.loadPatch();

遍历mPatchs,针对每个补丁文件:安全校验->解析dex->加载类->找到含有MethodReplace注解的方法->hook替换.

需要注意的时上述所说的是已经下载的patch文件,那么当心下载一个patch文件时(例如上述例子中在PatchDownloadIntentService中),需要调用addpatch方法来载入新的patch文件:

CustomApplication.getInstance().getPatchManager().addPatch(patchFile.getAbsolutePath());

这个时候虚拟机就会自动的加载准备替换的class,替换被标注的方法。那么这里是怎么做到的呢?这里开始查看AndFix的相关源码。

源码浅析


首先Java层的入口为AndFixManager.java,找到fixClass这个方法:

private void fixClass(Class<?> clazz, ClassLoader classLoader) {
Method[] methods = clazz.getDeclaredMethods();
MethodReplace methodReplace;
String clz;
String meth;
for (Method method : methods) {
methodReplace = method.getAnnotation(MethodReplace.class);
if (methodReplace == null)
continue;
clz = methodReplace.clazz();
meth = methodReplace.method();
if (!isEmpty(clz) && !isEmpty(meth)) {
replaceMethod(classLoader, clz, meth, method);
}
}
} /**
* replace method
*
* @param classLoader classloader
* @param clz class
* @param meth name of target method
* @param method source method
*/
private void replaceMethod(ClassLoader classLoader, String clz,
String meth, Method method) {
try {
String key = clz + "@" + classLoader.toString();
Class<?> clazz = mFixedClass.get(key);
if (clazz == null) {// class not load
Class<?> clzz = classLoader.loadClass(clz);
// initialize target class
clazz = AndFix.initTargetClass(clzz);
}
if (clazz != null) {// initialize class OK
mFixedClass.put(key, clazz);
Method src = clazz.getDeclaredMethod(meth,
method.getParameterTypes());
AndFix.addReplaceMethod(src, method);
}
} catch (Exception e) {
Log.e(TAG, "replaceMethod", e);
}
}

它以方法的粒度进行了替换,走到最后其实就是AndFix.addReplace这个方法,这个方法在AndFix.java中:

public class AndFix {

    static {
try {
Runtime.getRuntime().loadLibrary("andfix");
} catch (Throwable e) {
Log.e(TAG, "loadLibrary", e);
}
} private static native boolean setup(boolean isArt, int apilevel); private static native void replaceMethod(Method dest, Method src); private static native void setFieldFlag(Field field); /**
* replace method's body
*
* @param src
* source method
* @param dest
* target method
*
*/
public static void addReplaceMethod(Method src, Method dest) {
try {
replaceMethod(src, dest);
initFields(dest.getDeclaringClass());
} catch (Throwable e) {
Log.e(TAG, "addReplaceMethod", e);
}
} 。。。
}

这个Java文件载入了libandfix.so,最后其实是调用了cpp实现的replaceMethod方法,在这个之前调用了setup方法进行了设置。走到了这里我觉得他实际上是调用了dalvik的函数来进行底层的替换,所以我觉得setup方法一定获取了dalvik的句柄。对了这里提一下,AndFix对于libandfix.so提供了两个实现,一个是Dalvik的一个是ART的,所以AndFix是顺利的支持两种模式,这里仅仅对Dalvik进行分析。

下面我们来看libandfix.so的dalvik实现,即dalvik_method_replace.cpp

aaarticlea/png;base64,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" alt="" />

首先是native的setup函数:

extern jboolean __attribute__ ((visibility ("hidden"))) dalvik_setup(
JNIEnv* env, int apilevel) {
void* dvm_hand = dlopen("libdvm.so", RTLD_NOW);
if (dvm_hand) {
dvmDecodeIndirectRef_fnPtr = dvm_dlsym(dvm_hand,
apilevel > ?
"_Z20dvmDecodeIndirectRefP6ThreadP8_jobject" :
"dvmDecodeIndirectRef");
if (!dvmDecodeIndirectRef_fnPtr) {
return JNI_FALSE;
}
dvmThreadSelf_fnPtr = dvm_dlsym(dvm_hand,
apilevel > ? "_Z13dvmThreadSelfv" : "dvmThreadSelf");
if (!dvmThreadSelf_fnPtr) {
return JNI_FALSE;
}
jclass clazz = env->FindClass("java/lang/reflect/Method");
jClassMethod = env->GetMethodID(clazz, "getDeclaringClass",
"()Ljava/lang/Class;"); return JNI_TRUE;
} else {
return JNI_FALSE;
}
}

这个dvm_hand就是dalvik的句柄,通过dlsym系统调用获得了dalvik的_Z20dvmDecodeIndirectRefP6ThreadP8_jobject和_Z13dvmThreadSelfv函数指针,这里还针对apilevel是否大于10进行判断。

这两个函数在后面的替换Method中是直接用到的,换句话而已,AndFix实际上最终是调用了dalvik的上述两个方法来获取源方法和目标方法的句柄,从而进行“方法粒度”的无感知替换,当虚拟机误以为方法还是之前的“方法”。

在native的replaceMethod中:

extern void __attribute__ ((visibility ("hidden"))) dalvik_replaceMethod(
JNIEnv* env, jobject src, jobject dest) {
jobject clazz = env->CallObjectMethod(dest, jClassMethod);
ClassObject* clz = (ClassObject*) dvmDecodeIndirectRef_fnPtr(
dvmThreadSelf_fnPtr(), clazz);
clz->status = CLASS_INITIALIZED; Method* meth = (Method*) env->FromReflectedMethod(src);
Method* target = (Method*) env->FromReflectedMethod(dest);
LOGD("dalvikMethod: %s", meth->name); meth->clazz = target->clazz;
meth->accessFlags |= ACC_PUBLIC;
meth->methodIndex = target->methodIndex;
meth->jniArgInfo = target->jniArgInfo;
meth->registersSize = target->registersSize;
meth->outsSize = target->outsSize;
meth->insSize = target->insSize; meth->prototype = target->prototype;
meth->insns = target->insns;
meth->nativeFunc = target->nativeFunc;
}

我们看到源方法(meth)的各个属性被替换成了新的方法(target)的各个属性,这样子就完成了方法的替换,完成了热修复操作。

看到这里我们其实也了解了AndFix的缺陷,它既然是方法的替换,那么如果新的apk增加了新的类,或者是增加修改了xml资源,那么AndFix则无从下手了。所以,AndFix仅仅支持android 方法的替换,不支持资源文件、xml的修复!

影响


由于AndFix的实现非常简单,仅有一些很普通的源代码,所以项目引入后对于apk的大小的影响是微乎其微的,这里进行了一个引入前后的对比:

aaarticlea/png;base64,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" alt="" />

发现仅仅是增加了22KB左右,基本上可以忽略不计

其次,本文中每次Application在onCreate中都进行了下载patch补丁的操作,实际开发中应该注意下不要重复下载。这里可以做一些操作,不要重复打同样的补丁。

混淆


请加入下列混淆语句

# AndFix
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * { native <methods>; }
-keep class com.alipay.euler.andfix.** { *; }

转载请注明:http://www.cnblogs.com/soaringEveryday/p/5338214.html

AndFix热修复 —— 实战与源码解析的更多相关文章

  1. AndFix Bug 热修复框架原理及源码解析

    作为阿里巴巴开源的 Android 应用热修复工具——AndFix,帮助 Anroid 开发者修复应用的线上问题.Andfix 是 “Android hot-fix” 的缩写. 1.什么是AndFix ...

  2. 【Java实战】源码解析Java SPI(Service Provider Interface )机制原理

    一.背景知识 在阅读开源框架源码时,发现许多框架都支持SPI(Service Provider Interface ),前面有篇文章JDBC对Driver的加载时应用了SPI,参考[Hibernate ...

  3. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  4. spring boot整合spring5-webflux从0开始的实战及源码解析

    上篇文章<你的响应阻塞了没有?--Spring-WebFlux源码分析>介绍了spring5.0 新出来的异步非阻塞服务,很多读者说太理论了,太单调了,这次我们就通过一个从0开始的实例实战 ...

  5. 【Hibernate实战】源码解析Hibernate参数绑定及PreparedStatement防SQL注入原理

        本文采用mysql驱动是5.1.38版本. 本篇文章涉及内容比较多,单就Hibernate来讲就很大,再加上数据库驱动和数据库相关,非一篇文章或一篇专题就能说得完.本文从使用入手在[Spr ...

  6. 【Java实战】源码解析为什么覆盖equals方法时总要覆盖hashCode方法

    1.背景知识 本文代码基于jdk1.8分析,<Java编程思想>中有如下描述: 另外再看下Object.java对hashCode()方法的说明: /** * Returns a hash ...

  7. 并发编程实战-ConcurrentHashMap源码解析

    jdk8之前的实现原理 jdk1.7中采用的数据结构是Segment + HashEntry 的方式进行实现.主要的结构如下图: ConcurrentHashMap 并不是将每个方法都在同一个锁上同步 ...

  8. Flink 源码解析 —— 源码编译运行

    更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...

  9. Flink 源码解析 —— 如何获取 ExecutionGraph ?

    https://t.zsxq.com/UnA2jIi 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭建 Flink 1.6. ...

随机推荐

  1. Linux 僵尸进程查杀

    僵尸进程概念 僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 书面形式一点:一个进程结束了,但是他的父进程没有等待(调用wait ...

  2. Java【小考】

    课上, 老师出了一个题: 考察:1.类的定义 2.类的属性 3.类的方法.重载.构造方法.代码块 题目是这样的: 设计 一个 类:Tree 要求: 1.包含main方法 2.属性:静态: String ...

  3. [转]MongoDB基本命令用

    本文转自:http://www.cnblogs.com/liyonghui/p/mongodb.html 成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输 ...

  4. file_get_contents模仿浏览器头(user_agent)获取数据

    本篇文章是对file_get_contents模仿浏览器头(user_agent)获取数据进行了详细的分析介绍,需要的朋友参考下     什么是user agentUser Agent中文名为用户代理 ...

  5. NOIP2010引水入城[BFS DFS 贪心]

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  6. UI坐标变换/转换

    InverseTransformPoint Transform.InverseTransformPoint :相对于谁的坐标.如果是相对2D UI,请使用localposition,如果是3D场景,请 ...

  7. nginx 入门

    1.nginx 如何处理一个请求 IP,域名的处理 server { listen  80  default_server;     //添加 default_server就是一个默认的server ...

  8. poj 2892

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7725   Accepted: 3188 D ...

  9. 【bzoj1828】[Usaco2010 Mar]

    Description Input 第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数C_i * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i ...

  10. 在AppDelegate 或其它地方用UITabBarController怎么办

    1.解决了TabBarController,每个地方都要用到的时候?     创建一个单例,然后在创建UITabBarController时,赋值给这个单例,不管是登录还是抽屉,保证最终的根控制器是U ...