从精准化测试看ASM在Android中的强势插入-Gradle插件

Gradle Plugin是咱们在编译期修改代码的重要兵器,也是咱们精准化查验的中心组成部分。

官网镇楼:

docs.gradle.org/current/ujavaeese…

developer.android.com/studio/buil…

Ghttps域名radle Plugin有三种存在方法:

  • 在构建脚本中:kotlin为什么盛行不起来直接写在项目当时的build.gradle中
  • buildSrc:项目根目录下的bukotlin扩展函数ildSrc文件http 302夹,是一个体系保存目录,能够直接运转插件代码而不必引证插件包
  • 独立项目:类似module,单独编译成jar运用

创立

Gradle中自带了创立模板项目的方法——gradle inhttpclientit,经过这个指令,能够引导咱们创立一个完好的插件项目。

在相应的目录下实施该指令,如下所示。

HTTPS  qdpjava模拟器lugin /Users/xuyisheng/Downloads/gradle-6.5/bin/gradle init
Select thttp 302ype of project to generate:
1: basic
2: application
3: libraHTTPSry
4: Gradle plugin
Enter selection (defandroid什么意思ault: bjava模拟器asic) [1..4] 4
Select implementJavaation language:
1: Gjava模拟器roovy
2: Java
3: Kotlin
Enter selection (default: Java) [1..3] 1
Seleandroid竞赛专用包ct build script DSL:
1: Groovy
2: Kotlin
Enter selectihttps域名on (default: Groovy) [1..2] 1
Project name (default: qdplugandroid下载in):
Source package (default: qdplugin):
> Task :init
Get more help with your project: https://guides.gradlkotlin为什么盛行不起来e.orgjava难学吗?q=Plugin%2java初学0Development
BUILjava言语D SUCCESSFUL in 12s
2 actionable tasks: 2 executed

Gradle会主动帮咱们创立好https域名所需求的文件。

新版其他Gradle插件结构现已和之前的不太相同了,新版其https和http的差异他Gradle插件不再需求resources目录android竞赛专用包来声明插件的进口meta-info文件,而是直接https认证写在了build.gradle里边,类似这样。

gradlePlugin {
// Define thejava模拟器 plugin
plugins {
coverage {http署理
id = 'com.yw.coverage'
implementathttpclientionClass = 'com.yw.coverage.Coverage_pluhttps和http的差异ginPlugin'
}
}
}

为了避免在编译时遇到一些奇奇怪怪的问题,这儿主张咱们添加指定Jandroid平板电脑价格ava8编译的指kotlin怎样读令。

sourceCohttp 500mpatibility = 1.8java模拟器
targetCompatibility = 1.8

发布

Gradle Plugin的前两种运用方法,都不必发布插件,能够直接运用kotlin实战,但大部分情况下,一kotlin怎样读般先在项目根http 500目录下创立bjava初学uildSrc目录,再经过ghttpwatchradle init生成插件需求的文件,这样开发完后,再迁移到单独项目。

在buildSrc中,不必每次publish到App,能够直接参加编译,调试http 500比较Java便利,可是等插件安稳后,经过独立的插件项目,能够让插件的集成和办理更加便利。

一般来说,咱们会运用本地Maven库来调试插件,仰仗Gradle的maven-publish插件,咱们能够和便利的发布插件到本地Mavejava面试题n库。

首要,引进插件:

plugins {
id 'java-gradle-plugin'
id 'java'
id 'maJavaven-publish'
ihttps和http的差异d 'groovy'
id 'maven'
}

运用MavenLocal,编译后publiskotlin为什么盛行不起来h的插件位于:/Users/用户名/.m2/repository目录下。

继续创立发布脚本,代码如下:

publishinandroid竞赛专用包g {
publications {
coverage(MavenPublication) {
groupId =https协议 'httpclientcjava环境变量配备om.yw.coverage'
artifactId = 'coverage'
version = 'java言语0.0.1'
frjava环境变量配备om components.jajava怎样读va
}
}
}

其间:

  • coverage:是task name能够随意指定
  • groupId、artifahttps和http的差异ctId和version:这3个东西组成了引证的id,在根目录的build.gradle中运用。

独立的插件项目,需求实施publish task,在Ghttps域名radle标签卡中找到pandroid的drawable类ublishCoveragePublicatiokotlin怎样读nToMavenLocal这样一个Task,发布插件到MavenLocal,编译成功即可运用。

运用

在运用插件的项目根目录Gradle文件中,指定拜访makotlin为什么盛行不起来venLocakotlin下载l,java模拟器一起,运用groupId、artifactId和version组成java怎样读对插件的引证,如下所示。

buildscript {
ext.kotlin_version = "1.4.2kotlin下载1"
repositories {
google()
mavenCentral(kotlin言语)
mavehttpwatchnLocal()
}
dependencies {
classpath 'com.android.tools.build:ghttps和http的差异radle:4.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlikotlin实战n_version"
classpath "com.yw.coverage:coverage:0.0.1"
// NOTE: Do not place your aandroid下载安装pplication dependencies here; they belong
// in tkotlin为什么盛行不起来he ihttpwatchndividual module buhttp://www.baidu.comild.gradle files
}http 302
}

在主module中,引证插件,代码如下。

plugins {
id 'com.android.applicatikotlin中心编程on'
id 'kotlin-android'
id 'com.yw.coverage'
}

这儿的id,便是插件的plugin配备中Java定义的id。

gradlePlugin {
// Define the plugin
plugins {
coverage {
id = 'com.yw.coverage'
implementationClass = 'com.yw.coverage.Coverage_pluginPlugin'
}
}
}

sync项目后,在task中就能够找到新建的task,这个task是在代码中注册的(默许生成的代码)。

publHTTPic class Coverage_pluginPlugin implements PlugKotlinin<Project> {android平板电脑价格
public void apply(Project project) {
// Register a task
projeckotlin扩展函数t.tasks.register("coverage") {
doLast {kotlin言语
println("Hello from plugin 'com.yw.coverage'kotlin教程")
}
}
}httpclient
}

其实很简略就创立了一个能用的Gradle插件,插件的进口便是implementationClass中声明的类,implements Plugin并完结akotlin教程pply方法即可。

兼容

Graandroid下载安装dle尽管好用,可是API的变化非常频频,而且兼容性做的不是很好,所以咱们经常在javaee网上搜到的一些脚本,或许在你的环境下就无法实施,所以,经过官方文档查看最新的运用手册,才是最稳的方法。

Transform

Transform才是Gradle Plugin的中心。

Transform是Gradle Plugin供应的在编译过javaee程中对class做dex打包之前的一个处理流水线。官方有许多任务,也是基kotlin实战于Transform完结的,自定义Gradle Plugin,协作Transform做代码的修改,是对编译进程进行干与的一般方法。

一个最简略的Transform如下所示。

package com.yw.coverage
import com.android.build.api.transform.QualifiedContent
import com.android.build.api.transform.Transform
import com.android.build.api.transfandroid/yunosorm.TransformException
import com.android.build.api.transform.Transforhttp协议mInvocation
import com.ajava工作培训班ndrokotlin言语id.build.gradle.internal.pkotlin言语ipelinkotlin实战e.Transforhttp://www.baidu.commManager
import org.grkotlin为什么盛行不起来adle.aphttp://192.168.1.1登录i.ProjKotlinect
public class CoverageInjectTransform extends Transform {kotlin怎样读
private Project project
CoverageInjectTransform(Project project) {
this.prkotlin言语oject = project
}
// 声明Transform的Name,也kotlin中心编程便是Transform的TaskName,例如当返回值为CoverageInjectTransform时,
// Sync后能够看到名为transformClassesWith[Name]ForDebug的task
@Override
String getName() {
retuandroid下载安装rn "Coverage"
}
// 指定Transform处理的输入类型,一般针对Class类型
@Override
Set<QualifiedContandroid的drawable类ent.ContentType> getInputTypes() {
return TransformManager.COandroid平板电脑价格NTENT_CLASS
}
// 指定Transform输入文件所属的规划,一般指定为悉数工程
@Overrijava言语de
Set<? super QualifiedContent.Scope&kotlin面试题gt; getScopes() {
return TransformManager.SCOPE_FULLjava模拟器_PROJECT
}
// 是否支撑增量编译
@Override
boolean isIncremental() {
retjava言语urn true
}
// 详细的实施逻辑
@Override
void transform(Tranjava怎样读sformInvocationkotlin言语 transformInjava难学吗vocation) throws TransformException,httpwatch Interrupthttp://www.baidu.comedException, IOException {kotlin扩展函数
super.transform(transformInvocation)
println("------------------http 404-http://www.baidu.com-----")
}
}

可是要注意的是,上面的Transform实际上是无法实施的,由于前面咱们说android的drawable类了,Transform是一个处理流水线,每个Transform都是一个Gradle Takotlin教程sk,编译器中的java环境变量配备TaskManager将每个Transform串联起来,Transform会拿到上一个Transform编译后的class文件,以及jar和aar资源、和asset目录下的资源文件作为自己的输入,一起做好处理后,也需求将这些内容作为自http署理己的输kotlin言语出内容输出给下一个Transform,直到悉数的Transform实施完毕。

用户自定义的Transform,会比体系的Transfjavascriptorm先实施

Transform有两种,即http协议「消费型java怎样读Transform」和「引证型Transform」。

  • 消费型Transform:这种Trajava言语nsfkotlin教程orm需求将每个jar、aar和class中心产品复制到Transform dest目录。这个目录实际上便是下一个Transform的输入目录。在复制中心产品的进程中,便是咱们对产品进行修改的机遇。咱们能够对jar、aar、class文件的字节码做一些修改,再交给下一个Transform

  • 引证型Transform:其kotlin和java时Transform能够读取这些输入,可是不能修改,也不需求输出中心产品给下一个Trhttps和http的差异ansforjavascriptm

所以说,消费型Transform必须将输入的中心产品输出到下一个TranHTTPSsform,不然就无法继续编译了。

在Transform中有几个重要的概https域名念:

  • TransformInput:所谓Transform便是对输入的class文件转变成政策字节码文件,TransformInput便是这些输入文件的笼统。现在它包含两部分:Dirjava工作培训班ecjava言语toryInputjava初学集结与JarInput集结。

  • DirectoryInput:它代表着以源码方法参加项目编译android下载的全kotlin下载部目录结构及其目录下的源码文件,能够仰仗于它来修改输Java出文件的目录结构、政策字节码文件。

  • JarInput:它代表着以http署理jar包方法参加项目编译的悉数本地jarjava初学包或远程jar包,能够仰仗于kotlin言语它来完结动态添加jar包操作。

  • TransformOutputProvider:它代表的是Transform的输出,例如能够经过它来获取输出途径。

关于TransformInput来说,Gradle经过下面两个维度来操控输入的文件。

  • Scope:过滤的是输入文件的来历
  • ContentType:过滤的是输入文件类型

Scope的取值有下面这些:

EXhttps协议TERNAL_LIBRARIES:只需外部库
PROJECT:只需项目内容
PROJECT_LOCAL_DEPS:只需项目的本地依android的drawable类托(本地jar)
PROVIDED_ONLhttps认证Y:只供应本地或远程java模拟器依托项
SUB_PROJECTS:只需子项目
SUB_PROJECTS_kotlin扩展函数LOCAL_DEPS:只需子项目的本地android体系依托项(本地jar)
TESTED_CODE:由当时变量(包含依托项)android下载安装查验的代码

Cokotlin为什么盛行不起来ntentTypjava模拟器e的取值有下面这些:

CONTENT_CLASS:class类型
CONTENT_JARS:jar
CONTENT_RESOURCES:asset
CONjava难学吗TENT_NATIVE_LIBS:natijava工作培训班ve

任何消费型的Transform,都能够经过Gradle的APIandroid手机来获取输出目录,将中心产品Copy到输出目录:

// class
def outputDirFile = transformInvocation.outputProvider.getContentLocation(
directoryInput.namekotlin扩展函数, directoryInput.candroid是什么手机牌子ontentTypes, directoryInput.scopes,
Forhttps域名mat.DIRECTORY
)
FileUtils.copyDirectory(directoryInput.getFile(), outputDirFkotlin下载ile);
// jar
def outputFile = transformInvochttps安全问题ation.outputProjava面试题vider.getContentLocation(
jarInpuhttps和http的差异t.name, jarInput.contentTypandroid平板电脑价格es, jarInput.scopes,
Format.JAR
)
FileUtils.copyFile(jarInput.getkotlin言语File(), outputFile);HTTP

悉数自定义的Transform中心产品,都会在build/intermediates/transforms下找到(Kotlin文件在build/tmp/kojava怎样读tlin-classes目录下),你能够查看这些中心产品是java难学吗否契合了自己的预期。

注册

Transform需求在Plugin中进行注册才华收效,注册的方法有两种,如下所示。

/http协议/注册Android方法1
AppExtension appExtension = project.extensions.getByTypeHTTP(AppExteandroid竞赛专用包nsion)        appExtension.registerTransform(android平板电脑价格nkotlin下载ew MethodTimeTransform())
//注册方法2
//project.android.registerTrankotlin教程sform(new MethodTimeTransform())

Kotlin化

Gradle插android什么意思件阅历了kotlin言语Java、Grovvy的版别变http://www.baidu.com迁,迎来了全面Kotlin化的新浪潮,新版其他官方Gradle插件,都现已悉数运用Kotlin来编写,java怎样读仰仗Kotlin,咱们能够很便利的共同代码编写环境,仰仗不输于Grovvy的语法糖,能够很便利的来写Gradle Plugin。

在Gradle中运用Gradle需求对原有脚本做一些改造,首要,要将build.gradle脚本改为buld.gradle.kts,然后将Kotlin代码放到src/man/kotlin目录下,最终,脚本中的代码也要做相应android下载的更新,kts脚本如下所示。

plugins {
`java-gradle-plugin`
id("org.jetbrains.kotlin.jvm") version "1android什么意思.3.72"
}
repositorhttps安全问题ies {
mavenCentral()
google()
jcenter()
}
dependkotlin面试题encies {
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
implementation("com.android.tools.build:gradle:4.1.1")
implementation("orandroid下载g.ow2.asmkotlin为什么盛行不起来:asm:9.1")
}
grjava初学adlePlugiandroid/yunosn {
val greeting by plugins.creating {
id = "asmtest"
implementationClass = "com.yw.asm.MyPluhttp://192.168.1.1登录gin"
}
}
java.sourceCompatibility = JavaVersion.VERSION_1_8
java.targetCompatibility = JavaVersion.VERSION_1java模拟器_8

更简略一点,经过gradle init生成Kotlhttp 302in版其他插件默许代码,Cophttps协议y过去即可。

Gradle插件是咱们后续做字节码修改的基础,一定要熟练掌握插件的开Kotlin发和调试,这样才华避免后续在开发字节码插件的时候遇到各种插件问题而不能专心于字节码开发。

向咱们举荐下我的网站 xuyishengkotlin面试题.top/ 专心 Android-Kotandroid下载lin-AndroidFlutter 欢迎咱们拜访

从精准化测试看ASM在Android中的强势插入-Gradle插件

发表评论

提供最优质的资源集合

立即查看 了解详情