Android studio Gradle 7.0+ 版本的.aar引入方式说明

新建的Androidi项目编译错误, 莫名其妙的错误, 踩坑了, 记录一下,各位大神指正.

1. buildg.radle中引入 aar错误

android {
    repositories {
        flatDir {
            //引入libs目录下的aar
            dirs 'libs'
        }
    }
}

A problem occurred evaluating project ':Jnilib'.
> Build was configured to prefer settings repositories over project repositories but repository 'flatDir' was added by build file 'Jnilib/build.gradle'

说明

Android studio Gradle 7.0 之前的版本的配置和7.0+版本的不同, 其中 aar库文件的引入区别变化比较大, settings.gradle根配置中没有之前的,repositories了, 加上直接编译错误.

解决方法

settings.gradle :

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()

        flatDir {
            //Gradle 7.0+ 版本的.aar引入方式:
            // DemoJni: 为工程根目录名称(府项目名称);
            // Jnilib: 子项目的目录名称
            dirs '../DemoJni/Jnilib'
        }
    }
}

rootProject.name = "DemoJni"
include ':app'
include ':Jnilib'

子模块中build.gradle配制方法

Jnilib: 子目录的guild.gradle中不能添加repositories

dependencies {

    implementation fileTree(dir: 'libs', include: ['*.jar'])

     ..........................

    //Gradle 7.0+ 版本的.aar引入方式
    api(name: 'libs/HulkAidlLib-debug', ext: 'aar')
}

文件举例:

plugins {
    id 'com.android.library'
}

android {
    namespace 'com.hulk.udp.demo.socks.proxy'
    compileSdk 33

    defaultConfig {
        minSdk 24
        targetSdk 33

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.22.1"
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    //Gradle 7.0+ 版本的.aar引入方式
    api(name: 'libs/HulkAidlLib-debug', ext: 'aar')
}

Sync 就正常了.

<think>好的,用户现在遇到了两个Gradle构建错误:一个是应用BasePlugin失败,另一个是找不到'maven'插件。之前已经给过他们一个关于BasePlugin错误的解决方案,但现在他们又补充了新的错误信息,涉及到'maven'插件未找到,同时引用了站内的两个相关引用。需要综合之前的回答和新的引用信息来整合解决方案。 首先,BasePlugin的问题通常和Gradle版本与插件版本不兼容有关,之前已经提到过要统一Gradle和AGP的版本。用户现在提到的另一个错误是Plugin 'maven' not found,这可能是因为他们在构建脚本中错误地引用了旧的'maven'插件,而应该使用'maven-publish'插件。另外,用户提供的引用[1]中提到了'com.github.dcendents.android-maven'插件未找到,这可能需要检查是否添加了正确的仓库和插件依赖。 需要确认用户是否在build.gradle中错误地使用了id 'maven',而实际上Gradle已经用'maven-publish'替代了旧的'maven'插件。同时,如果他们使用的是第三方插件如'com.github.dcendents.android-maven',可能需要添加对应的classpath或者在插件部分正确声明。 另外,用户提供的引用[2]中提到了UnknownPluginException,这可能是因为插件未正确添加到构建脚本的依赖中,或者仓库配置不正确,导致Gradle无法下载插件。需要检查buildscript中的repositories是否包含mavenCentral()或jcenter(),以及是否正确添加了插件的classpath。 结合用户之前的回答,可能需要再次检查Gradle版本和AGP版本的兼容性,确保所有插件的版本都是最新的且相互兼容。同时,处理'maven'插件的问题,指导用户将旧的'maven'插件替换为'maven-publish',或者添加必要的插件依赖。 此外,用户可能在多模块项目中配置了子模块,需要确保每个模块的插件应用正确,尤其是如果某些模块是库项目,可能需要应用'maven-publish'来发布。还要检查是否有拼写错误,比如'maven'插件是否正确,或者是否有第三方插件的ID写错了。 最后,清理构建缓存和重新同步项目也是解决问题的常见步骤,需要包含在解决方案中。可能还需要指导用户如何检查依赖树,确认是否存在冲突或无法解析的插件。</think>### 解决 Gradle 构建错误 `Failed to apply plugin class BasePlugin` 和 `Plugin 'maven' not found` 的综合指南 --- #### 一、问题根源分析 这两个错误通常由以下原因导致: 1. **插件未正确声明或版本冲突** - `BasePlugin` 是 Gradle 核心插件,其报错多与 Gradle 版本Android Gradle Plugin (AGP) 版本不兼容有关(如 Gradle 7.x 与旧版 AGP 不匹配)[^1]。 - `Plugin 'maven' not found` 表明项目引用了过时的 `maven` 插件,或未添加必要的插件仓库(如 `mavenCentral()`)。 2. **构建脚本配置错误** - 若使用第三方插件(如 `com.github.dcendents.android-maven`),需在 `buildscript` 中声明其仓库和依赖路径。 - 多模块项目中子模块未正确继承父模块配置。 --- #### 二、具体修复步骤 ##### 1. **统一 Gradle 与 AGP 版本 根据 [官方兼容性表](https://developer.android.com/studio/releases/gradle-plugin#compatibility) 调整版本: - **`gradle-wrapper.properties`** ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip # 推荐 7.5+ ``` - **项目级 `build.gradle`** ```gradle buildscript { repositories { google() mavenCentral() // 必须添加 } dependencies { classpath 'com.android.tools.build:gradle:7.4.1' // AGP 稳定版 classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' // 第三方 maven 插件[^2] } } ``` ##### 2. **修复 `maven` 插件问题** - **旧版 `maven` 插件替代方案** Gradle 6.0+ 已弃用 `maven` 插件,改用 `maven-publish`: ```gradle // 模块级 build.gradle plugins { id 'maven-publish' // 替代 id 'maven' } ``` - **第三方插件 `com.github.dcendents.android-maven` 的配置** ```gradle plugins { id 'com.android.library' // 仅限 Android 库模块 id 'com.github.dcendents.android-maven' version '2.1' // 显式声明版本[^2] } ``` ##### 3. **检查仓库与依赖声明** 确保所有模块的 `build.gradle` 包含仓库配置: ```gradle allprojects { repositories { google() mavenCentral() maven { url 'https://jitpack.io' } // 若使用 JitPack 仓库 } } ``` ##### 4. **清理并重建项目** ```bash # 清理残留文件 ./gradlew clean rm -rf ~/.gradle/caches/ # 清除全局缓存(谨慎操作) # 重新同步 ./gradlew --refresh-dependencies ``` --- #### 三、配置验证示例 **多模块项目结构示例** ``` project-root/ ├─ build.gradle ├─ settings.gradle ├─ app/ │ └─ build.gradle # 应用模块 └─ lib-base/ └─ build.gradle # 库模块 ``` **库模块 `lib-base/build.gradle`** ```gradle plugins { id 'com.android.library' id 'maven-publish' // 使用新版插件 id 'com.github.dcendents.android-maven' // 第三方插件 } android { namespace 'com.example.libbase' compileSdk 34 publishing { publications { release(MavenPublication) { from components.release // 发布 AAR } } } } ``` --- #### 四、常见问题解答 - **Q1:为何仍报 `Plugin 'maven' not found`?** A:检查是否混淆了 `maven` 与 `maven-publish` 插件。若需上传产物到 Maven 仓库,需组合使用 `maven-publish` 和 `signing` 插件[^2]。 - **Q2:`com.github.dcendents.android-maven` 插件无法解析?** A:确保项目级 `build.gradle` 的 `buildscript` 块已添加该插件依赖: ```gradle buildscript { dependencies { classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' } } ``` - **Q3:升级后出现 `Namespace not specified`?** A:AGP 7.0+ 强制要求 `namespace` 字段,在模块级 `build.gradle` 的 `android` 块中添加: ```gradle android { namespace 'com.example.module' } ``` --- #### 五、兼容性参考 | **插件/工具** | **推荐版本** | **依赖声明位置** | |-------------------------|----------------------|------------------------| | Android Gradle Plugin | 7.4.1 | 项目级 `build.gradle` | | `maven-publish` | Gradle 内置 | 模块级 `build.gradle` | | `android-maven-plugin` | 2.1 | 项目级 `buildscript` | --- ### 最终验证 执行以下命令确保构建成功: ```bash ./gradlew assembleDebug --stacktrace ``` 若需生成依赖树报告: ```bash ./gradlew :app:dependencies > dependencies.txt ``` --- ### 相关问题 1. 如何将 Android 库发布到 Maven 仓库? 2. Gradle 7.x 中 `maven-publish` 和 `maven` 插件有何区别? 3. 如何解决 `Could not find com.github.dcendents:android-maven-gradle-plugin:2.1` 错误?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值