自定義插件踩坑之路

1、插件定義必須添加包名,否則會(huì)報(bào)錯(cuò)

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相關(guān)的api依賴
    implementation(gradleApi())
    implementation(localGroovy())
    //用于調(diào)用Android相關(guān)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'))
        }
    }
}
//這里包名必須指定,否則會(huì)報(bào)錯(cuò)上邊的錯(cuò)誤
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、認(rèn)清plugins{}apply plugin:的區(qū)別
當(dāng)自定義的插件在使用plugins{}時(shí)報(bào)錯(cuò)內(nèi)容如下:

Plugin [id: 'afang.asm.lifecycle'] was not found in any of the following sources:

plugins{}塊這種方式引入的插件來自Gradle官方插件庫(kù);
如果使用buildscript {}塊指定第三方庫(kù)作為Gradle插件的話,指定插件就需要使用apply plugin了。
plugins是新的用法,apply plugin是老用法,但是老用法感覺更靈活些
插件的使用module app的build.gradle配置

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    //這里報(bào)錯(cuò) Plugin [id: 'afang.asm.lifecycle'] was not found in any of the following sources:
    //id 'afang.asm.lifecycle'
}
//正確寫法
apply plugin:'afang.asm.lifecycle'

項(xiàng)目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
}

項(xiàng)目目錄結(jié)構(gòu)

自定義插件的步驟
1、定義插件實(shí)現(xiàn)implements Plugin<Project>接口

//這里包名必須指定,否則會(huì)報(bào)錯(cuò)找不到插件
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 " 目錄下 , 創(chuàng)建 " resources\META-INF\gradle-plugins " 目錄 , 在該目錄下創(chuàng)建 "xxx.aaa.bbb.properties " 配置文件(xxx.aaa.bbb未插件id) , 內(nèi)容為 :

implementation-class=com.xxx.plugin.XxxPlugin
//

參考gradle插件定義
參考2
升級(jí)gradle7.0 Plugin with id 'maven' not found

對(duì)字節(jié)碼不熟悉可以查看字節(jié)碼編程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`

導(dǎo)致報(bào)錯(cuò)的配置

  buildTypes {
        release {
            isMinifyEnabled = false
            //這里導(dǎo)致的報(bào)錯(cuò)
            buildConfigField( "String", "url", "https://www.baidu.com")
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

這個(gè)報(bào)錯(cuò)是自定義 buildConfig配置的 buildConfigField導(dǎo)致的問題 ,解決方法

  • Project下的gradle.properties中增加配置android.defaults.buildfeatures.buildconfig=true ,當(dāng)前方法配置不推薦,因?yàn)樵?.9.0這個(gè)全局配置過時(shí)
  • 按照google給出的提示module-level build.gradle: android.buildFeatures.buildConfig true在自定義了buildConfigmodule下的build.gradle增加配置如下,完美解決
buildFeatures {
        buildConfig = true
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容