IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Gralde插件平台开发系列四:自定义Gradle Transform -> 正文阅读

[移动开发]Android Gralde插件平台开发系列四:自定义Gradle Transform

Android Gradle插件平台开发系列:前言

Android Gradle插件平台开发系列一:Android APT

Android Gradle插件平台开发系列二:Android SPI

Android Gradle插件平台开发系列三:自定义gradle plugin

Android Gralde插件平台开发系列四:自定义Gradle Transform

Android Gralde插件平台开发系列五:字节码修改

一、Transform是什么

Gradle Transform是Android官方提供给开发者在项目构建阶段即由class到dex转换期间修改class文件的一套api。

二、Transform原理

每个Transform其实都是一个gradle task,Android编译器中的TaskManager将每个Transform串连起来,第一个Transform接收来自javac编译的结果,以及已经拉取到在本地的第三方依赖(jar、aar),还有resource资源,注意,这里的resource并非android项目中的res资源,而是asset目录下的资源。 这些编译的中间产物,在Transform组成的链条上流动,每个Transform节点可以对class进行处理再传递给下一个Transform。

在这里插入图片描述

三、Transform处理流程

在这里插入图片描述

四、Transform开发流程

4.1 继承Transform类,完成相关抽象方法处理

class TestTransform : Transform() {
    /**
     * 1.Transform名称
     */
    override fun getName(): String {
        return "MyTransform"
    }

    /**
     * 2.Transform要处理的数据类型,即输入文件类型
     *
     * CONTENT_CLASS:表示需要处理 java 的 class 文件。
     * CONTENT_JARS:表示需要处理 java 的 class 与 资源文件。
     * CONTENT_RESOURCES:表示需要处理 java 的资源文件。
     * CONTENT_NATIVE_LIBS:表示需要处理 native 库的代码。
     * CONTENT_DEX:表示需要处理 DEX 文件。
     * CONTENT_DEX_WITH_RESOURCES:表示需要处理 DEX 与 java 的资源文件。
     */
    override fun getInputTypes(): MutableSet<QualifiedContent.ContentType> {
        return TransformManager.CONTENT_CLASS
    }

    /**
     * 3.Transform作用域
     *
     * PROJECT_ONLY:当前工程
     * SCOPE_FULL_PROJECT:所有工程
     */
    override fun getScopes(): MutableSet<in QualifiedContent.Scope> {
        return TransformManager.SCOPE_FULL_PROJECT
    }

    /**
     * 4.是否支持增量编译
     */
    override fun isIncremental(): Boolean {
        return false
    }
}

4.2 重写transform方法,完成jarInputs和directoryInputs拷贝

    /**
     * 5.在这里进行字节码操作
     */
    override fun transform(transformInvocation: TransformInvocation?) {
        super.transform(transformInvocation)
        transformInvocation?.inputs?.forEach {
            // 1.处理jar
            it.jarInputs.forEach {
                // 标准写法,处理完成copy给下一个transform
                val destFile = transformInvocation.outputProvider.getContentLocation(
                    it.name,
                    it.contentTypes,
                    it.scopes,
                    Format.JAR
                )
                FileUtils.copyFile(it.file, destFile)
            }

            // 2.处理directory
            it.directoryInputs.forEach {
                // 标准写法,处理完成copy给下一个transform
                val destDir = transformInvocation.outputProvider.getContentLocation(
                    it.name,
                    it.contentTypes,
                    it.scopes,
                    Format.DIRECTORY
                )
                FileUtils.copyDirectory(it.file, destDir)
            }
        }
    }

4.3 完成字节码处理操作

遍历jarInputs和directoryInputs,找到需要hook的class文件,完成字节码处理操作,字节码处理操作将在下节讲到。

4.3.1遍历jar

    JarFile(it.file).entries().toList().forEach {
        println(it.name)
    }

4.3.2 遍历文件

    FileUtils.getAllFiles(file).filter {
        if (it == null) false else it.name.contains("MainActivity")
    }.forEach {
        // 在这里进行字节码处理
        insertCode(it)
    }

4.4 注册Transform

在上期开发的plugin类里完成Transform注册。

/**
 * 自定义插件
 */
class TestPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        println("==========TestPlugin==========")
        val android = project.extensions.findByType(AppExtension::class.java)
        android?.registerTransform(TestTransform())
    }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:27:25  更:2022-09-13 11:28:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:22:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码