关于360插件化Replugin Activity动态修改父类的字节码操作
近期在接入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动态修改父类的字节码操作的更多相关文章
- 360插件化Replugin爬坑之路
前言 继上次爬完了热修复的坑位,中途爬了各种各样的坑.今天我们来说说插件化Replugin的坑位.Replugin刚出的时候我就看过了.第一次看的时候可能心态不好.没看懂= =第二次重头在看,发现蛮简 ...
- Java的动态编译、动态加载、字节码操作
想起来之前做的一个项目:那时候是把需要的源代码通过文件流输出到一个.java文件里,然后调用sun的Comipler接口动态编译成.class文件,然后再用专门写的一个class loader加载这个 ...
- Android 全面插件化 RePlugin 流程与源码解析
转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...
- Android插件化-RePlugin项目集成与使用
前言:前一段时间新开源了一种全面插件化的方案-- RePlugin,之前一种都在关注 DroidPlugin 并且很早也在项目中试用了,但最终没有投入到真正的生产环节,一方面是项目中没有特别需要插件化 ...
- 自修改代码 on the fly 动态编译 即时编译 字节码
https://zh.wikipedia.org/wiki/自修改代码 自修改代码(Self-modifying code)是指程序在运行期间(Run time)修改自身指令.可能的用途有:病毒利用此 ...
- JDK动态代理和CGLIB字节码增强
一.JDK动态代理 Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及 Invocatio ...
- 深挖JDK动态代理(二):JDK动态生成后的字节码分析
接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transCl ...
- Java-ASM框架学习-修改类的字节码
Tips: ASM使用访问者模式,学会访问者模式再看ASM更加清晰 ClassReader 用于读取字节码,父类是Object 主要作用: 分析字节码里各部分内容,如版本.字段等等 配合其他Visit ...
- 携程Android App插件化和动态加载实践
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
随机推荐
- 使用fiddlercore修改网页的返回内容
最近研究了一下FiddlerCore,发现这是个非常强大的工具.可以用来采集网页.修改网页数据.开发页游外挂等等. 使用这个工具,需要掌握一定的html和http知识,官方网站上也有例子可以下载. 看 ...
- python 实现快速排序
一.快排思想 快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数), 分别从两端开始排序,左端'i'只要小于标杆(参照数)的数,右端'j'只要大于标杆(参照数)的数, i- ...
- scrapy之基础概念与用法
scrapy之基础概念与用法 框架 所谓的框架就是一个项目的半成品.也可以说成是一个已经被集成了各种功能(高性能异步下载.队列.分布式.解析.持久化等)的具有很强通用性的项目模板. 安装 Linux: ...
- Django之ORM操作(聚合 分组、F Q)
Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作. 键的名 ...
- Django组件之认证系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...
- FAIL - Deploy Upload Failed, Exception: [org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (112503036) exceeds the configured
Message: FAIL - Deploy Upload Failed, Exception: [org.apache.tomcat.util.http.fileupload.FileUpload ...
- HTTL之初印象
概述 HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态HTML页面输出, 可替代JSP页面, 指令和Velocity相似. 简洁 ...
- Struts2——通配符,Action Method_DMI
Action wildcard 通配符(配置量降到最低) 使用通配符,就是为了配置简便,但是一定遵守“约定优于配置”原则,约定就是做项目之前最好事先与项目组的人或是自己规定好命名规则. 多个* {1 ...
- Jmeter安装与使用(压测)
一.介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件,Java Se ...
- mysql 清除大数据表单
背景:mysql数据库中有个日志表记录高达800多万,影响了mysql的正常业务访问,现需要清理三个月之前的所有数据,大概600多万(大概13G) 方法一:传统delete from xxx,传统,普 ...