You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.2 KiB
78 lines
2.2 KiB
6 years ago
|
---
|
||
|
Gradle Plugin 之 Transform API
|
||
|
---
|
||
|
|
||
|
#### 前言
|
||
|
|
||
|
在前面两篇文章中,我们熟悉了 [Gradle Plugin](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Gradle/Gradle Plugin.md) 的编写,同时也实践了一下,写了一个 [TinyPngPlugin](https://github.com/Omooo/Android-Notes/blob/master/blogs/Android/Gradle/Gralde Plugin 实践之 TinyPng Plugin.md) ,利用 TinyPng 在打包时压缩 res 下的所有的 png 图片,这是一个非常好的实践,希望你也能掌握。
|
||
|
|
||
|
本篇文章接着来讲解 Transfrom API,Transform 是用来对 class 转 dex 文件之前的 class 文件进行操作。
|
||
|
|
||
|
![](https://i.loli.net/2019/04/22/5cbd314be60b9.png)
|
||
|
|
||
|
这里的 Input 和 Output 都是 class 文件或者 jar 包,因此,我们就可以实现字节码插桩。
|
||
|
|
||
|
#### Transform
|
||
|
|
||
|
使用 Transform 依赖需要首先添加依赖:
|
||
|
|
||
|
```java
|
||
|
implementation 'com.android.tools.build:gradle:3.3.2'
|
||
|
```
|
||
|
|
||
|
Transfrom 使用还是相对简单的:
|
||
|
|
||
|
```java
|
||
|
public class DemoTransform extends Transform {
|
||
|
|
||
|
/**
|
||
|
* Transform 标识名
|
||
|
* 比如我在 app module 下依赖了这个 Plugin
|
||
|
* 那么在 app/build/intermediates/transforms/
|
||
|
* 下,就能看到我们的自定义 DemoTransform
|
||
|
*/
|
||
|
@Override
|
||
|
public String getName() {
|
||
|
return "DemoTransform";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 设置文件输入类型
|
||
|
* 类型在 TransformManager 下有定义
|
||
|
* 这里我们获取 class 文件类型
|
||
|
*/
|
||
|
@Override
|
||
|
public Set<QualifiedContent.ContentType> getInputTypes() {
|
||
|
return TransformManager.CONTENT_CLASS;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 设置文件所属域
|
||
|
* 同样在 TransformManager 下有定义
|
||
|
* 这里指定为当前工程
|
||
|
*/
|
||
|
@Override
|
||
|
public Set<? super QualifiedContent.Scope> getScopes() {
|
||
|
return TransformManager.SCOPE_FULL_PROJECT;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 是否支持增量编译
|
||
|
*/
|
||
|
@Override
|
||
|
public boolean isIncremental() {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
|
||
|
super.transform(transformInvocation);
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
这里最重要的方法就是 transform 方法。
|
||
|
|
||
|
#### ASM
|
||
|
|
||
|
ASM 是一个字节码操作库。
|