我在项目中添加了* .aar,当我运行它时项目运行良好,但是启动活动时出现错误,如何解决?

时间:2019-06-02 07:29:29

标签: android aar

aar在项目中运行良好,然后将其转换为库模块,并将其添加到一个简单的项目中以测试其是否正常运行

错误:

  

“ java.lang.NoClassDefFoundError:无法解决以下问题:   Lcom / google / gson / Gson;“

我已经将Gson添加到了aar中,但是在开始活动时(它在aar中)它给了我这个错误

The error

如何解决?

4 个答案:

答案 0 :(得分:1)

使用此依赖项而不是* .aar文件。

实现'com.google.code.gson:gson:2.8.5'

答案 1 :(得分:0)

Tl; dr:可能发生的事情是,您将Gson作为compileOnly依赖项包括在内。改用implementation修复它。

您的模块可以使用多种方法来声明对另一个库模块的依赖。

implementation

  

Gradle将依赖项添加到编译类路径中,并将该依赖项打包到生成输出中。但是,当您的模块配置implementation依赖项时,它会让Gradle知道您不希望该模块在编译时将依赖项泄漏给其他模块。也就是说,该依赖项仅在运行时可用于其他模块。

这意味着您可以从库中引用代码,并且该库打包到您的apk中。 它没有打包在库aar中。它作为传递依赖项存储在元数据中。

如果您有一个通过implementation依赖于Gson的应用程序模块App和库模块Lib,那么Lib可以看到Gson但App无法。 Gson将成为Lib模块的隐藏实现。

api

  

Gradle将依赖项添加到编译类路径并生成输出。当模块包含api依赖项时,它使Gradle知道该模块希望将该依赖项可传递地导出到其他模块,以便它们在运行时和编译时都可用。

implementation相同,除了Gson将公开为Lib的API,因此您可以从App中使用它。

compileOnly

  

Gradle仅将依赖项添加到编译类路径中(也就是说,它不会添加到构建输出中)。当您创建Android模块并且在编译过程中需要依赖项时,这很有用,但是在运行时显示依赖项是可选的。

这意味着您可以从库中引用代码,但是该库打包到您的apk 中。

一个示例是Android SDK。您根据API 28 SDK进行了编译,使用了API,但并未将SDK打包在您的apk中。手机或模拟器中已经装有Android运行时。

了解更多:https://developer.android.com/studio/build/dependencies

答案 2 :(得分:0)

解决方案是在测试项目中添加“实现'com.google.code.gson:gson:2.8.5'”,这解决了我的问题,但我还是不喜欢它;)

答案 3 :(得分:-1)

您还必须将库(aar)的所有依赖项添加到应用程序的build.gradle中。库不包括其依赖项。