未能解决以下问题:Lcom/google/android/gms/location/LocationRequest

未能解决以下问题:Lcom/google/android/gms/location/LocationRequest,android,location,Android,Location,我使用的是 implementation 'com.google.android.gms:play-services-location:15.0.1' 在运行时,我得到以下错误 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/location/LocationRequest; 我正在尝试使用LocationRequest获取lat long,当我在独立项目中使用此代码时,它可以工作。当

我使用的是

implementation 'com.google.android.gms:play-services-location:15.0.1'
在运行时,我得到以下错误

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/location/LocationRequest;
我正在尝试使用LocationRequest获取lat long,当我在独立项目中使用此代码时,它可以工作。当我试图用相同的代码构建一个库时,我会遇到上面的错误


我已经检查过了,独立项目和库项目都有相同的依赖项和版本

这可能是因为两个原因

第一个可能的原因

当您直接使用这个库时,您使用了build.gradle中的
implementation
方法。 因此,您可以直接在简单应用程序模块中使用它

当您将其移动到您的库并使用该位置库时,请使用与位置库只能由您的库使用的
实现
相同的选项。并且不能被应用程序模块使用,您在其中使用了您的库

尝试用
api
替换
实现
位置库

api 'com.google.android.gms:play-services-location:15.0.1'
-keep class com.google.android.gms.location.** { *; }
有关更多详细信息,请参阅本文,了解实现与api的关系-


第二个可能原因

正如您在评论中提到的,这是一个运行时错误

根据我的意见,这可能是因为ProGuard的混淆

添加该类以保持这样的ProGuard规则

api 'com.google.android.gms:play-services-location:15.0.1'
-keep class com.google.android.gms.location.** { *; }

因此,这将停止混淆该位置请求类,代码现在正在进行以下更改(我仍在寻找解释)

在库中,渐变编辑为以下依赖项

compileOnly "com.google.android.gms:play-services-location:15.0.1"
runtimeOnly 'com.google.android.gms:play-services-location:11.6.0'
在应用程序的gradle文件中添加了以下依赖项

compileOnly "com.google.android.gms:play-services-location:15.0.1"
runtimeOnly 'com.google.android.gms:play-services-location:11.6.0'
  • 我的猜测是,由于“compileOnly”负责在库中添加依赖项,“runtimeOnly”负责使用该依赖项,因此代码可以工作并能够找到LocationRequest类

p.S.adityakamble49在帖子中的回答也有帮助。请尝试此操作,因为它可能适用于您的案例。

当您包含库时,此错误是在库编译或应用程序编译中发生的?当我在第三个应用程序中包含我的库时,会发生此错误。这是第三个应用程序中的运行时错误。是否为您的proguard启用了minifyEnabled true
?是的,库代码中的minifyEnabled true。应该为使用库的应用程序执行此操作吗?这可能会导致问题,但正如您所说,您尝试忽略Proguard文件中的该类,但不起作用,因此matterI没有尝试这两种解决方案,仍然会得到相同的运行时错误。在pro guard中添加位置导入的第二个解决方案中,我在库和应用程序本身(正在使用库)中逐个添加导入。。。仍然得到相同的结果。应用程序代码现在正在工作,使用一种非常奇怪的跟踪方法。在应用程序(使用我的库)的渐变中,我将依赖项放在下面:runtimeOnly'com.google.android.gms:play services location:11.6.0',我在不添加pro guard规则的情况下获得正确的输出(我在库中使用“api”而不是“实现”,因为这是一种更好的方法)您添加到应用程序(使用你的库)的依赖项你知道为什么会这样吗?“runtimeOnly”文档没有对我的案例给出任何明确的解释。这是因为应用程序(使用您的库)无法从您的库访问位置库,因为它使用的是
实现的
方法。要么向应用程序添加相同的依赖项,要么将其设置为库中的
api
。也许runtimeCompile使它特别适用于运行时