近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find class "x.x.x.xActivity" on path: 我自己在插件代码里书写的Activity,我是全部继承了PluginActivity.不过由于在插件中还使用了其他第三方的SDK,后来去查看插件APK的DEX发现第三方SDK的Activity的父类还是Activity. 后来…
前言 继上次爬完了热修复的坑位,中途爬了各种各样的坑.今天我们来说说插件化Replugin的坑位.Replugin刚出的时候我就看过了.第一次看的时候可能心态不好.没看懂= =第二次重头在看,发现蛮简单的,可能一两个小时就搞定了.但是这玩意出来我就知道了.今天才整理.这就可想而知,坑位多的有点可怕.好了.下面,我们一一整理这些各式各样的坑. 主程序接入 gradle的依赖 在整个项目的build.gradle中添加如下代码: buildscript { dependencies { classp…
想起来之前做的一个项目:那时候是把需要的源代码通过文件流输出到一个.java文件里,然后调用sun的Comipler接口动态编译成.class文件,然后再用专门写的一个class loader加载这个class到jvm, 这样就可以使用这个动态生成的class里的方法了. 所以大致的过程是:文本化的源代码 -> 编译 -> .class文件 -> 通过流输入到defineClass()接口加载到jvm 这种技术可以用来实现AOP和动态代理等等. 之后在java 6,java把上述sun的…
转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普通App那样灵活.那么下面就让我们一起深入♂了解它吧. (ps :阅读本文请多参考源码图片 ( ̄^ ̄)ゞ ) 一.介绍 RePlugin对比其他插件化,它的强大和特色,在于它只Hook住了ClassLoader.One Hook这个坚持,最大程度保证了稳定性.兼容性和可维护性,详见<全面插件化——R…
前言:前一段时间新开源了一种全面插件化的方案-- RePlugin,之前一种都在关注 DroidPlugin 并且很早也在项目中试用了,但最终没有投入到真正的生产环节,一方面是项目中没有特别需要插件化的需求,另一方面也考虑到 DroidPlugin 不是特别稳定,Android系统每更新一次 DroidPlugin 可能就会出现一些 Bug,毕竟 Hook 了 Android 原生的太多东西,系统一旦更新引发 Bug 是在所难免的.当然,这些并不能否认 DroidPlugin 的优秀,它的原理和…
https://zh.wikipedia.org/wiki/自修改代码 自修改代码(Self-modifying code)是指程序在运行期间(Run time)修改自身指令.可能的用途有:病毒利用此方法逃避杀毒软件的查杀,反静态分析,反盗版[1] ,单片机程序升级. 在暂存存储器中执行代码的计算机,可修改内存中的代码段,以往这种方法常被黑客用来制造病毒(参见:EICAR 测试病毒),现今许多操作系统及CPU提供限制程序修改代码段的方法.还可用于程序保护,增加软件破解人员的静态分析难度[2].…
一.JDK动态代理 Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及 InvocationHandler 便可为目标接口生成代理类及代理对象.我们称这个Java技术为:动态代理 @CallerSensitive public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, Invoca…
接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transClass() throws IOException { URL resource = rpcMain.class.getClass().getResource("/"); byte[] bts = ProxyGenerator.generateProxyClass("$Proxy0…
Tips: ASM使用访问者模式,学会访问者模式再看ASM更加清晰 ClassReader 用于读取字节码,父类是Object 主要作用: 分析字节码里各部分内容,如版本.字段等等 配合其他Visitor使用 主要使用的方法 public void accept(ClassVisitor classVisitor, int parsingOptions) { this.accept(classVisitor, new Attribute[0], parsingOptions); } // 第一个…
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实现细节,回顾携程Android App的架构演化过程,期望我们的经验能帮助到更多的Android工程师. 需求驱动 2014年,随着业务发展需要和携程无线部门的拆分,各业务产品模块归属到各业务BU,原有携程无线App开发团队被分为基础框架.酒店.机票.火车票等多个开发团队,从此携程App的开发和发布…