自定义插件踩坑之路

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在自定义了buildConfigmodule下的build.gradle增加配置如下,完美解决
buildFeatures {
        buildConfig = true
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容