Android 在线热修复框架 AndFix 初步

Android热修复Hotfix原理 插件化: 一个程序划分为不同的部分,以插件的形式加载到应用中去,本质上它使用的技术还是热修复技术,让它支持大规模的代码更新以及资源和SO库的更新,将一个大apk改造成多个小apk,支持在线实时改变APP样式,在线更新添加功能等等(不用重新下载安装包安装)解决应用越来越大导致的各种限制(如65535方法数限制) 热修复: 当线上应用出现紧急BUG,为了避免重新发版,并且保证修复的及时性而进行的一项... 阅读详情

###AndFix工作流程

关于AndFix的基本使用和使用流程在AndFix官方Github上已经说的比较详细,这里提取一下基本的修复流程,帮助初次使用者快速的使用AndFix,下面是简要流程图。

此处输入图片的描述

上面的流程不细说,接下来看看github上Download下来的代码导入Eclipse,对于Android Studio导入不再给出。

###AndFix Demo

  • 导入Android工程
    • 解压,导入Android工程samples目录下的AndFixDemoAndroid项目
    • 前面导入的项目会报错,因为此时没有加入lib依赖关系,所以这里需要导入AndFix-master作为整个工程,其实里面有很多文件都没有必要导入到工程,为了方便起见,导入进去也不会有任何影响
    • 设置AndFix-master为Lib工程,然后AndFixDemo工程依赖AndFix-masterLib工程即可,此时工程可以直接编译了。

此处输入图片的描述

  • 运行项目,生成APK
    直接run,抓log如下
    此处输入图片的描述

按照上面的流程图,这个apk就是线上的APK文件,将这个apk重命名为old.apk以备用

  • 修复出现问题的Class文件,这里直接将A类替换为Fix类

线上的MainActivity类如下

public class MainActivity extends Activity {
	private static final String TAG = "euler";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.e(TAG, A.a("good"));
		Log.e(TAG, "" + new A().b("s1", "s2"));
		Log.e(TAG, "" + new A().getI());
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		android.os.Process.killProcess(android.os.Process.myPid());
	}
}

修复以后的

public class MainActivity extends Activity {
	private static final String TAG = "euler";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.e(TAG, Fix.a("good"));
		Log.e(TAG, "" + new Fix().b("s1", "s2"));
		Log.e(TAG, "" + new Fix().getI());
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		android.os.Process.killProcess(android.os.Process.myPid());
	}
}
  • 接着再生成修复后的APK文件,重名为为new.apk保存以备用。

  • 将上面两个文件old.apk和new.apk以及keystore文件都复制到apkpatch-1.0.3这个tools目录下

  • 输入以下命令即可在output目录下生成.apatch文件
    此处输入图片的描述

这里的命令稍微说明一下:(参数必选,如果没有输入会一直提示你正取的输入姿势,稍后我们来解答为什么需要这么严格的限制)

命令 : apkpatch.bat -f new.apk -t old.apk -o output1 -k debug.keystore -p android -a androiddebugkey -e android

-f <new.apk> :新版本
-t <old.apk> : 旧版本
-o <output> : 输出目录
-k <keystore>: 打包所用的keystore
-p <password>: keystore的密码
-a <alias>: keystore 用户别名
-e <alias password>: keystore 用户别名密码
  • 生成.patch文件以后,我们就可以直接把这个文件放到指定位置了,那么什么是指定位置呢?看看Demo上写了什么?定位到MainApplication这个类
public class MainApplication extends Application {
	private static final String TAG = "euler";

	private static final String APATCH_PATH = "/Download/out.apatch";
	/**
	 * patch manager
	 */
	private PatchManager mPatchManager;

	@Override
	public void onCreate() {
		super.onCreate();
		// initialize
		mPatchManager = new PatchManager(this);
		mPatchManager.init("1.0");
		Log.d(TAG, "inited.");

		// load patch
		mPatchManager.loadPatch();
		Log.d(TAG, "apatch loaded.");

		// add patch at runtime
		try {
			// .apatch file path
			String patchFileString = Environment.getExternalStorageDirectory()
					.getAbsolutePath() + APATCH_PATH;
			mPatchManager.addPatch(patchFileString);
			Log.d(TAG, "apatch:" + patchFileString + " added.");
		} catch (IOException e) {
			Log.e(TAG, "", e);
		}
	}
}

L25 就是指定加载的patch文件目录,所以我们将上面生成的patch文件放到内部存储的.../Download/out.apatch目录即可

  • patch文件放到指定目录以后,继续重新运行之前的old.apk,接下来观察一下log输出如下图所示就表示修复bug成功
    此处输入图片的描述

为什么说是bug修复了呢,看看以下源码就清楚了
Class A

public class A {
	String s = "s";
	private static O o = new O("a");
	static int i = 10;

	public static String a(String str) {
		Log.i("euler", "fix error");
		return "a";
	}

	public int b(String s1, String s2) {
		Log.i("euler", "fix error");
		Log.i("euler", o.s);
		return 0;
	}

	public int getI() {
		return i;
	}
}

Class Fix

public class Fix {
	String s = "s";
	private static O o = new O("fix");
	static int i = 11;

	public static String a(String str) {
		Log.d("qq", str);
		Log.i("euler", "fix succes");
		return "b";
	}

	public int b(String s1, String s2) {
		Log.e("euler", s1);
		Log.e("euler", i + "==" + c());
		Log.i("euler", "fix succes" + s);
		Log.i("euler", o.s);
		return 0;
	}

	private String c() {
		return "a";
	}
	
	public int getI() {
        return i;
    }
}

###AndFix 测试
测试机器:Genymotion
Android版本:2.3 - 5.1
测试结果:4.0 - 5.1 均通过,2.3Crash,附上Log如下(真机未测试)

03-03 01:44:29.000: E/AndroidRuntime(502): FATAL EXCEPTION: main
03-03 01:44:29.000: E/AndroidRuntime(502): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.euler.andfix/com.euler.andfix.MainActivity}: java.lang.NullPointerException: null result when primitive expected
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.os.Handler.dispatchMessage(Handler.java:99)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.os.Looper.loop(Looper.java:130)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at java.lang.reflect.Method.invokeNative(Native Method)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at java.lang.reflect.Method.invoke(Method.java:507)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at dalvik.system.NativeStart.main(Native Method)
03-03 01:44:29.000: E/AndroidRuntime(502): Caused by: java.lang.NullPointerException: null result when primitive expected
03-03 01:44:29.000: E/AndroidRuntime(502): 	at com.euler.andfix.MainActivity.onCreate(Native Method)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-03 01:44:29.000: E/AndroidRuntime(502): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-03 01:44:29.000: E/AndroidRuntime(502): 	... 11 more

###AndFix 局限性

  • 不支持资源文件修改
  • 不支持YunOs
  • APK加固以后制作patch文件失效,加固前制作patch可以使用,但会影响加固效果
  • mutildex是否支持,待验证。

上面埋下了一个坑,就是apkpatch工具输入的参数为什么是必须的,这个坑准备在下一篇博文中填,另外AndFix源码解析部分也会有博文更新,未完待续…

微信自动化必备软件:inspect(获取微信界面元素) SaveButton10015.2:1 ✅(合格)Passed ✅说明这个控件完全符合无障碍标准。 阅读详情

相关推荐

东方财富API隐藏技巧:这样获取分时均价线数据更稳定(避坑指南)

本文深入解析东方财富API获取股票分时数据,特别是分时均价线的实战技巧与避坑指南。针对高频调用中常见的请求失败、数据错位及IP限制等问题,提供了从接口参数深层解析、稳健请求与错误处理机制,到系统优化与数据校验的全流程解决方案,帮助开发者构建稳定可靠的数据采集系统。

rice5的博客 2527

使用android studio编程异常汇总

安卓开发过程中遇到的异常问题总结,不定期更新!! 部分内容为转载,部分原创

feisher 1729

遗传算法解整数规划IntCon

x = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon) IntCon就是代表整数的参量,描述的是哪几个自变量是0-1整数变量。比如navrs设置有4个变量,设置IntCon为[2 3],代表第2和第3个变量是整数。 再比如设置IntCon=2:2:nvars,代表偶数项的变量是整数。 值得注意的是一旦设置了非空的IntCon,则Aeqandbeqmust be an empty entry ([]), andnonlconmust re...

jianti9962的博客 9220

Android studio value 2 (DexIndexOverflowException,OutOfMemoryError,NoClassDefFoundError错误)

com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 这个问题 如果直接看异常最下方 也是value值为2    一开让我和前面所说的那个 资源重复加载问题混淆了 找了很多地方发现并没有重复 这个其实是说 同时在工程中引入了多个第三方jar包,导致调用的方法数超过了andro

Able 680

CKAD-CN 考试知识点分享(2) CronJob

成功创建 CronJobppi,每 5 分钟执行一次计算任务;配置了和;设置,超时自动终止;确保 Pod 不重启;手动创建ppi-testJob 验证功能正常;所有任务要求均已满足。

轻的博客 331

Ubuntu中交叉编译armadillo库

网上关于交叉编译armdillo库比较少,借鉴了一些但是在前几天编译时总是磕磕绊绊,于是写一个详细的编译过程。交叉编译armdillo库包含两个步骤:交叉编译依赖库和交叉编译armdillo库。

weixin_39813867的博客 1879

NullPointerException:null result when primitive expected

完整异常日志如下: E/AndroidRuntime( 962): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.audiopolicytest/com.example.audiopolicytest.MainActivity}: java.lang.NullPointerExcepti

harry_helei的专栏 1274

MAS1102量产工具实战指南:从下载到开卡,附固件选择与RDT优化技巧

本文提供MAS1102量产工具的实战指南,涵盖从工具下载、短接识别到开卡操作的全过程。重点解析了固件选择策略与RDT优化技巧,帮助用户成功修复基于联芸MAS1102主控的固态硬盘,解决常见开卡错误并提升SSD性能与稳定性。

c2d3e4f的博客 2200

Android在线热修复基本流程

在线热修复基本流程 每个APP都会集成一个用于捕获并统计线上Crash的SDK,通过这个SDK,我们可以知道APP的健康状况,这是在线修复的基础。从线上Crash的统计中可以得知APP是否存在需要在线热修复的严重性Crash。如果存在,那么接着根据Crash日志定位分析出哪里的代码出的问题,这是需要基于这个发布的版本号对应的代码标签拉出一个bugfix分支,并在这个分支上修复问题。问题修复后,首先...

weixin_42009516的博客 617

信号与系统——卷积、相关运算与FFT关系以及工程应用(三)

卷积运算、相关运算

qq_35028634的博客 6612

YOLOv11 改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLOv11中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLOv11,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 1279

Android 热修复其实很简单

android AndFix 热修复 动态加载

Dennis-Android的博客 2万+

Android Treble 简介

上面两段话来自官网上,Android 8.0 重新设计了 Android 操作系统框架(在一个名为“Treble”的项目中),以便让制造商能够以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。本文主要整理一下Android Treble框架。

私房菜 9274

android 热修复 框架,十分钟教会你使用安卓热修复框架AndFix

腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix。接下来,我会从它的概念、原理、使用方法等为你详细介绍。1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的。看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译...

weixin_42525632的博客 592

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

AndFix完整指南:如何实现Android App在线热修复

AndFix是一个强大的Android热修复解决方案,能够在不重新发布应用的情况下在线修复bug。这个完整的AndFix指南将帮助您快速掌握Android热修复的核心技术。AndFix支持从Android 2.3到7.0的所有版本,兼容ARM和X86架构,Dalvik和ART运行时环境,以及32位和64位系统。 ## 🚀 AndFix热修复的工作原理 AndFix的核心原理是通过**方法体替

gitblog_01195的博客 850

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android 热修复andfix初步研究

Andfix是阿里的热修复开源框架,用于app在线修复bug,不用重新下载版本更新。之前公司的项目经常碰到app上线后各种bug,兼容性、逻辑上等等各种奇葩问题,每次上线后都是心惊胆战、如履薄冰,每次客户反应过来问题,都是蛋疼无比。偶然机会在论坛上发现了热修复这门技术,简直是如获至宝,迫不及待的研究了下,不看不知道,一看吓一跳,真是好使啊...谁用谁知道。

暮醉南山的博客 576

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android—常用热修复框架

前言 热修复即<打补丁>,当一个app上线后,如果发现重大的bug,需要紧急修复。常规的做法是修复bug,然后重新打包,再上线到各个渠道。这种方式的成本高,效率低。 于是热修复技术应运而生,热修复技术一般的做法是应用启动的时候,主动去服务端查询是否有补丁包,有就下载下来,并在下一次启动的时候生效,这样就可以快速解决线上的紧急bug。 热修复的优势 无需重新打包发布安装包,用户无感知修复,无需下载最新的应用,节省用户流量;修复的成功率高,避免线上bug带来的业务损失,把损失率降到.

liuzhenyu0619的专栏 4014

Android 热修复框架AndFix

导论:上篇博客提到增量更新,这篇就要说说hotfix,那么到底什么区别呢?通俗的理解: 1:你软件有新的功能或者升级一下一些更改,但是下载完整的APK又比较大,这时为了省流量才会用到增量更新,这个叫增量包,格式为.patch文件 2:用户使用你的应用某个地方老是出现bug,那么怎么办,不会还是发布完整APK下载使用吧,当然不会,这时就需要修补bug的补丁了,类似windows 漏洞更新,这

Aile 512

十分钟教会你使用安卓热修复框架AndFix

腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix。接下来,我会从它的概念、原理、使用方法等为你详细介绍。 1.什么是AndFix? AndFix是阿里巴巴出的一个专门针对Android的热修复框架 ,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的。 看看阿里巴巴官方对AndFix的描述: 英文好的可以看官网说明文...

zzc19981221的博客 184

探索安卓热修复框架AndFix的奥秘

虽然阿里的AndFix框架已经出来很长时间了,但是还不了解它的同学依然挺多,接下来就跟着我一起来到AndFix的世界里一起看看,如何达到不用重新安装app就可以修复bug。 1.什么是AndFix? AndFix是阿里巴巴出的一个专门针对Android的热修复框架 ,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的。 看看阿里巴巴官方对AndFix的描述: 英文好的可以看官网说明...

zzc19981221的博客 163

android andfix 分析,AndFix Bug 热修复框架原理及源码解析

作为阿里巴巴开源的 Android APP——热修复工具AndFix ,帮助 Anroid 开发者修复应用的线上问题。Andfix 是 “Android hot-fix” 的缩写。1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的。看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文...

weixin_30338049的博客 262

热修复AndFix详解

文章目录AndFix介绍原则修复过程AndFix集成AndFix初始化apatch文件生成补丁文件安装AndFix组件化AndFix源码讲解总结 AndFix介绍 https://github.com/alibaba/AndFix AndFix是一个在线修复漏洞的解决方案,而不是重新发布Android应用程序。它作为Android库分发。 Andfix是“Android热修复”的缩写。 AndFi...

hongxue8888的博客 466

android7 sd fix,Android热修复实践应用—AndFix

一直关注App的热修复的技术发展,之前做的应用也没用使用到什么热修复开源框架。在App的热修复框架没有流行之前,做的应用上线后发现一个小小的Bug,就要马上发一个新的版本。我亲身经历过一周发两个版本,真的折腾用户的节奏~~所以,要开始考虑引入热修复。下面记录使用开源框架阿里巴巴的AndFix过程。实现的原理这里说的不是热修复怎么实现修bug的原理,这里说的是怎么使用AndFix。如果你想了解更多的...

weixin_33541245的博客 198

走进热修复框架AndFix的世界

关于阿里的开源热修复框架AndFix引起了广泛共鸣,受到了很多人的青睐。那今天就跟随我的步伐来详细了解一下AndFix的详细信息和使用方法。 1.什么是AndFix? AndFix是阿里巴巴出的一个专门针对Android的热修复框架 ,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的。 看看阿里巴巴官方对AndFix的描述: 英文好的可以看官网说明文档(有翻译不妥欢迎指出) 1....

zzc19981221的博客 167

使用AndFix进行Hot fix

AndFix简介AndFix是一个Android App的在线热补丁框架。使用此框架,我们能够在不重复发版的情况下,在线修改App中的Bug。AndFix就是 “Android Hot-Fix”的缩写。AndFix Github地址就目前来说,AndFix支持Android 2.3到6.0版本,并且支持arm 与 X86系统架构的设备。完美支持Dalvik与ART的Runtime。AndFix 的补

流水不腐小夏 3008

热修复干货| AndFix热补丁动态修复框架使用教程

本篇文章会与大家一起学习使用阿里的AndFix热修复框架,可以说AndFix是国内热修复技术的开山始祖,尽管现在阿里已经放弃了对这个项目的维护,但是后来很多的热修复技术都借鉴了这一框架的实现思路。 1.什么是AndFix? AndFix是阿里巴巴出的一个专门针对Android的热修复框架 ,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的。 看看阿里巴巴官方对AndFix的描述:...

zzc19981221的博客 254
上一篇: Android Dex 64k Method Size Limit
下一篇: MVX Android设计架构浅析-MVVM
linroidh
博客等级 码龄16年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值