我有一个自定义视图库,它可以自己编译和运行(通过在库项目中为测试目的而创建的另一个活动)。但是,当我构建库,然后将aar导入另一个项目(打开模块设置 - >新模块 - >现有的aar ..)我得到一个运行时ClassNotFoundException - 异常是唯一的gradle依赖项,图书馆正在使用。为什么会这样?
库gradle文件:
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.googlecode.libphonenumber:libphonenumber:7.2.1'
}
我得到的错误:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.i18n.phonenumbers.PhoneNumberUtil" on path: DexPathList[[zip file..
答案 0 :(得分:0)
aar依赖不像maven / ivy依赖,因为在pom或xml文件中没有与它捆绑的传递依赖。当您添加aar依赖项时,gradle无法知道要获取的传递依赖项。
Android世界中的常见做法似乎是,使用aar明确地向您的应用添加传递依赖。这可能会变得很麻烦,并且会破坏依赖管理系统的重点。
有几种解决方法:
有3rd party gradle plugin允许您将aar文件与有效的pom文件一起发布到本地maven存储库。
您使用标准maven-publish plugin将aar发布到maven repo,但您必须自己组装pom依赖项。例如:
double deltaX = myPos.X - cursorPoint.X;
double deltaY = myPos.Y - cursorPoint.Y;
double distance = Math.Sqrt( Math.Pow( deltaX, 2 ) + Math.Pow( deltaY, 2));
// Continue with your calculations with distance and myRadius
在这两种情况下,只要aar + pom在maven repo中可用,您就可以在您的应用中使用它,如下所示:
publications {
maven(MavenPublication) {
groupId 'com.example' //You can either define these here or get them from project conf elsewhere
artifactId 'example'
version '0.0.1-SNAPSHOT'
artifact "$buildDir/outputs/aar/app-release.aar" //aar artifact you want to publish
//generate pom nodes for dependencies
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
configurations.compile.allDependencies.each { dependency ->
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dependency.group)
dependencyNode.appendNode('artifactId', dependency.name)
dependencyNode.appendNode('version', dependency.version)
}
}
}
}
(如果您将依赖项添加为compile ('com.example:example:0.0.1-SNAPSHOT@aar'){transitive=true}
,我不完全确定传递是如何工作的。我将很快更新此案例的答案)