关于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()

猜你喜欢

转载自www.cnblogs.com/qwangxiao/p/10569249.html
今日推荐