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

标签 android aar

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

我得到一个错误 java.lang.NoClassDefFoundError: Failed resolution of: 该类是公共(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 时。我得到了找不到类的错误。但是当我直接将那个特定的 AAR 包含到我的应用程序中时,该类就会被发现并可以使用。看起来我无法访问任何未直接包含在我的应用程序中的子 AAR 库。

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

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

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

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

最佳答案

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

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

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

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

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

作为旁注,您不应该提供胖 AAR。最好将您的框架放在单独的模块中。这将加快您的构建过程,并在您不需要某些类时节省空间。即使在多模块项目中,您也可以创建单独的 Artifact ,每个模块一个,然后根据需要导入它们。只需避免循环引用(模块 A 需要模块 B,模块 B 需要模块 C,模块 C 需要模块 A),你会没事的。

关于android - 如何从结束的 AAR 访问 Activity 到另一个 AAR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48395802/

相关文章:

android - Ionic/Cordova 和 Android 64 位要求

android - 无法在 Android Studio 中引用来自 aar 的类

android - 如何使用 Android Build Tools 构建 Android Archive Library(AAR)?

android - 存储在 bintray 中的 AAR 类库不链接到扩展类

java - Gradle 发布构建 - 保留方法参数名称

android - 如何减小 apk 文件的大小?

java - 如何使用按钮更改图像并播放声音?

java - Android Studio 在 generatedJava 文件夹中生成 AIDL java 文件,但包名错误

android - 这是在 Android 中的光标处插入文本的正确方法吗?

android - 如何将 Android 库发布到 Maven 存储库以方便使用?