1、插件定义必须添加包名,否则会报错
Build file 'E:\AndroidStudioProjects\ASMLifecycleDemo\app\build.gradle' line: 11
A problem occurred evaluating project ':app'.
> Could not find implementation class 'com.afang.plugin.LifeCyclePlugin' for plugin 'afang.asm.lifecycle' specified in jar:file:/C:/Users/my/.gradle/caches/jars-8/o_82d058dae19bf77676dda51858f50f00/asm_lifecycle_plugin-1.0.0.jar!/META-INF/gradle-plugins/afang.asm.lifecycle.properties.
插件module asm_lifecycle_plugin的build.gradle配置
plugins {
id 'java-library'
id 'groovy'
id 'maven'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//gradle相关的api依赖
implementation(gradleApi())
implementation(localGroovy())
//用于调用Android相关api 例如transform
implementation 'com.android.tools.build:gradle:4.1.3'
}
//插件group信息
group='com.afang.lifecycle.plugin'
//插件version 信息
version='1.0.0'
uploadArchives{
repositories {
mavenDeployer{
repository(url:uri('../asm_lifecycle_repo'))
}
}
}
//这里包名必须指定,否则会报错上边的错误
package com.afang.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
public class LifeCyclePlugin implements Plugin<Project>{
@Override
void apply(Project project) {
System.out.println("==LifecyclePlugin gradle plugin==")
}
}
2、认清plugins{}和apply plugin:的区别
当自定义的插件在使用plugins{}时报错内容如下:
Plugin [id: 'afang.asm.lifecycle'] was not found in any of the following sources:
plugins{}块这种方式引入的插件来自Gradle官方插件库;
如果使用buildscript {}块指定第三方库作为Gradle插件的话,指定插件就需要使用apply plugin了。
而plugins是新的用法,apply plugin是老用法,但是老用法感觉更灵活些
插件的使用module app的build.gradle配置
plugins {
id 'com.android.application'
id 'kotlin-android'
//这里报错 Plugin [id: 'afang.asm.lifecycle'] was not found in any of the following sources:
//id 'afang.asm.lifecycle'
}
//正确写法
apply plugin:'afang.asm.lifecycle'
项目project的build.gradle配置
buildscript {
ext.kotlin_version = "1.4.32"
repositories {
google()
jcenter()
//使用
maven { url '/asm_lifecycle_repo' }
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.3"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
//group+module+version
classpath 'com.afang.lifecycle.plugin:asm_lifecycle_plugin:1.0.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
项目目录结构
自定义插件的步骤
1、定义插件实现implements Plugin<Project>接口
//这里包名必须指定,否则会报错找不到插件
package com.xxx.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
public class XxxPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
System.out.println("==LifecyclePlugin gradle plugin==")
}
}
2、在 " src/main " 目录下 , 创建 " resources\META-INF\gradle-plugins " 目录 , 在该目录下创建 "xxx.aaa.bbb.properties " 配置文件(xxx.aaa.bbb未插件id) , 内容为 :
implementation-class=com.xxx.plugin.XxxPlugin
//
参考gradle插件定义
参考2
升级gradle7.0 Plugin with id 'maven' not found
对字节码不熟悉可以查看字节码编程ASM之idea插件asm bytecode outline的使用
3、xxx contains custom BuildConfig fields, but the feature is disabled
Build Type 'release' contains custom BuildConfig fields, but the feature is disabled.
To enable the feature, add the following to your module-level build.gradle:
`android.buildFeatures.buildConfig true`
导致报错的配置
buildTypes {
release {
isMinifyEnabled = false
//这里导致的报错
buildConfigField( "String", "url", "https://www.baidu.com")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
这个报错是自定义 buildConfig配置的 buildConfigField导致的问题 ,解决方法
- 在
Project下的gradle.properties中增加配置android.defaults.buildfeatures.buildconfig=true ,当前方法配置不推荐,因为在1.9.0这个全局配置过时 - 按照google给出的提示
module-level build.gradle: android.buildFeatures.buildConfig true在自定义了buildConfig的module下的build.gradle增加配置如下,完美解决
buildFeatures {
buildConfig = true
}