AresTransform.groovy 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package com.gradle.ares
  2. import com.gradle.JarZipUtil
  3. import com.gradle.ModifyClassTransform
  4. import org.gradle.api.Project
  5. import org.objectweb.asm.ClassReader
  6. import org.objectweb.asm.ClassWriter
  7. /**
  8. * Created by Glen on 2017/2/7.
  9. */
  10. public class AresTransform extends ModifyClassTransform {
  11. public AresTransform(Project project) {
  12. super(project);
  13. }
  14. @Override
  15. String getName() {
  16. return "AresPlugin"
  17. }
  18. @Override
  19. protected void handleChangedFile(File input) {
  20. String path = input.absolutePath.replace("/", "\\")
  21. if (input.isFile()) {
  22. debug("changed:" + path)
  23. if (path.endsWith(".class")) {
  24. modifyClass(input)
  25. } else if (path.endsWith(".jar")) {
  26. boolean modify = false
  27. if (path.contains("exploded-aar") && !path.contains("exploded-aar\\com.android.support")) {
  28. modify = true
  29. }
  30. if (modify) {
  31. //需要处理的jar包
  32. File tmp = new File(input.getParent() + File.separator + "tmp")
  33. tmp.deleteOnExit()
  34. JarZipUtil.unzipJar(input, tmp.absolutePath)
  35. modify = false
  36. tmp.eachFileRecurse { File file ->
  37. if (file.isFile()) {
  38. if (modifyClass(file)) {
  39. modify = true
  40. }
  41. }
  42. }
  43. if (modify) JarZipUtil.zipJar(tmp.absolutePath, input)
  44. }
  45. }
  46. }
  47. }
  48. /**
  49. * 修改类文件
  50. * @param clazz
  51. * @return
  52. */
  53. private boolean modifyClass(File clazz) {
  54. ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS)
  55. ClassReader cr = new ClassReader(clazz.bytes)
  56. ClassAdapter adapter = new ClassAdapter(cw, project)
  57. cr.accept(adapter, ClassReader.SKIP_DEBUG)
  58. if (adapter.modify) {
  59. FileOutputStream out = new FileOutputStream(clazz)
  60. out.write(cw.toByteArray())
  61. out.close()
  62. }
  63. return adapter.modify
  64. }
  65. }