最近有写sdk的需求
打包aar -> 新建项目 -> 引入aar -> 编译运行
结果奔溃了!!!
原因是:class not found. 其实就是打包aar的时候远程依赖没有被添加到aar中。
所以把aar需要的远程依赖,添加一份到app的gradle文件就好了。
当然这样做效果不好 (手动deog) 所以有了以下两个解决方案。
第一步 在labray的gradl中添加代码,以下四个参数根据自己的情况来写
apply plugin: 'maven' uploadArchives { repositories { mavenDeployer { //本地maven仓库地址,我是放在D盘的AAR文件中了 repository(url: "file://d://AAR") //生成本地aar的包名 pom.groupId = 'com.gago.draw' //名称 pom.artifactId = 'easy-draw' //版本号 pom.version = '1.0.0' } } }
第二步生成本地Maven库
使用gradle插件:upload/uploadArchives 生成aar以及其他文件
BUILD SUCCESSFUL in 15s 25 actionable tasks: 14 executed, 11 up-to-date 14:10:08: Task execution finished 'uploadArchives'.
编译了一会,成功之后可以看到,第一步配置的路径会生成一些文件。
我们打开easy-draw-1.0.0.pom,如图所示,我们可以发现里面包含了aar所需的全部依赖
那既然依赖配置生成到了别的文件,那只把aar放到libs里肯定是不行的啦!!!
第三步给需要使用aar的项目,配置本地Maven库
在根目录的gradle的repositories中添加以下代码
repositories{ //第一步中配置的maven仓库地址 maven{url "file://d://AAR"} }
随后在app的gradle中添加本地依赖
//格式 : pom.groupId : pom.artifactId : pom.version //示例 : com.gago.draw:easy-draw:1.0.0 //最终 implementation 'com.gago.draw:easy-draw:1.0.0'
一顿操作之后,项目完美运行,已经不需要再另外配置aar所需要的依赖了!!!
最后一定注意不要把aar放到libs里面使用,那样肯定加载不到!!!
一定要用上面的方法,使用本地Maven库来加载!!!
第一种方案虽然可以解决问题,但是还需要配置到本地,或者远程maven仓库,如果需要把aar提供给别人使用就会很麻烦。
还没有完,为了解决不方便的问题
就有了第二种更方便的方案!!
使用fat-aar-android插件直接将远程依赖打包到aar中!!!
第一步再根目录的gradle文件中添加
repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.1' //添加插件 classpath 'com.github.kezong:fat-aar:1.3.6' }
第二步再library中添加
apply plugin: 'com.kezong.fat-aar'
第三步使用 embed 关键字替换引入依赖的 implementation,api 例如
//正常情况,引入远程依赖 implementation 'io.reactivex.rxjava2:rxjava:2.2.0' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' //需要插入aar包的远程依赖 embed 'com.vividsolutions:jts:1.13' embed 'com.mapbox.mapboxsdk:mapbox-sdk-turf:5.5.0'
第四步生成aar
一顿编译过后,output文件夹下就生成我们需要的aar包了
重要的是这个aar是包含远程依赖的aar包,可是以直接引入libs使用的!!!
到这里已经讲完了两种方式,这个插件使用还是非常简单的!!!
但是我在使用中出现了一个bug下面记录一下!!1
异常:
Could not determine the dependencies of task ':DrawSDK:compileDebugAidl'. > Could not resolve all task dependencies for configuration ':DrawSDK:debugCompileClasspath'. > Could not resolve androidx.recyclerview:recyclerview:{strictly 1.0.0}. Required by: project :DrawSDK > Cannot find a version of 'androidx.recyclerview:recyclerview' that satisfies the version constraints: Dependency path 'android_location_sdk:DrawSDK:unspecified' --> 'androidx.recyclerview:recyclerview:1.0.0' Constraint path 'android_location_sdk:DrawSDK:unspecified' --> 'androidx.recyclerview:recyclerview:{strictly 1.0.0}' because of the following reason: debugRuntimeClasspath uses version 1.0.0 Dependency path 'android_location_sdk:DrawSDK:unspecified' --> 'androidx.recyclerview:recyclerview:1.0.0' Constraint path 'android_location_sdk:DrawSDK:unspecified' --> 'androidx.recyclerview:recyclerview:{strictly 1.0.0}' because of the following reason: debugRuntimeClasspath uses version 1.0.0 Dependency path 'android_location_sdk:DrawSDK:unspecified' --> 'androidx.recyclerview:recyclerview:1.0.0' Constraint path 'android_location_sdk:DrawSDK:unspecified' --> 'androidx.recyclerview:recyclerview:{strictly 1.0.0}'
解决方案:使用 configurations.all方法
android { configurations.all { resolutionStrategy.force 'androidx.appcompat:appcompat:1.0.0' resolutionStrategy.force 'androidx.recyclerview:recyclerview:1.0.0' resolutionStrategy.force 'androidx.constraintlayout:constraintlayout:1.1.3' resolutionStrategy.force 'com.mapbox.mapboxsdk:mapbox-sdk-turf:5.5.0' resolutionStrategy.force 'androidx.core:core:1.1.0' resolutionStrategy.force 'androidx.vectordrawable:vectordrawable:1.1.0' resolutionStrategy.force 'androidx.coordinatorlayout:coordinatorlayout:1.0.0' resolutionStrategy.force 'com.google.code.gson:gson:2.8.2' } }
异常出现的原因是我引用的远程依赖跟我本地的依赖出现了冲突,configurations.all,可以强制设置依赖的版本号,所以问题解决!