Android中Module编译aar出现的引用第三方依赖库问题

在Android项目中,将Module转换为aar引用时遇到ClassNotFindException等问题。原因是aar不包含module中的第三方依赖。通过将aar发布到本地或远程maven仓库,然后在app module中添加依赖,可以解决此问题。详细步骤包括添加gradle task,执行uploadArchives,更新app module的依赖,并配置maven仓库地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

| 问题

在最近一个项目中,由于module过多,考虑使用aar引用的方式来替换module库; 然而,按照正常aar引入的方式,竟然出现各种错误: ClassNotFindException等等

| 背景

开发环境:Android Studio + Gradle

目前,as中进行开发安卓项目,依赖第三方库有好几种方法: 1.引入jar包 2.引入aar包 3.使用maven依赖,compile(name:XXX,version:XXX)的形式

我们主要来说一说第二种方式。

module声明为library时,编译生成aar文件,包含内容如下: class文件, res文件, assets文件等

通过引入aar的方式,很方便我们调用库项目中的接口以及资源文件等,然而,按照这个思路,引入项目中的aar文件,竟然出现了各式各样的错误,这就尴尬了。 仔细分析,发现aar中并不包含module中包含的依赖,这就导致如果module中使用了第三方依赖库,那么就有可能出现初始化,或调用时的各种异常; 似乎,最简单的方法就是重新在app (module) 中重新添加依赖,这不是我想要的。

经过不懈努力,找到了最终的解决办法:

| 解决

发布到maven仓库,???,这个真不能算个问题的。 其实并不难理解,发布到maven仓库,大家都可以看到,一些开源的库都放在上面的。 1.发布到jcenter或maven; 2.发布到自己搭建的maven或公司内部maven服务器上; 3.发布到本地maven库;

三种发布的方法,显然第三种方法最简单,此处我们暂不考虑多人协作的问题(聪明的你一定能够搞定的对吧?),然后就正常添加依赖就可以了。步骤如下: a.在gradle中添加task,用于生成库

// 1.maven-插件
apply plugin: 'maven'
// 2.maven-信息
ext {// ext is a gradle closure allowing the declaration of global properties
    PUBLISH_GROUP_ID = 'com.elitech.core'
    PUBLISH_ARTIFACT_ID = 'icore'
    PUBLISH_VERSION = 1.0
}
// 3.maven-路径
uploadArchives {
    repositories.mavenDeployer {
        String env = getAndroidSdkDir()
        if (env == null) {
            println("don't have env: android_home ,please set...")
            if (env == null) {
                throw new RuntimeException(
                        "Unable to determine Android SDK directory.")
            }
        }

        def deployPath = file(env+"/extras/android/m2repository/")
        String repository_url = "file://${deployPath.absolutePath}"
        println(repository_url)

        repository(url: repository_url)

        pom.project {
            groupId project.PUBLISH_GROUP_ID
            artifactId project.PUBLISH_ARTIFACT_ID
            version project.PUBLISH_VERSION
        }
    }
}

// get android sdk dir
String getAndroidSdkDir() {
    def rootDir = project.rootDir
    def androidSdkDir = null
    String envVar = System.getenv("ANDROID_HOME")
    def localProperties = new File(rootDir, 'local.properties')
    String systemProperty = System.getProperty("android.home")
    if (envVar != null) {
        androidSdkDir = envVar
    } else if (localProperties.exists()) {
        Properties properties = new Properties()
        localProperties.withInputStream { instr ->
            properties.load(instr)
        }
        def sdkDirProp = properties.getProperty('sdk.dir')
        if (sdkDirProp != null) {
            androidSdkDir = sdkDirProp
        } else {
            sdkDirProp = properties.getProperty('android.dir')
            if (sdkDirProp != null) {
                androidSdkDir = (new File(rootDir, sdkDirProp)).getAbsolutePath()
            }
        }
    }
    if (androidSdkDir == null && systemProperty != null) {
        androidSdkDir = systemProperty
    }
    if (androidSdkDir == null) {
        throw new RuntimeException(
                "Unable to determine Android SDK directory.")
    }
    androidSdkDir
}

b.执行task:uploadArchives c.app 添加依赖:

// from maven local
compile 'com.elitech.core:icore:1.0'

d.最后,不要忘记了添加maven仓库地址,我们用的是本地仓库,直接写路径就行

repositories {

     //maven{url uri('/Users/******/Library/Android/sdk/extras/android/m2repository')}
    maven { url uploadPath }
}

上面的 uploadPath,可参考 第2步中获得sdk路径的方法;

发布到本地仓库,一定要确认好android sdk的环境变量和安装路径;

坚持原创技术分享,您的支持将鼓励我继续创作!

转载于:https://my.oschina.net/Gxhpro/blog/865291

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值