近期在接入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. 后来想起来之前由于在插件app的build.gradle有句配置因为编译不通过给删除了
  
  // 这个plugin需要放在android配置之后,因为需要读取android中的配置项
  
  apply plugin: 'replugin-plugin-gradle'
  
  这个gradle插件是做什么用的呢?
  
  经过资料查找大概明白了情况。
  
  这个gradle作用于插件apk,主要是在插件app编译期间利用Transform api在class文件转换为dex文件之前对Java 字节码文件进行操作,利用Java字节码库Javassist进行代码注入,从而达到不修改插件apk工程源码前提下载编译器对插件apk进行动态修改的目的。
  
  修改内容包括:
  
  a. 将插件中所有的XXXActivity类中的顶级XXXActivity父类修改为插件库replugin-plugin-library中的XXXPluginActivity类,反编译看看就能发现最终插件apk的各个Activity继承了XXXPluginActivity父类。
  
  查找的资料:
  
  https://blog.csdn.net/hellogmm/article/details/79056660
  
  打开一个PDF文档的操作顺序是:用open()函数打开文件并用一个变量来接收,然后把变量给传递给PdfFileReader对象,形成一个PdfFileReader对象,这样用PdfFileReader对象下面的各种方法、属性去操作PDF文档。
  
  PdfFileReader对象常用方法:
  
  (1)、PyPDF2.PdfFileReader()方法:代表一个PdfFileReader对象。
  
  (2)、getPage() 方法:获取FDF文档页数;
  
  (3)、extractText()方法:获取当前PDF文档当前页面的文本内容。
  
  (4)、decrypt()方法:用来给加密的PDF文档接收密码(解密);
  
  (5)、rotateClockwise()和 rotateCounterClockwise()方法:可以将文档旋转90/180/270度;
  
  (6)、mergePage()方法:用来叠加PDF文档页面(类似加水印);
  
  PdfFileReader对象常用属性:
  
  (1)、pdfReader.numPages 属性:获取当前文档对象总页数。
  
  (2)、 isEncrypted 属性:用于判断PDF文档是否是加密的,如果是加密的,返回True,否则返回False.
  
  (3)、
  
  例如:
  
  >>> import PyPDF2
  
  >>> pdfFileObj = open('meetingminutes.pdf'www.ysyl157.com, 'rb')
  
  >>> pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
  
   >>> pdfReader.numPages
  
  19
  
   >>> pageObj = pdfReader.getPage(www.meiwanyule.cn)
  
   >>> pageObj.extractText()
  
  PdfFileWriter 对象
  
  操作顺序:
  
  1.打开一个或多个已有的 PDF(源 PDF) ,得到 PdfFileReader 对象。
  
  2.创建一个新的 PdfFileWriter 对象。
  
  3.将页面从 PdfFileReader 对象拷贝到 PdfFileWriter 对象中。
  
  4.最后,利用 PdfFileWriter 对象写入输出的 PDF。
  
  PdfFileWriter 对象常用方法:
  
  addPage()方法:将源PDF文档页面添加到新的PDF文档里面(复制)。
  
  write()方法:将PdfFileWriter 对象保存的信息写入到变量(文件)中。
  
  encrypt() 方法:用来给文档加密,在文件写入前使用此方法,可以给文档进行加密。
  
  例如:
  
  import PyPDF2
  
  minutesFile=open('meetingminutes.pdf','rb')
  
  pdfReader=PyPDF2.PdfFileReader(minutesFile)
  
  page=pdfReader.getPage(www.michenggw.com)
  
  print(page.rotateClockwise(www.365soke.com))
  
  pdfWriter=PyPDF2.PdfFileWriter(www.fengshen157.com) ###创建一个PdfFileWriter()对象;
  
  pdfWriter.addPage(page) ##把复制的源PDF的page页面添加到新的PdfFileWriter() 对象中;
  
  pdfoutFile=open('rotatedPage.pdf','wb') ###打开一个名为“rotatedPage.pdf”的文档(没有则新建),然后用一个pdfoutFile变量来接收它。
  
  pdfWriter.write(pdfoutFile) ####用PdfFileWriter()对象的write方法写入到变量中;
  
  pdfoutFile.close()
  
  minutesFile.close()

关于360插件化Replugin Activity动态修改父类的字节码操作的更多相关文章

  1. 360插件化Replugin爬坑之路

    前言 继上次爬完了热修复的坑位,中途爬了各种各样的坑.今天我们来说说插件化Replugin的坑位.Replugin刚出的时候我就看过了.第一次看的时候可能心态不好.没看懂= =第二次重头在看,发现蛮简 ...

  2. Java的动态编译、动态加载、字节码操作

    想起来之前做的一个项目:那时候是把需要的源代码通过文件流输出到一个.java文件里,然后调用sun的Comipler接口动态编译成.class文件,然后再用专门写的一个class loader加载这个 ...

  3. Android 全面插件化 RePlugin 流程与源码解析

    转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...

  4. Android插件化-RePlugin项目集成与使用

    前言:前一段时间新开源了一种全面插件化的方案-- RePlugin,之前一种都在关注 DroidPlugin 并且很早也在项目中试用了,但最终没有投入到真正的生产环节,一方面是项目中没有特别需要插件化 ...

  5. 自修改代码 on the fly 动态编译 即时编译 字节码

    https://zh.wikipedia.org/wiki/自修改代码 自修改代码(Self-modifying code)是指程序在运行期间(Run time)修改自身指令.可能的用途有:病毒利用此 ...

  6. JDK动态代理和CGLIB字节码增强

    一.JDK动态代理 Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及 Invocatio ...

  7. 深挖JDK动态代理(二):JDK动态生成后的字节码分析

    接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transCl ...

  8. Java-ASM框架学习-修改类的字节码

    Tips: ASM使用访问者模式,学会访问者模式再看ASM更加清晰 ClassReader 用于读取字节码,父类是Object 主要作用: 分析字节码里各部分内容,如版本.字段等等 配合其他Visit ...

  9. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

随机推荐

  1. Elasticsearch 5.0Head插件

    Elasticsearch 5.0 —— Head插件部署指南   使用ES的基本都会使用过head,但是版本升级到5.0后,head插件就不好使了.下面就看看如何在5.0中启动Head插件吧! 官方 ...

  2. Python爬虫——用BeautifulSoup、python-docx爬取廖雪峰大大的教程为word文档

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 廖雪峰大大贡献的教程写的不错,写了个爬虫把教程保存为word文件,供大家方便下载学习:http://p ...

  3. 便捷的ajax请求

    为什么要做这个呢?如果后端给的数据不单有JSON字符串,还有对象呢?这个时候我们就要每个都处理(JSON.parse).万一后端又改了,所有都是对象呢?如此一来我们就需要对我们的ajax进行封装. 这 ...

  4. HDU 5898 odd-even number

    题目:odd-even number 链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5898 题意:给一个条件,问l 到r 之间有多少满足条件的 ...

  5. vue页面是否缓存的两种方式

    第一种 <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> ...

  6. WIndows下使用Grafana+InfluxDB打造监控系统

     前言 对于一个运维DBA来说,了解数据库的TPS.QPS很有必要(QPS:每秒查询数,即对数据库每秒的DML的操作数:TPS:每秒事物处理,即对数据库每秒DDL操作数),通过了解他们,可以掌握一个实 ...

  7. 剑指offer(10)

    题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路: 如果忽略题目中 ...

  8. js splice vs slice

    js splice vs slice https://stackoverflow.com/questions/37601282/javascript-array-splice-vs-slice htt ...

  9. 使用PHP对二维索引数组进行排序

    本例中 data 数组中的每个单元表示一个表中的一行.这是典型的数据库记录的数据集合. 例子中的数据如下: volume | edition -------+-------- 67 | 2 86 | ...

  10. python numpy笔记(重要)

    1.np.array 的shape (2,)与(2,1)含义 ndarray.shape:数组的维度.为一个表示数组在每个维度上大小的整数元组.例如二维数组中,表示数组的“行数”和“列数”. ndar ...