当前位置: 首页 > news >正文

适配 AGP8.5 版本,转换过程(四)

在这里插入图片描述

Public Artifact

支持的组件输出、输入类型

  • FILE:文件
  • DIRECTORY:目录

SingleArtifact

支持的转换类型:(列举几个常用的)

  • APK:安装包路径
  • MERGED_MANIFEST:Manifest 文件
  • OBFUSCATION_MAPPING_FILE:mapping.txt 文件
  • AAR:aar 包
  • ASSETS:assets 文件
  • MERGED_NATIVE_LIBS:so 库文件

1. 立刻终止构建

AGP7+

之前我是这样直接抛出异常,还是比较快终止构建,到 AGP8 之后发现不行了,默认开启即使抛出异常也会继续执行剩下的 Task

class ExceptionHelper {

    companion object {

        @JvmStatic
        fun throwExecution(msg: String) {
            throw GradleException(msg)
            System.exit(-1)
        }
    }
}

AGP8+

可以在插件初始化时设置

//抛出异常时立刻停止构建,其实 AGP 低版本也有这个
project.gradle.startParameter.isContinueOnFailure = false

在这里插入图片描述

2. Manifest 合并

AGP+7

  • 获取所有 Task project.tasks.findAll().iterator()
  • 遍历、判断 Task name,拿到特定任务(如 processReleaseManifest、mergeReleaseAssets)
  • 为特定 Task 添加前后执行逻辑(设置 doFirst 、doLast)
project.afterEvaluate {
	expendTask()
}

private List expendTask() {
    Iterator<Task> eIterator = project.tasks.findAll().iterator()
    while (eIterator.hasNext()) {
        Task theTask = eIterator.next()
        switch (CommUtils.judgeTaskType(theTask.name)) {
            case TaskType.TASK_PROCESS_RELEASE_MANIFEST:
                theTask.doLast {
                }
                break
        }
    }
}

AGP8+

  • 指定输入:@get:InputFile
  • 指定输出:@get:OutputFile(一定要输出,否则下一个 Transform 没有输入)
  • 指定 SingleArtifact:SingleArtifact.MERGED_MANIFEST
private fun registerTransform(project: Project) {
    val androidExt = project.extensions.getByType(AndroidComponentsExtension::class.java)
    androidExt.onVariants { variant ->
    	//处理 manifest 文件
        val manifestUpdater = project.tasks.register(
            variant.name + "ManifestTransformerTask", ManifestTransformerTask::class.java
        ) {}
        variant.artifacts.use(manifestUpdater).wiredWithFiles(
            ManifestTransformerTask::mergedManifest,
            ManifestTransformerTask::updatedManifest
        ).toTransform(SingleArtifact.MERGED_MANIFEST)
    }
}
abstract class ManifestTransformerTask : DefaultTask() {
    @get:InputFile
    @get:PathSensitive(PathSensitivity.NONE)
    abstract val mergedManifest: RegularFileProperty

    @get:OutputFile
    abstract val updatedManifest: RegularFileProperty

    @TaskAction
    fun taskAction() {
        println("ManifestTransformerTask run")
        var manifest = mergedManifest.asFile.get().readText()
        //todo:解析 manifest  并做相应修改或查找,最后输出更新

        updatedManifest.get().asFile.writeText(manifest)
    }
}

3. Assets 合并

AGP7+

project.afterEvaluate {
	expendTask()
}

private List expendTask() {
    Iterator<Task> eIterator = project.tasks.findAll().iterator()
    while (eIterator.hasNext()) {
        Task theTask = eIterator.next()
        switch (CommUtils.judgeTaskType(theTask.name)) {
            case TaskType.TASK_MERGE_RELEASE_ASSETS:
                theTask.doLast {
                }
                break
        }
    }
}

AGP8+

  • 指定输入:@get:inputDir
  • 指定输出:@get:outputDir(一定要输出,否则下一个 Transform 没有输入)
  • 指定 SingleArtifact:SingleArtifact.ASSETS
private fun registerTransform(project: Project) {
    project.plugins.withType(AppPlugin::class.java) {
        val appExt =
            project.extensions.getByType(ApplicationAndroidComponentsExtension::class.java)
        appExt.onVariants { variant ->
            //assets merge
            val assetsTaskProvider =
                project.tasks.register(
                    variant.name + ConstantStr.PREFIX_TRANSFORM + "AssetsTransformerTask",
                    AssetsTransformerTask::class.java
                )
            variant.artifacts.use(assetsTaskProvider)
                .wiredWithDirectories(
                    AssetsTransformerTask::inputDir,
                    AssetsTransformerTask::outputDir
                ).toTransform(SingleArtifact.ASSETS)
        }
    }
}

注意点:

  • transform 前清空输出目录:PluginFileUtils.deleteFolder(outFileDir)
  • assets 路径变更:
    • AGP6+:build\intermediates\merged_assets
    • AGP7+、8+:build\intermediates\assets\release\mergeReleaseAssets
abstract class AssetsTransformerTask : DefaultTask() {
    @get:InputDirectory
    abstract val inputDir: DirectoryProperty

    @get:OutputDirectory
    abstract val outputDir: DirectoryProperty

    @TaskAction
    fun taskAction() {
        val outFileDir = outputDir.asFile.get()
        if (outFileDir.exists()) {
        	//否则报错:文件已存在(不 clean build 目录情况下)
            CmdColorPrintUtils.outputYellow("重新打包前需要先清空目录:\n\t ${outFileDir.absolutePath}")
            PluginFileUtils.deleteFolder(outFileDir)
        }
   
        // We must copy the contents of the input directory to the output directory before our transformation
        inputDir.get().asFile.copyRecursively(outputDir.get().asFile)

        println("AssetsTransformerTask outputDir: ${outputDir.asFile.get().absolutePath}")

        outputDir.asFileTree.forEach {
            println("AssetsTransformerTask output =${it.absolutePath}")
        }
    }
}

如果注册了 assets Transform,那么 assets 输出目录下会有多个目录:

  • mergeReleaseAssets:系统默认名称
  • 其他自定义名称:例如我插件的 releaseDnAssetsTransformerTask

在这里插入图片描述

// 其他待完善

相关文章:

  • 探秘Transformer系列之(19)----FlashAttention V2 及升级版本
  • STM32F103_LL库+寄存器学习笔记06 - 梳理串口与串行发送“Hello,World“
  • rbpf虚拟机-call指令
  • Pyside6介绍和开发第一个程序
  • 【bug解决】NameError: name ‘fused_act_ext‘ is not defined
  • 频谱分析仪的最大保持功能
  • 重大SBOM风险预警 | 总下载量超百万次开源NPM组件被投毒
  • 解决orzdba采集数据库性能指标不全的问题
  • 【图像处理基石】什么是joint demosaicking and denoising算法?
  • 未授权rce漏洞
  • 工作记录 2017-03-10
  • JAVASCRIPT 异步函数:底层原理,fetch,promise实例方法then, catich
  • 计算机二级(C语言)考试高频考点总汇(四)—— 内存管理、文件操作、预处理
  • 认识一家公司:瑞芯微(Rockchip Electronics Co., Ltd.)以及旗下的两款芯片RK3288\RK3588
  • 工程数字建造管理系统平台有哪些?好的数字建造管理系统推荐
  • c++,宏 - 在debug/release中都能用的断言
  • 3、fabric实现多机多卡训练
  • 性能测试核心流程和概念
  • NoSQL 数据库的适用场景与局限性分析
  • 常用的测试用例
  • 如何做不同域名跳转同一个网站/网站建设推广公司
  • php网站开发全程实例/排名点击软件怎样
  • 重庆公司网站seo/全网整合营销
  • 大学生做家教网站/东莞网站建设优化推广
  • web网站百度不收录吗/深圳抖音推广公司
  • 成都住房和城乡建设局网站/学校招生网络营销方案