是否可以隐藏位于 aar 中 'libs' 文件夹内的依赖项?

Is it possible to hide a dependency that is located inside 'libs' folder in aar?

为了让您了解我想要完成的工作,我将首先描述我的项目结构:

Application
|
| - Library Module
|   |
|   | - Core Library Module
|       | Module 1
|       |- Jar dependency 1
|       |
|       | Module 2
|       |- Jar dependency 2

模块 1 和模块 2 包含 2 个由 shadow gradle 插件创建的 jar 文件,用于重新定位 dagger 2 依赖项。这样做是因为应用程序使用了 Dagger 1,它们不能在常规基地同时使用。

核心库模块包含不同库的核心功能,这就是为什么它是一个单独的库,它还使用 dagger 2 进行依赖注入。

库模块包含我们为客户的应用程序提供的功能,它还使用 dagger 2 进行依赖注入。

现在真正的问题是应用程序,因为它使用 Dagger 1 进行依赖注入。因此,使用阴影 jar 可以在同一项目中使用匕首 1 和 2,因为阴影重命名并重新定位匕首 2 使用的所有 类,例如 @Inject 到 @Inject2。

在库中,一切都按预期工作,因为我使用了重新定位和重命名的类,比如@Module2、@Inject2 等

但在我使用 dagger 1 的应用程序中,标签是 @Inject、@Module,这在 dagger 1 中通常使用。因为在我的 build.gradle 中导入的依赖项是 Dagger1。但是当我构建应用程序时,我得到错误指示,我还必须添加修改后的 Dagger 2 标签,如 @Module2、@Inject2。而这正是我不想要的。

有没有什么方法可以使用 gradle 隐藏或忽略这些依赖关系,这样应用程序就看不到 dagger 2 的修改后的 jar,但它们仍然可以在库中使用?

到目前为止,我唯一的解决方案是从库中删除 Dagger 2 并自己实现依赖项注入,但这很耗时而且不是我想要的

编辑:

完整错误:

Error:(25, 8) error: com.sample.model.ApplicationModule is listed as a module, but is not annotated with @Module2

编辑 2:

  relocate 'javax.inject.Inject', 'javax.inject.Inject2'
  relocate 'javax.inject.Named', 'javax.inject.Named2'
  relocate 'javax.inject.Provider', 'javax.inject.Provider2'
  relocate 'javax.inject.Qualifier', 'javax.inject.Qualifier2'
  relocate 'javax.inject.Scope', 'javax.inject.Scope2'
  relocate 'javax.inject.Singleton', 'javax.inject.Singleton2'
  relocate 'dagger.Lazy', 'dagger.Lazy2'
  relocate 'dagger.MembersInjector', 'dagger.MembersInjector2'
  relocate 'dagger.Module', 'dagger.Module2'
  relocate 'dagger.Provides', 'dagger.Provides2'
  relocate 'dagger.Provides$Type', 'dagger.Provides$Type2'
  relocate 'dagger.internal', 'dagger.internal2'
  relocate 'dagger.producers', 'dagger.producers2'
  relocate 'dagger.Component', 'dagger.Component2'

ApplicationModule好像是匕首1模块。该错误似乎来自 dagger 2。因此显然 dagger 2 注释处理器对未重命名的 @Component 进行操作。您需要确保处理器仅在 dagger 2 组件上运行。