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源码解析部分也会有博文更新,未完待续…

高通camera:PDAF的配置与测试 确认相关log日志都已经打开了之后,判断是在3A算法中没有应用到PDAF,可能是之前在调试AF效果的时候关闭了PDAF,打开效果文件对应的文件夹,在\kamorta_lce_S5K3P9\Scenario.Default\XML\STATS。在log中搜索af_pdaf_proc_pd_single,这个函数是pdaf算法中的,源码被封装了,这里看不到,因此只能通过log打印出来的参数来分析pd是否正确,主要参数有pd ,defocus,confidence。PDAF的配置与测试。 阅读详情

相关推荐

【CUT&TAG分析-加了spike in的样品】

使用 Bowtie2 或 Subread (subjunc) 来构建大肠杆菌的索引。bowtie2比对时设置参数–local, 局部比对。

weixin_57975238的博客 1400

使用android studio编程异常汇总

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

feisher 1729

【LLM】ms-Swift框架下SFT与GRPO协同优化的高效训练策略

本文深入探讨了ms-Swift框架下监督微调(SFT)与群组相对策略优化(GRPO)的协同训练策略,提升大型语言模型(LLM)的性能与效率。通过创新的架构设计和两阶段训练流程,结合GRPO的群组奖励估计与动态基线调整技术,显著优化了数学推理等任务的准确率。文章还分享了计算资源高效利用和参数调优的实战经验,为LLM训练提供了实用指导。

green的博客 994

Android在线热修复基本流程

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

weixin_42009516的博客 617

CLASSB类移植(满足IEC 60730-1和60355-1标准)

针对软件认证需要满足IEC 60730-1和60335-1标准,ST公司专门提供的软件扩展包X-CUBE-CLASSB,它包含自测库和文档,支持多种STM32系列芯片,通过预集成测试库和标准化流程,帮助开发者快速满足国际安全标准,适用于家电、工业控制等高可靠性场景。ClassB软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,MCU在上电的时候会进行复位启动,在启动完成以后会进行运行自检。

m0_61973119的博客 1402

Python白色飘雪(完整代码)

Python绘制白色飘雪动画的完整代码。

AIGC 3万+

Android 热修复其实很简单

android AndFix 热修复 动态加载

Dennis-Android的博客 2万+

duilib 实现截屏选取功能分析

本文关注点不再截屏而是截屏选取工具 1首先肯定是个透明窗口,且置顶并且是工具窗口(任务栏不显示窗口图标) 窗口样式 <?xml version="1.0" encoding="utf-8"?> <Window shadowattached="false"> <Box > <VBox name="track_box" margin="200,200,200,200" bkimage="file='screen_bord...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 908

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

Linux 内核中 ARP 协议的全链路解析:从触发机制到物理层发送

核心设计思想按需解析:减少不必要的 ARP 请求,降低网络负载。分层解耦:协议栈各层(邻居子系统、Netfilter、驱动)职责分离,提高扩展性。ARP的核心作用是将IP映射为MAC地址,确保数据链路层能正确封装帧。其触发时机围绕“未知MAC地址需求”展开,覆盖通信初始化、缓存更新、网络变更及维护等多种场景。

数字人生 367

Qt实现YOLO目标检测及其界面制作(附完整源码)

Qt实现YOLO目标检测及其界面制作(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2739

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

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

Able 680

Explorer.exe系统错误,电脑重启后刚开始一段时间正常,过一会桌面任务栏就卡死,可以打开任务管理器

联想E14Win10专业版。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 8050

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

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

weixin_42525632的博客 592

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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、付费专栏及课程。

余额充值