Android : API 将库合并到应用程序时的键冲突

Android : API key Conflicts when merging a library into app

我在我的 Android 图书馆项目中使用 Google Places.GEO_DATA_API。我的 Android 图书馆项目自带 UI 并允许父应用程序的用户完成特定操作。当像这样使用第三方 API 时,我 运行 关注以下关于将我的 Android SDK 合并到 Android 应用程序的问题。

这些问题假定我的图书馆项目和集成我的图书馆项目的应用程序都使用相同的 API 例如 Google Places.GEO_DATA_API

问题 1: 如果父应用也使用相同的应用,则显示合并冲突 API

根据文档,我应该在应用程序标签下的清单文件中将 API 键指定为

<meta-data
android:name="com.google.android.geo.API_KEY"
android:value=“our_key"/> 

我能够通过将 api 名称和值移动到 build.gradle 文件并在清单文件中引用来解决这个问题

<meta-data android:name="@string/google_api_name"  
 android:value="@string/google_api_key" />                                         

问题 2: 以上修复只是避免了编译时的冲突,但父应用程序仍然可以滥用我的密钥并将其用于他们在应用程序中进行的调用,方法是创建他们自己的 Google API 客户端实例并调用 Places Autocomplete API。我对此进行了测试,并且通话通过了。

我尝试将包名称和指纹添加到 Google API 控制台以限制使用。这在我尝试从父应用程序进行 API 调用时有所帮助,但由于我的库集成在父应用程序中,我假设 Google 认为调用来自父应用程序(包)而不是我的包裹,它会阻止我的图书馆进行的调用。

由于 Google API 客户端生成器不允许将 API 键作为参数传递,唯一的短期解决方案是不使用 API . somoene 可以为这个问题提出解决方案吗?

您不应在库中包含凭据。这应该是父应用程序的责任。如果您保留 <meta-data .../> 标签,那么它将与父应用程序合并。与字符串中的 APK 密钥相同。因此,由于您的库包含字符串 google_api_key,资源合并还将使字符串 google_api_key 可用于父应用程序。

您唯一的解决方案是强制父应用在 AndroidManifest.xml 而不是库的 meta-data 标签中配置 meta-data 标签。