如何从结束的 AAR 访问 Activity 到另一个 AAR?

How can I acces Activity from AAR emded into another AAR?

如何从 AAR 库访问 Activity,它没有直接包含在项目中,而是嵌入到另一个 AAR 库中?

我收到一个错误java.lang.NoClassDefFoundError: Failed resolution of: class是public,如果我在项目应用中直接编译就可以正常使用。

我像这样将 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 库。它们也被设置为可传递的。当我尝试从子 AAR 库之一打开 activity 时。我收到 class 未找到错误。但是当我直接将那个特定的 AAR 包含到我的应用程序中时, class 被发现并可以使用。看起来我无法访问任何未直接包含在我的应用程序中的子 AAR 库。

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

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

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

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

如果我没看错,你想创建一个胖 AAR 并实现多个库的单一导入。

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

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

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

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

附带说明一下,您不应提供胖 AAR。最好将您的框架放在单独的模块中。这将加快您的构建过程并允许您节省 space 如果您不需要一些 类。即使在多模块项目中,您也可以创建单独的工件,每个模块一个,然后根据需要导入它们。只要避免循环引用(模块 A 需要模块 B,模块 B 需要模块 C,模块 C 需要模块 A),你会没事的。