如何从AAR访问活动到另一个AAR?

时间:2018-01-23 06:54:40

标签: android aar

如何从AAR库中访问Activity,该库未直接包含在项目中但是嵌入到另一个AAR库中?

我收到错误java.lang.NoClassDefFoundError: Failed resolution of: 该类是公共的,如果我直接在项目应用程序中编译它,它可以毫无问题地使用。

我在这个项目中加入了一个AAR:

ProjectApplication
  |
  +--sharedModule (android library - AAR or any working solution)
  |      |
  |      +--Module1 (android library - AAR or any working solution)
  |      |
  |      +--Module2 (android library - AAR or any working solution)
  |      |
  |      +--Module3 (android library - AAR or any working solution)


 compile (project(":sharedFrameWork")){ transitive = true }

其中还包含2个其他AAR库。他们也被设置为Transitive。当我尝试从其中一个子AAR库打开一个活动时。我找不到类错误。但是当我直接将特定的AAR包含到我的应用程序中时,就会找到该类并且可以使用它。看起来我无法访问任何未直接包含在我的应用程序中的子AAR库。

为了更好地描述我的情况:

我必须创建一个集成AAR库(后来称为'sharedFrameWork'),它包含多个AAR库,然后嵌入到应用程序中。

多个AAR - >共享AAR'sharedFrameWork' - >应用

sharedFrameWork有一些方法可以从包含的AAR启动某些活动,或者与服务器建立基本通信。我已经读过,如果将所有依赖项都设置为可传递,它将使它工作,但不幸的是它没有。 因此,当我从我的应用程序调用一个方法时,该方法应该从sharedFrameWork中包含的AAR之一启动一个活动,该应用程序报告我没有找到这样的类。 但是,当我将AAR模块直接包含在我的应用程序中而不是sharedFrameWork,然后调用完全相同的功能时,找到Class并且项目按照设计工作。你能帮助我如何创建这个sharedFrameWork以便按照它的设计工作?可以通过使用AAR来完成,还是应该采取其他方法?如果有任何其他方式可以完成,结果将是我只能提供一个库,它将按设计工作,以便它可以访问我将使用它的子模块,随时指出我这个问题的最佳方法

1 个答案:

答案 0 :(得分:1)

如果我做对了,你想创建一个胖AAR并实现几个库的单个导入。

现在,由于您还没有提供更多信息,我将假设您正在使用gradle 2.在Gradle 2中,子模块不会共享其依赖项。你没有把任何东西放到libs文件夹中。所以,首先,我会将你的项目升级到gradle 3,切换到"编译"命令" api"命令,并检查。 如果这不起作用,下一步是将gradle maven插件应用于每个模块,并将生成的AAR文件部署到本地maven仓库(安装maven时自动创建)或远程仓库,喜欢jitpack。如果您将AAR / JAR放入libs文件夹,也将它们部署到repo并从那里导入它们(libs文件夹范围在gradle 2中是本地的,一般来说,使用它而不是集中式repo是个坏主意。甚至可以使用github作为回购)。然后,使用工件。 最后,问题的最后一个解决方案是使用"着色&#34 ;;将几个不同的工件打包成一个的过程。如果您无法升级到gradle 3,或在某处(不太可能)部署工件,那么您应该这样做。有几个插件:

https://plugins.gradle.org/search?term=shade

https://github.com/zawn/android-shade-plugin

如果那些不适合你,请切换到maven并使用maven shade插件。

作为旁注,你不应该提供肥胖的AAR。最好将框架保存在单独的模块中。这将加快您的构建过程,并允许您节省空间,如果您不需要一些课程。即使在多模块项目中,您也可以创建单独的工件,每个模块一个,并根据需要导入它们。只需避免循环引用(模块A需要模块B,需要模块C,需要模块A),你就可以了。