Android Build 因工件而失败 - 缺少依赖项
Posted
技术标签:
【中文标题】Android Build 因工件而失败 - 缺少依赖项【英文标题】:Android Build failed with artifactory - missing dependencies 【发布时间】:2018-10-12 21:54:14 【问题描述】:我的 android 项目有 git & artifactory 中的子模块。子模块的 gradle 依赖项包含这些。
kapt 'com.google.dagger:dagger-compiler:2.15'
implementation 'com.google.maps.android:android-maps-utils:0.5'
implementation 'com.airbnb.android:lottie:2.5.3'
本地版本构建风格(当从 git 中提取子模块时)构建良好。但是远程发布构建(子模块从工件中提取)失败。
远程释放的味道是:
release
debuggable false
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
multiDexKeepProguard file('multidex.pro')
错误是某些库文件不能被引用。
找不到超类或接口匕首.internal.Factory 警告: _ProvideFakeTrackerFactory:找不到超类或 接口 dagger.internal.Factory 警告: _ProvidePropMapPresenterFactory:找不到超类 或接口 dagger.internal.Factory 警告::不能 查找引用的类 dagger.P提供警告::不能 查找引用的类 dagger.Module 警告: .FirebaseTracker:找不到引用的类 com.google.firebase.analytics.FirebaseAnalytics 警告: .FirebaseTracker$subscribeToScreenEvents$1:找不到 引用类 com.google.firebase.analytics.FirebaseAnalytics 警告:.: 找不到引用的类 com.airbnb.lottie.LottieAnimationView 警告: .DetailFragment_MembersInjector:找不到引用 dagger.MembersInjector 类警告: .map.DaggerPropMapComponent$Builder:找不到 引用类 dagger.internal.Preconditions 警告: .MapFragment:找不到引用的类 com.google.android.gms.location.LocationServices 警告: .MapFragment:找不到引用的类 com.google.android.gms.location.FusedLocationProviderApi
由于这些库文件已经在子模块的 gradle 依赖项中,如何在不重新在应用程序的 gradle 中重新声明这些库的情况下成功构建?
谢谢。
【问题讨论】:
【参考方案1】:你在谈论传递依赖。这是许多工程师编译时的常见错误。
请记住,在子子模块中声明的任何存储库指针也必须在父应用程序中声明。存储库 URL 不包含在父模块中。因此,如果您有一个从子模块访问的自定义 maven 存储库,则需要在父应用程序中复制该 URL。
此外,如果子模块具有依赖项,则这些依赖项称为传递依赖项,或“我的依赖项的依赖项”。这些不会包含在编译的最终 APK 或 AAR 文件中。默认情况下它们被排除在外。这是正常的默认行为。
您当然可以创建一个 FAT-JAR 或 FAT-AAR 文件来包含传递依赖项,但这通常是不好的做法,我不推荐这样做。
如果您正在生成正确的 Maven 文件,您只需在以下行中添加:
myDependencyNamespaceinGradle 传递=真
这个标志告诉它包含这个依赖的依赖。 重要的* 只有在子节点和主机 maven 存储库中有适当的 maven 结构化文件以了解要包含哪些子节点依赖项时,这才有效。
现在如果你在本地工作时需要它编译,但你知道它会由父级提供,你可以指定它为
提供了我的依赖 代替 编译mydependency。
这告诉它在调试时编译,但不要与它一起打包,因为依赖项将作为父提供的依赖项的一部分出现在最终输出中。
另一个重要因素是确保您的 proguard 文件设置正确,不会删除注释和基于反射的代码。 Dagger 需要在这些文件中放置保险,以免在缩小时被删除。请通过在发布时禁用缩小和 proguard 来确认这一点。如果它工作正常,那么你的问题与 proguard 文件有关,如果它仍然有问题,那么很可能是你的传递依赖管理。
希望对您有所帮助,如果您需要进一步说明,请告诉我。
【讨论】:
感谢您的回复。编译时禁用 proguard 和缩小发布版本。但我想让它们具有发布风格。 完美,那么你就知道你的问题是什么了。是缩小。现在您只需要弄清楚您缺少哪个库的 proguard 规则。转到每个库,并检查它们是否提供了 proguard 规则 sn-p。一旦一切都正确设置,你不应该有任何问题。此外,如果您使用 proguard,请不要忘记将您的混淆映射提供给您的崩溃报告工具,以帮助您在未来进行故障排除。 看起来你的错误是 Dagger 特有的。请参阅此链接以获取您的 proguard 文件。 github.com/krschultz/android-proguard-snippets/blob/master/…【参考方案2】:试试这个gradle
artifactory
plugin
,
我希望它可以帮助你。
refer the link
Gradle Artifactory 插件允许您将构建工件和构建信息部署到 Artifactory,还可以解决来自 Artifactory 的构建依赖项。
构建脚本 sn-p 以用于所有 Gradle 版本
buildscript
repositories
jcenter()
dependencies
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:latest.release"
apply plugin: "com.jfrog.artifactory"
构建脚本 sn-p 用于 Gradle 2.1 及更高版本
plugins
id "com.jfrog.artifactory" version "latest.release"
如需更多帮助,您可以参考链接。
【讨论】:
以上是关于Android Build 因工件而失败 - 缺少依赖项的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio Code 中因缺少导入而突出显示错误?
Spring Boot 2.5.7 with JDK17 with Oracle:Maven 测试因缺少“java.sql.Date”而失败