booster-task-compression
这个组件主要做了3件事:
- 删除冗余的图片资源
- 压缩图片资源
- 重新压缩
resourceXX.ap_
文件中的资源
在分析它们的实现之前,我们先来了解一下Android的资源编译过程:
回顾 App 资源编译步骤
对于资源编译有哪些步骤我并没有找到比较详细官方文档,不过我们可以通过查看com.android.tools.build:gradle
的源码来了解这个过程。构建一个app
包所涉及的到GradleTask(比如assembleRelease)
的源码大概位于ApplicationTaskMamager.java
文件中:
ApplicationTaskManager.java
@Override
public void createTasksForVariantScope(final TaskFactory tasks, final VariantScope variantScope) {
BaseVariantData variantData = variantScope.getVariantData();
...
// Create all current streams (dependencies mostly at this point)
createDependencyStreams(tasks, variantScope);
...
// Add a task to process the manifest(s)
recorder.record(
ExecutionType.APP_TASK_MANAGER_CREATE_MERGE_MANIFEST_TASK,
project.getPath(),
variantScope.getFullVariantName(),
() -> createMergeApkManifestsTask(tasks, variantScope));
...
// Add a task to merge the resource folders
recorder.record(
ExecutionType.APP_TASK_MANAGER_CREATE_MERGE_RESOURCES_TASK,
project.getPath(),
variantScope.getFullVariantName(),
(Recorder.VoidBlock) () -> createMergeResourcesTask(tasks, variantScope, true));
// Add a task to merge the asset folders
recorder.record(
ExecutionType.APP_TASK_MANAGER_CREATE_MERGE_ASSETS_TASK,
project.getPath(),
variantScope.getFullVariantName(),
() -> createMergeAssetsTask(tasks, variantScope, null));
recorder.record(
ExecutionType.APP_TASK_MANAGER_CREATE_PROCESS_RES_TASK,
project.getPath(),
variantScope.getFullVariantName(),
() -> {
// Add a task to process the Android Resources and generate source files
createApkProcessResTask(tasks, variantScope);
// Add a task to process