Android Build失败,带有artifactory - 缺少依赖项

时间:2018-05-02 17:39:43

标签: android build proguard artifactory android-proguard

我的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:无法找到超类或   interface dagger.internal.Factory警告:   _ProvidePropMapPresenterFactory:无法找到超类   或界面dagger.internal.Factory警告:: 不能   找到引用的类dagger.P rovides警告:不能&#t; t   找到引用的类dagger .Module警告:   .FirebaseTracker:无法找到引用的类   com.google.firebase.analytics.FirebaseAnalytics警告:   .FirebaseTracker $ subscribeToScreenEvents $ 1:无法找到   引用的类com.google.firebase.analytics.FirebaseAnalytics   警告:。:无法找到引用的类   com.airbnb.lottie.LottieAnimationView 警告:   .DetailFragment_MembersInjector:无法找到引用   class dagger.MembersInjector警告:   .map.DaggerPropMapComponent $ Builder:无法找到   引用类dagger.internal.Preconditions警告:   .MapFragment:无法找到引用的类   com.google.android.gms.location.LocationServices警告:   .MapFragment:无法找到引用的类   com.google.android.gms.location.FusedLocationProviderApi

由于这些库文件已经存在于子模块的gradle依赖项中,如何在不在应用程序的gradle中重新声明这些库的情况下成功构建?

感谢。

2 个答案:

答案 0 :(得分:2)

您正在谈论传递依赖关系。对于许多工程师来说,这是一个常见的错误。

请记住,子子模块中声明的任何存储库指针也必须在父应用程序中声明。存储库URL不包含在父模块中。因此,如果您有一个从子模块访问的自定义maven存储库,则需要在父应用程序中复制该URL。

此外,如果子模块具有依赖关系,则这些属性称为传递依赖关系,或者"我的依赖关系的依赖关系"。这些不包含在已编译的最终APK或AAR文件中。它们默认排除在外。这是正常的默认行为。

您当然可以创建FAT-JAR或FAT-AAR文件以包含传递依赖项,但这通常是不好的做法,我不推荐它。

如果要生成正确的Maven文件,只需添加以下行:

myDependencyNamespaceinGradle {     transitive = true }

此标志告诉它包含此依赖项的依赖项。 重要* 这仅适用于您在子级和主机maven repo中具有正确的maven结构化文件以了解要包含哪些子级依赖项。

现在,如果您在本地工作时需要编译,但是您知道它将由父级提供,您可以将其指定为

提供了我的依赖性 代替 编译我的依赖。

这告诉它在调试时编译,但不要用它打包它,因为依赖项将作为父提供的依赖项的一部分在最终输出中。

另一个重要因素是确保正确设置proguard文件,以便不删除注释和基于反射的代码。 Dagger需要在这些文件中保险,以便在缩小时间内删除。请通过在发布时禁用缩小和proguard来确认这一点。如果它工作正常,那么你的问题与proguard文件有关,如果它仍有问题,那么很可能是你的传递依赖管理。

希望有所帮助,如果您需要更加清晰,请告诉我。

答案 1 :(得分:0)

尝试使用此gradle artifactory plugin, 我希望它可以帮助你。 refer the link

Gradle Artifactory插件允许您部署构建工件并为Artifactory构建信息,还可以从Artifactory解析构建依赖项。

构建脚本代码段以在所有Gradle版本中使用

    buildscript {
      repositories {
        jcenter()
      }
      dependencies {
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:latest.release"
      }
    }
    apply plugin: "com.jfrog.artifactory"

构建脚本代码段,以便在Gradle 2.1及更高版本中使用

    plugins {
      id "com.jfrog.artifactory" version "latest.release"
    }

如需进一步的帮助,请参阅链接。