文章目录
Task17: javaPreCompileDebug
1. input/ouput
taskName:javaPreCompileDebug
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/appcompat-v7-26.1.0.aar/2774ea4f1cf1e83a6ad8e8d3c8b463b6/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/constraint-layout-1.1.3.aar/f43c0ba95b6494825ed940fc4f04662b/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/animated-vector-drawable-26.1.0.aar/559112320064089dfaf6780e71d5b44f/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-vector-drawable-26.1.0.aar/c2c3ad4abfd49316f6769b8238b0f010/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-v4-26.1.0.aar/9ac5f97e8ccb24c52b7cbb6202c12ad0/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-media-compat-26.1.0.aar/53ab5ad72634f3497309a8788f3ca200/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-fragment-26.1.0.aar/7e6a4ce6591d722d47aafc36d980f8b4/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-core-utils-26.1.0.aar/4c474caa9ac1f01c4936bd96905ecacd/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-core-ui-26.1.0.aar/868eaa7e0c620cd85d72ad4f340e8bb1/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-compat-26.1.0.aar/4ec3c1c46e5bad9ac3b91f45a2afec3e/jars/classes.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.android.support/support-annotations/26.1.0/814258103cf26a15fcc26ecce35f5b7d24b73f8/support-annotations-26.1.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.android.support.constraint/constraint-layout-solver/1.1.3/bde0667d7414c16ed62d3cfe993cff7f9d732373/constraint-layout-solver-1.1.3.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/runtime-1.0.0.aar/5b2333922ba05b1f174de51739b24d14/jars/classes.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/android.arch.lifecycle/common/1.0.0/e414a4cb28434e25c4f6aa71426eb20cf4874ae9/common-1.0.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/android.arch.core/common/1.0.0/a2d487452376193fc8c103dd2b9bd5f2b1b44563/common-1.0.0.jar
=========================================================
output:/Users/apple/work/project/AndroidGradleTaskDemo/app/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
从日志可以看出该任务是生成一个annotationProcessors.json文件,该文件记录了主工程所依赖的注解处理器库
2. 验证
在build.gradle添加
dataBinding {
enabled = true
}
重新执行打包,可以看到该json文件中记录了databinding-compiler-3.2.0.jar
因为databindg原理也是基于APT技术实现,而其实现类就是记录文件中的jar
3. 核心类(JavaPreCompileTask)
...
@VisibleForTesting static final String DATA_BINDING_SPEC = "android.databinding.DataBinding";
private static final String PROCESSOR_SERVICES =
"META-INF/services/javax.annotation.processing.Processor";
private File processorListFile;
...
@TaskAction
public void preCompile() throws IOException {
boolean grandfathered = annotationProcessorOptions.getIncludeCompileClasspath() != null;
Collection<ResolvedArtifactResult> compileProcessors = null;
if (!grandfathered) {
// 1. 搜集compileClasspaths中涉及到注解处理器
compileProcessors = collectAnnotationProcessors(compileClasspaths);
FileCollection annotationProcessors =
annotationProcessorConfiguration.getArtifactFiles();
compileProcessors =
compileProcessors
.stream()
.filter(artifact -> !annotationProcessors.contains(artifact.getFile()))
.collect(Collectors.toList());
// 如果发现编译类路径存在包含注解处理器的jar,则抛出异常
// 此处新手集成butterknife经常会遇到,原因是没有使用annotationProcessor配置引用
if (!compileProcessors.isEmpty()) {
String message =
"Annotation processors must be explicitly declared now. The following "
+ "dependencies on the compile classpath are found to contain "
+ "annotation processor. Please add them to the "
+ annotationProcessorConfigurationName
+ " configuration.\n - "
+ Joiner.on("\n - ")
.join(convertArtifactsToNames(compileProcessors))
+ "\nAlternatively, set "
+ "android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true "
+ "to continue with previous behavior. Note that this option "
+ "is deprecated and will be removed in the future.\n"
+ "See "
+ "https://developer.android.com/r/tools/annotation-processor-error-message.html "
+ "for more details.";
if (isTestComponent) {
getLogger().warn(message);
} else {
throw new RuntimeException(message);
}
}
}
// Get all the annotation processors for metrics collection.
Set<String> classNames = Sets.newHashSet();
// 一般是读取build.gralde中includeCompileClasspath属性值,如果true,执行扫描操作,开关打开会影响性能
// Add the annotation processors on classpath only when includeCompileClasspath is true.
if (Boolean.TRUE.equals(annotationProcessorOptions.getIncludeCompileClasspath())) {
if (compileProcessors == null) {
compileProcessors = collectAnnotationProcessors(compileClasspaths);
}
classNames.addAll(convertArtifactsToNames(compileProcessors));
}
// 2. 搜集所有注解处理器
// Add all annotation processors on the annotation processor configuration.
classNames.addAll(
convertArtifactsToNames(
collectAnnotationProcessors(annotationProcessorConfiguration)));
// 3. 存储到集合中
// Add the explicitly declared processors.
// For metrics purposes, we don't care how they include the processor in their build.
classNames.addAll(annotationProcessorOptions.getClassNames());
// Add a generic reference to data binding, if present.
if (dataBindingEnabled) {
classNames.add(DATA_BINDING_SPEC);
}
// 3. 清理旧文件
FileUtils.deleteIfExists(processorListFile);
// 4. 写文件
Gson gson = new GsonBuilder().create();
try (FileWriter writer = new FileWriter(processorListFile)) {
gson.toJson(classNames, writer);
}
}
可以看到该任务是遍历所有jar,判断jar中META-INF//services目录中是否存在javax.annotation.processing.Processor文件,如果存在记录下,并保存到json文件中;注意下:JavaPreCompileTask只是继承类AndroidBuilderTask类,并不支持增量更新操作,但带有 Gradle-CacheableTask注解,所以其实是有缓存的,
/**
* Returns a List of packages in the configuration believed to contain an annotation processor.
*
* <p>We assume a package has an annotation processor if it contains the
* META-INF/services/javax.annotation.processing.Processor file.
*/
private static List<ResolvedArtifactResult> collectAnnotationProcessors(
ArtifactCollection configuration) {
List<ResolvedArtifactResult> processors = Lists.newArrayList();
for (ResolvedArtifactResult artifact : configuration) {
File file = artifact.getFile();
if (!file.exists()) {
continue;
}
if (file.isDirectory()) {
if (new File(file, PROCESSOR_SERVICES).exists()) {
processors.add(artifact);
}
} else {
try (JarFile jarFile = new JarFile(file)) {
JarEntry entry = jarFile.getJarEntry(PROCESSOR_SERVICES);
//noinspection VariableNotUsedInsideIf
if (entry != null) {
processors.add(artifact);
}
} catch (IOException iox) {
// Can happen when we encounter a folder instead of a jar; for instance, in
// sub-modules. We're just displaying a warning, so there's no need to stop the
// build here.
}
}
}
return processors;
}
参考
Task18:compileDebugJavaWithJavac
1. input/output
taskName:compileDebugJavaWithJavac
input:/Users/apple/work/project/AndroidGradleTaskDemo/app/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/adapters-3.2.0.aar/49b3d7e4ab68d92f056ea8f56b33e9fb/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/library-3.2.0.aar/818ffb3fe5dc5eeb6b4e51c93615b7fb/jars/classes.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.android.databinding/baseLibrary/3.2.0/fb5f8492c36231104cd86feaefa723291504c0a6/baseLibrary-3.2.0.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/appcompat-v7-26.1.0.aar/2774ea4f1cf1e83a6ad8e8d3c8b463b6/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/constraint-layout-1.1.3.aar/f43c0ba95b6494825ed940fc4f04662b/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-v4-26.1.0.aar/9ac5f97e8ccb24c52b7cbb6202c12ad0/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-fragment-26.1.0.aar/7e6a4ce6591d722d47aafc36d980f8b4/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-core-utils-26.1.0.aar/4c474caa9ac1f01c4936bd96905ecacd/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/animated-vector-drawable-26.1.0.aar/559112320064089dfaf6780e71d5b44f/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-vector-drawable-26.1.0.aar/c2c3ad4abfd49316f6769b8238b0f010/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-media-compat-26.1.0.aar/53ab5ad72634f3497309a8788f3ca200/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-core-ui-26.1.0.aar/868eaa7e0c620cd85d72ad4f340e8bb1/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/support-compat-26.1.0.aar/4ec3c1c46e5bad9ac3b91f45a2afec3e/jars/classes.jar
input:/Users/apple/.gradle/caches/transforms-1/files-1.1/runtime-1.0.3.aar/5765c0929bc6bc40d70d6fc25f402f42/jars/classes.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/android.arch.lifecycle/common/1.0.3/7d7f60c4783872861222166f6164215f8951c7b1/common-1.0.3.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/android.arch.core/common/1.0.0/a2d487452376193fc8c103dd2b9bd5f2b1b44563/common-1.0.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.android.support/support-annotations/26.1.0/814258103cf26a15fcc26ecce35f5b7d24b73f8/support-annotations-26.1.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.android.support.constraint/constraint-layout-solver/1.1.3/bde0667d7414c16ed62d3cfe993cff7f9d732373/constraint-layout-solver-1.1.3.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/androidx.databinding/databinding-compiler/3.2.0/765e0039a232d79ab0251a27665184f5546a5cdd/databinding-compiler-3.2.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/androidx.databinding/databinding-compiler-common/3.2.0/b73212517c2f1c275a38dc9623e78ed020d7d887/databinding-compiler-common-3.2.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/androidx.databinding/databinding-common/3.2.0/8908b4818c8f5add9fb9e33130135e96be1bb6ab/databinding-common-3.2.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre8/1.2.0/505f55b9619bbc5f5e26c77427dd24a6a441eef1/kotlin-stdlib-jre8-1.2.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.9/9ce04e34240f674bc72680f8b843b1457383161a/commons-codec-1.9.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/org.antlr/antlr4/4.5.3/f35db7e4b2446e4174ba6a73db7bd6b3e6bb5da1/antlr4-4.5.3.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.googlecode.juniversalchardet/juniversalchardet/1.0.3/cd49678784c46aa8789c060538e0154013bb421b/juniversalchardet-1.0.3.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/23.0/c947004bb13d18182be60077ade044099e4f26f1/guava-23.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.squareup/javapoet/1.8.0/e858dc62ef484048540d27d36f3ec2177a3fa9b1/javapoet-1.8.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.android.tools.build.jetifier/jetifier-core/1.0.0-alpha10/9eb7027c383061de12f93aae7a22cbeb97832d2a/jetifier-core-1.0.0-alpha10.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.0/c4ba5371a29ac9b2ad6129b1d39ea38750043eff/gson-2.8.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.android.tools/annotations/26.2.0/e1c021729dcc35bfc5784a1def99021254f2d262/annotations-26.2.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jre7/1.2.0/ec8b969e26fbcf2265a4d1a1539c4d1d4c5af380/kotlin-stdlib-jre7-1.2.0.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.2.20/1ce9e25c74aade0aa039cce459f2906a8c8ffc8e/kotlin-stdlib-1.2.20.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/1.3.9/40719ea6961c0cb6afaeb6a921eaa1f6afd4cfdf/jsr305-1.3.9.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.0.18/5f65affce1684999e2f4024983835efc3504012e/error_prone_annotations-2.0.18.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.1/ed28ded51a8b1c6b112568def5f4b455e6809019/j2objc-annotations-1.1.jar
input:/Users/apple/.gradle/caches/modules-2/files-2.1/org.code