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

原创
2017/03/23 11:28
阅读数 1.2W

| 问题

在最近一个项目中,由于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的环境变量和安装路径;

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部