不支持InstantRun模式 解决方法: File ->Settings->Build,Execution,Deployment ->Instant Run 将右边全部取消选中,保存,重新编译,解决
InstantRun从2.0到3.0,历史解毒 前言 ? Instant Run已经出来3年了,为什么现在会想写这篇文章。...相关概念 普通构建整个apk → 部署app → app重启 → 重启Activity InstantRun只构建修改的部分 → 部署修改的dex或资源 → 部署(热部署|温部署|*冷部署) 热部署...相关代码: 下边为整个文章中所涉及的源代码: 地址 源码以及反编译文件链接:https://github.com/stven0king/InstantRun-ApkParse.git 文件目录 file...------.tanzx. ------.-------.instantrun ------.-------.-------------.BuildConfig ------.-------.----...下边列举我实际测试的结果: 修改java方法的代码 I/Toast: Show toast from OpPackageName:com.tanzx.instantrun, PackageName:com.tanzx.instantrun
那么InstantRun是怎么把业务代码运行起来的呢?...file.getPath() : null); if (Log.isLoggable("InstantRun", 2)) { Log.v("InstantRun", "Resource override...("InstantRun", "Resource patch last modified: " + resourceModified); Log.v("InstantRun", "APK last modified...dexList.isEmpty()) { if (Log.isLoggable("InstantRun", 2)) { Log.v("InstantRun", "Bootstrapping class...= null) { if (Log.isLoggable("InstantRun", 2)) { Log.v("InstantRun", "About to create real application
热修复技术概述 热修复技术在近年来飞速发展,尤其是在InstantRun方案推出之后,各种热修复技术竞相涌现。...各大主流方案在资源修复的实现上大多参考了InstantRun的实现方式,因此本章节先讨论了InstantRun,再分析了基于InstantRun所实现的热修复。...一、InstantRun InstantRun在AndroidStudio2.0.0中引入。...InstantRun包括代码修复和在资源修复,资源修复的核心代码: 其实做了两件事: 通过反射替换掉原有的AssetManager 找到引用了原AssetManager对象的字段并替换为新的引用。...二、资源热修复实现 将InstantRun的monkeyPatchExistingResource方法引入我们的代码就可以实现资源热修复,效果如下: SO库热修复 so库的修复本质是对native方法的修复和替换
热修复技术概述 热修复技术在近年来飞速发展,尤其是在InstantRun方案推出之后,各种热修复技术竞相涌现。...各大主流方案在资源修复的实现上大多参考了InstantRun的实现方式,因此本章节先讨论了InstantRun,再分析了基于InstantRun所实现的热修复。...InstantRun InstantRun在AndroidStudio2.0.0中引入。 InstantRun包括代码修复和在资源修复,资源修复的核心代码: ? ? ? ? 其实做了两件事: 1....资源热修复实现 将InstantRun的monkeyPatchExistingResource方法引入我们的代码就可以实现资源热修复,效果如下: ?
PicassoProvider.context).build(); } } } return singleton; } } InstantRun...相关知识可以阅读 InstantRun从2.0到3.0,历史解毒 这篇文章。
(也可以参考 InstantRun 做到不修改 Application 达到替换 Application 的效果,但该方案大量 hook 系统 api,不够稳定,大概有 1/1w 的概率会出现替换失败,...所以Tinker最终还是没有使用InstantRun的方式) 还有两个问题,留给大家去思考: 会不会影响业务方加固?...方案参考: 基于Tinker的SDK全局热更新方案(全网唯一) 扩展: InstantRun 如何动态替换 Application,总结起来就两步: 打包时替换 Application 标签,插入
(也可以参考 InstantRun 做到不修改 Application 达到替换 Application 的效果,但该方案大量 hook 系统 api,不够稳定,大概有 1/1w 的概率会出现替换失败,...所以Tinker最终还是没有使用InstantRun的方式) 还有两个问题,留给大家去思考: 会不会影响业务方加固?...* 方案参考: 基于Tinker的SDK全局热更新方案(全网唯一) * 扩展: InstantRun 如何动态替换 Application,总结起来就两步: 打包时替换 Application
multidex support" : " does not have multidex support")); return isMultidexCapable; } } InstantRun...支持 在自己运行过程中,貌似InstantRun是不生效的。...= applicationInfo.splitSourceDirs) { // add the split apk, normally for InstantRun, and newest...instantRunSourcePaths.addAll(Arrays.asList(applicationInfo.splitSourceDirs)); Log.d(Consts.TAG, "Found InstantRun...support"); } } catch (Exception e) { Log.e(Consts.TAG, "InstantRun
init过程中将无效 ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(如果在InstantRun
,加载插件资源 查找所有的Resources/Theme,替换其中的AssetManger 清理Resources缓存,重建Theme AssetManager的重建保护,防止丢失插件路径 这个方案和InstantRun...有点类似,但是原生InstantRun有太多的问题: 清理顺序错误,应该先清理Applicaiton后清理Activity Resources/Theme找不全,没有极端情况应对机制 Theme光清理不重建...完全不适配 Support包里面自己埋的“雷” 等等 举个例子Theme找不全:InstantRun会替换Theme中的AssetManager,做法是从每个Activity里面获取。
} 最终还是调用的dexFile.loadClassBinaryName()方法,其中的第二个参数其实就已经是AndroidNClassLoader了 加载补丁资源 Tinker的资源更新采用的InstantRun...然后调用monkeyPatchExistingResources方法(这个方法的名字跟InstantRun的资源补丁方法名是一样的),将补丁资源路径(res/resources.apk)传递进去,代码就不贴了...**目前来看InstantRun的资源更新方式最简便而且兼容性也最好,市面上大多数的热补丁框架都采用这套方案。
上面是热修复框架的一些对比,如果按照实现 dex 修复的原理来划分的话,大概能分成下面几种: native hook Andfix dex 插桩 QzoneNuwa InstantRun Robust...10.4 InstantRun 原理 InstantRun 是 AndroidStudio 2.0 新增的功能,方便快速的增量编译应用并部署,美团参照其原理实现了 Robust 热修复框架。...11.1 替换 AssetManager 这个是 InstantRun 采用的方案,就是构造一个新的 AssetManager,反射调用其 addAssetPath 函数,把新的补丁资源包添加到 AssetManager
解决方法二: Android Studio2.0以上有了Instant Run功能,很多情况下运行报错都跟Instant Run有关 进入File –> Setting(Ctrl+Alt+S)找到InstantRun...功能,把InstantRun功能关闭。
支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持InstantRun 支持MultiDex...init之前,否则这些配置在init过程中将无效 ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(如果在InstantRun
通过控制反转来做组件解耦 ARouter的已支持功能 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持InstantRun...init之前,否则这些配置在init过程中将无效 ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 开启调试模式(如果在InstantRun
带着这个目标调研了很多方案,其中就有 BUCK、Freeline、InstantRun 等知名框架。...InstantRun 是 Google 推荐的加速方式,拥有最全面的支持性,但由于我们是多进程的工程,并且 InstantRun 在编译时的一些准备 Task 也会消耗一些时间,在实践过程中发现加速并不明显
所以运行期Hook使用的是InstantRun,在构建期Hook使用的是JavaAgent。 ? 在IOS上注入代码很简单,在Andriod上就比较复杂了。 ?
因为每个被修改的类都被改了名字,类名在原名后面添加$override,目录在app/build/intermediates/transforms/instantRun/debug/folders/4000...输出目录在app/build/intermediates/transforms/instantRun/debug/folders/1/,给所有的类添加change字段,change为IncrementalChange
在这里我们并没有使用类似InstantRun hook Application的方式,而是通过代码框架的方式来避免,这也是为了尽量少的去反射,提升框架的兼容性。...CLASS_ISPREVERIFIED 问题,QZone 通过插桩解决这个问题,这里就不多说了 Tinker 则是将合并后的全量 dex 插在数组前,这样就避免了这个问题的出现 加载资源 Tinker的资源更新采用的 InstantRun...TinkerResourceLoader#loadTinkerResource 调用 TinkerResourcePatcher#monkeyPatchExistingResources (这个方法的名字跟 InstantRun
领取专属 10元无门槛券
手把手带您无忧上云