| 问题
在最近一个项目中,由于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的环境变量和安装路径;
坚持原创技术分享,您的支持将鼓励我继续创作!